diff --git a/product/ERP5Type/Tool/ClassTool.py b/product/ERP5Type/Tool/ClassTool.py index cb6772654284bf4d094678e875bcc5384bedaed1..c690b4284c1a98c6fce6919deab5fb30ee4c3bd7 100644 --- a/product/ERP5Type/Tool/ClassTool.py +++ b/product/ERP5Type/Tool/ClassTool.py @@ -34,7 +34,9 @@ from pprint import pformat from Products.CMFCore.utils import UniqueObject +import OFS from zExceptions import BadRequest +from zExceptions import Unauthorized from Acquisition import Implicit from AccessControl import ClassSecurityInfo from Products.ERP5Type.Globals import InitializeClass, DTMLFile @@ -46,6 +48,7 @@ from Products.ERP5Type import Permissions from Products.ERP5Type import _dtmldir from Products.ERP5Type.Tool.BaseTool import BaseTool from Products.ERP5Type.Core.Folder import Folder +from Products.ERP5Type.Core.Folder import OFS_HANDLER from Products.ERP5Type import Document from Products.ERP5Type.Utils import readLocalPropertySheet, writeLocalPropertySheet, getLocalPropertySheetList @@ -161,6 +164,71 @@ if allowClassTool(): def _abort(self): shutil.rmtree(self.path, 1) + + class FileProxy(OFS.Image.File): + """Proxy to a file. + """ + # XXX This meta type to make external editor happy + meta_type = 'Script (Python)' + def __init__(self, folder, id, read=True): + self._folder = folder + self._setId(id) + self.content_type = 'text/x-python' + if read: + self.data = self._folder.read(id) + self.size = len(self.data) + + def update_data(self, data, content_type=None, size=None): + return self._folder.write(self.getId(), data, create=False) + + InitializeClass(FileProxy) + + _MARKER = object() + + class FolderProxy(OFS.Folder.Folder): + """Proxy to a Folder + """ + all_meta_types = () + def __init__(self, id, reader, writer, lister, reset_on_write=True): + self._setId(id) + self.read = reader + self.__writer = writer + self.__lister = lister + self.__reset_on_write = reset_on_write + + def objectIds(self, spec=None): + return self.__lister() + + def write(self, class_id, text, create=True): + self.__writer(class_id, text, create=create) + if self.__reset_on_write: + _aq_reset() + + def _getOb(self, key, default=_MARKER ): + if key in self.objectIds(): + return FileProxy(self, key).__of__(self) + # maybe the file has just been uploaded, and is still in the temporary + # instance home, in such case we return an empty file. + if key in getattr(self, '_v_created', {}): + return FileProxy(self, key, read=False).__of__(self) + if default is not _MARKER: + return default + raise AttributeError, key + + def PUT_factory(self, name, typ, body): + self.write(name, body, create=True) + # store the information that this file has just been created, and cannot + # be read yet, because the transaction is not commited. + self._v_created = {name: True} + return self._getOb(name) + + def _verifyObjectPaste(self, ob, validate_src): + # we only allow FileProxy (this is used in PUT) + if not isinstance(ob, FileProxy): + raise Unauthorized + + InitializeClass(FolderProxy) + class ClassTool(BaseTool, ClassToolMixIn): """ This is the full-featured version of ClassTool. @@ -170,6 +238,47 @@ if allowClassTool(): # Declarative Security security = ClassSecurityInfo() + + # we set _folder_handler to OFS_HANDLER to have default behaviour of + # using objectIds and _getOb + _folder_handler = OFS_HANDLER + def objectIds(self, spec=None): + return ('PropertySheet', 'Document', 'Constraint', 'Extensions', 'tests') + + def _getOb(self, key, default=_MARKER): + if key == 'PropertySheet': + return FolderProxy('PropertySheet', + reader=readLocalPropertySheet, + writer=self.writeLocalPropertySheet, + lister=getLocalPropertySheetList, + reset_on_write=True).__of__(self) + if key == 'Document': + return FolderProxy('Document', + reader=readLocalDocument, + writer=self.writeLocalDocument, + lister=getLocalDocumentList, + reset_on_write=True).__of__(self) + if key == 'Constraint': + return FolderProxy('Constraint', + reader=readLocalConstraint, + writer=self.writeLocalConstraint, + lister=getLocalConstraintList, + reset_on_write=True).__of__(self) + if key == 'Extensions': + return FolderProxy('Extensions', + reader=readLocalExtension, + writer=self.writeLocalExtension, + lister=getLocalExtensionList, + reset_on_write=False).__of__(self) + if key == 'tests': + return FolderProxy('tests', + reader=readLocalTest, + writer=self.writeLocalTest, + lister=getLocalTestList, + reset_on_write=False).__of__(self) + if default is not _MARKER: + return default + raise AttributeError, key # # ZMI methods