[Erp5-report] r34333 jerome - /erp5/trunk/products/ERP5Type/Tool/ClassTool.py

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Apr 7 18:35:09 CEST 2010


Author: jerome
Date: Wed Apr  7 18:35:08 2010
New Revision: 34333

URL: http://svn.erp5.org?rev=34333&view=rev
Log:
WebDAV interface:
 * use locks from portal_classes itself, because locks from temp objects
   cannot be reused (only visible on zope 2.12)
 * reimport files after edition, in an after commit hook, if after commit
   hooks are available (ie. on zope 2.12 only)

Modified:
    erp5/trunk/products/ERP5Type/Tool/ClassTool.py

Modified: erp5/trunk/products/ERP5Type/Tool/ClassTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Tool/ClassTool.py?rev=34333&r1=34332&r2=34333&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Tool/ClassTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Tool/ClassTool.py [utf8] Wed Apr  7 18:35:08 2010
@@ -35,6 +35,7 @@
 from Products.CMFCore.utils import UniqueObject
 
 import OFS
+import transaction
 from zExceptions import BadRequest
 from zExceptions import Unauthorized
 from Acquisition import Implicit
@@ -66,7 +67,7 @@
 
 import Products
 
-from zLOG import LOG
+from zLOG import LOG, WARNING
 
 """
   ClassTool allows to create classes from the ZMI using code templates.
@@ -179,7 +180,15 @@
         self.size = len(self.data)
 
     def update_data(self, data, content_type=None, size=None):
+      # in OFS.Image.File, all writes are done through this method, so we
+      # replace it by a method that delegates to portal classes
       return self._folder.write(self.getId(), data, create=False)
+
+    def wl_lockmapping(self, killinvalids=0, create=0):
+      # We store web dav locks on portal classes itself
+      return self.aq_parent.aq_parent.wl_lockmapping(
+                      killinvalids=killinvalids,
+                      create=create)
 
   InitializeClass(FileProxy)
 
@@ -189,21 +198,29 @@
     """Proxy to a Folder
     """
     all_meta_types = ()
-    def __init__(self, id, reader, writer, lister, reset_on_write=True):
+    def __init__(self, id, reader, writer, importer, lister):
       self._setId(id)
       self.read = reader
       self.__writer = writer
+      self.__importer = importer
       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()
-
+      current_transaction = transaction.get()
+      if hasattr(current_transaction, 'addAfterCommitHook'):
+        current_transaction.addAfterCommitHook(self.reimport, (class_id, ),)
+      else:
+        LOG('ClassTool', WARNING, 'Transaction does not support '
+             'addAfterCommitHook, code will not be reloaded')
+
+    def reimport(self, status, class_id):
+      if status and self.__importer is not None:
+        self.__importer(class_id)
+      
     def _getOb(self, key, default=_MARKER ):
       if key in self.objectIds():
         return FileProxy(self, key).__of__(self)
@@ -216,13 +233,13 @@
       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}
+      self.write(name, body, create=True)
       return self._getOb(name)
 
-    def _verifyObjectPaste(self, ob, validate_src):
+    def _verifyObjectPaste(self, ob, validate_src=True):
       # we only allow FileProxy (this is used in PUT)
       if not isinstance(ob, FileProxy):
         raise Unauthorized
@@ -246,36 +263,44 @@
         return ('PropertySheet', 'Document', 'Constraint', 'Extensions', 'tests')
 
       def _getOb(self, key, default=_MARKER):
+        from Products.ERP5Type.Utils import importLocalPropertySheet
+        from Products.ERP5Type.Utils import importLocalDocument
+        from Products.ERP5Type.Utils import importLocalConstraint
         if key == 'PropertySheet':
           return FolderProxy('PropertySheet',
                              reader=readLocalPropertySheet,
                              writer=self.writeLocalPropertySheet,
+                             importer=importLocalPropertySheet,
                              lister=getLocalPropertySheetList,
-                             reset_on_write=True).__of__(self)
+                             ).__of__(self)
         if key == 'Document':
           return FolderProxy('Document',
                              reader=readLocalDocument,
                              writer=self.writeLocalDocument,
+                             importer=importLocalDocument,
                              lister=getLocalDocumentList,
-                             reset_on_write=True).__of__(self)
+                             ).__of__(self)
         if key == 'Constraint':
           return FolderProxy('Constraint',
                              reader=readLocalConstraint,
                              writer=self.writeLocalConstraint,
+                             importer=importLocalConstraint,
                              lister=getLocalConstraintList,
-                             reset_on_write=True).__of__(self)
+                             ).__of__(self)
         if key == 'Extensions':
           return FolderProxy('Extensions',
-                              reader=readLocalExtension,
-                              writer=self.writeLocalExtension,
-                              lister=getLocalExtensionList,
-                              reset_on_write=False).__of__(self)
+                             reader=readLocalExtension,
+                             writer=self.writeLocalExtension,
+                             importer=None,
+                             lister=getLocalExtensionList,
+                             ).__of__(self)
         if key == 'tests':
           return FolderProxy('tests',
                              reader=readLocalTest,
                              writer=self.writeLocalTest,
+                             importer=None,
                              lister=getLocalTestList,
-                             reset_on_write=False).__of__(self)
+                             ).__of__(self)
         if default is not _MARKER:
           return default
         raise AttributeError, key




More information about the Erp5-report mailing list