[z3-checkins] r18954 - in z3/Five/branch/efge-object-event: . tests

efge at codespeak.net efge at codespeak.net
Tue Oct 25 18:13:01 CEST 2005


Author: efge
Date: Tue Oct 25 18:13:01 2005
New Revision: 18954

Modified:
   z3/Five/branch/efge-object-event/event.py
   z3/Five/branch/efge-object-event/event.zcml
   z3/Five/branch/efge-object-event/tests/event.txt
Log:
manage_afterClone is now properly called.

Modified: z3/Five/branch/efge-object-event/event.py
==============================================================================
--- z3/Five/branch/efge-object-event/event.py	(original)
+++ z3/Five/branch/efge-object-event/event.py	Tue Oct 25 18:13:01 2005
@@ -51,6 +51,17 @@
 class IObjectWillBeRemovedEvent(IObjectWillBeMovedEvent):
     """An object will be removed from a container"""
 
+class IFiveObjectClonedEvent(IObjectEvent):
+    """An object has been cloned (a la Zope 2).
+
+    This is for Zope 2 compatibility, subscribers should really use
+    IObjectCopiedEvent or IObjectAddedEvent, depending on their use
+    cases.
+
+    event.object is the copied object, already added to its container.
+    Note that this event is dispatched to all sublocations.
+    """
+
 
 class ObjectWillBeMovedEvent(ObjectEvent):
     """An object will be moved"""
@@ -87,6 +98,9 @@
         ObjectWillBeMovedEvent.__init__(self, object, oldParent, oldName,
                                         None, None)
 
+class FiveObjectClonedEvent(ObjectEvent):
+    implements(IFiveObjectClonedEvent)
+
 
 ##################################################
 
@@ -112,8 +126,8 @@
 deprecatedManageAddDeleteClasses = []
 
 
-def callOldMethods(ob):
-    """Check if we need to call the old methods.
+def hasDeprecatedMethods(ob):
+    """Do we need to call the deprecated methods?
     """
     if containerEventsTransitional:
         for class_ in containerEventAwareClasses:
@@ -145,41 +159,38 @@
         for ob in self.container.objectValues():
             yield ob
 
-
 def callManageAfterAdd(ob, event):
     """Compatibility subscriber for manage_afterAdd.
     """
-    if not callOldMethods(ob):
+    if not hasDeprecatedMethods(ob):
         return
     container = event.newParent
     if container is None:
         return
-    item = event.object
     if not isFiveMethod(ob.manage_afterAdd):
         warnings.warn(
             "Calling %s.manage_afterAdd is deprecated when using Five, "
             "use an IObjectAddedEvent subscriber instead."
             % ob.__class__.__name__,
             DeprecationWarning)
+    item = event.object
     ob.manage_afterAdd(item, container)
 
-
 def callManageBeforeDelete(ob, event):
     """Compatibility subscriber for manage_beforeDelete.
     """
-    if not callOldMethods(ob):
+    if not hasDeprecatedMethods(ob):
         return
     container = event.oldParent
     if container is None:
         return
-    item = event.object
     if not isFiveMethod(ob.manage_beforeDelete):
         warnings.warn(
-            "Calling %s.manage_beforeDelete is deprecated "
-            "when using Five, "
+            "Calling %s.manage_beforeDelete is deprecated when using Five, "
             "use an IObjectWillBeRemovedEvent subscriber instead."
             % ob.__class__.__name__,
             DeprecationWarning)
+    item = event.object
     try:
         ob.manage_beforeDelete(item, container)
     except BeforeDeleteException:
@@ -196,22 +207,17 @@
 def callManageAfterClone(ob, event):
     """Compatibility subscriber for manage_afterClone.
     """
-    if not callOldMethods(ob):
-        return
-    container = event.newParent
-    if container is None:
+    if not hasDeprecatedMethods(ob):
         return
-    item = event.object
-    if not isFiveMethod(ob.manage_afterAdd):
+    if not isFiveMethod(ob.manage_afterClone):
         warnings.warn(
-            "Calling %s.manage_afterAdd is deprecated when using Five, "
-            "use an IObjectAddedEvent subscriber instead."
+            "Calling %s.manage_afterClone is deprecated when using Five, "
+            "use an IFiveObjectClonedEvent subscriber instead, or "
+            "better, an IObjectCopiedEvent or IObjectAddedEvent subscriber."
             % ob.__class__.__name__,
             DeprecationWarning)
-    ob.manage_afterAdd(item, container)
-
-
-
+    item = event.object
+    ob.manage_afterClone(item)
 
 ##################################################
 # Monkey patches
@@ -405,7 +411,7 @@
         raise CopyError, eNotSupported % escape(id)
     self._verifyObjectPaste(ob)
 
-    if callOldMethods(ob):
+    if hasDeprecatedMethods(ob):
         # BBB
         if not isFiveMethod(ob._notifyOfCopyTo):
             warnings.warn(
@@ -434,7 +440,7 @@
 
     notify(ObjectMovedEvent(ob, self, id, self, new_id))
 
-    if callOldMethods(ob):
+    if hasDeprecatedMethods(ob):
         # BBB
         if not isFiveMethod(ob._postCopy):
             warnings.warn(
@@ -495,7 +501,7 @@
                 raise CopyError, eNotSupported % escape(orig_id)
 
             try:
-                if callOldMethods(ob):
+                if hasDeprecatedMethods(ob):
                     # BBB
                     if not isFiveMethod(ob._notifyOfCopyTo):
                         warnings.warn(
@@ -524,7 +530,7 @@
             ob = self._getOb(id)
             ob.wl_clearLocks()
 
-            if callOldMethods(ob):
+            if hasDeprecatedMethods(ob):
                 # BBB
                 if not isFiveMethod(ob._postCopy):
                     warnings.warn(
@@ -534,14 +540,8 @@
                         % ob.__class__.__name__,
                         DeprecationWarning, stacklevel=2)
                 ob._postCopy(self, op=0)
-                if not isFiveMethod(ob.manage_afterClone):
-                    warnings.warn(
-                        "Calling %s.manage_afterClone is deprecated "
-                        "when using Five, "
-                        "use an IObjectCopiedEvent subscriber instead."
-                        % self.__class__.__name__,
-                        DeprecationWarning, stacklevel=2)
-                ob.manage_afterClone(ob)
+
+            notify(FiveObjectClonedEvent(ob))
 
         if REQUEST is not None:
             return self.manage_main(self, REQUEST, update_menu=1,
@@ -555,7 +555,7 @@
                 raise CopyError, eNotSupported % escape(orig_id)
 
             try:
-                if callOldMethods(ob):
+                if hasDeprecatedMethods(ob):
                     # BBB
                     if not isFiveMethod(ob._notifyOfCopyTo):
                         warnings.warn(
@@ -599,7 +599,7 @@
             notify(ObjectMovedEvent(ob, orig_container, orig_id,
                                     self, id))
 
-            if callOldMethods(ob):
+            if hasDeprecatedMethods(ob):
                 # BBB
                 if not isFiveMethod(ob._postCopy):
                     warnings.warn(
@@ -639,7 +639,7 @@
 
     self._verifyObjectPaste(ob)
 
-    if callOldMethods(ob):
+    if hasDeprecatedMethods(ob):
         # BBB
         if not isFiveMethod(ob._notifyOfCopyTo):
             warnings.warn(
@@ -662,7 +662,7 @@
     self._setObject(id, ob)
     ob = self._getOb(id)
 
-    if callOldMethods(ob):
+    if hasDeprecatedMethods(ob):
         # BBB
         if not isFiveMethod(ob._postCopy):
             warnings.warn(
@@ -671,13 +671,8 @@
                 % ob.__class__.__name__,
                 DeprecationWarning, stacklevel=2)
         ob._postCopy(self, op=0)
-        if not isFiveMethod(ob.manage_afterClone):
-            warnings.warn(
-                "Calling %s.manage_afterClone is deprecated when using Five, "
-                "use an IObjectCopiedEvent subscriber instead."
-                % self.__class__.__name__,
-                DeprecationWarning, stacklevel=2)
-        ob.manage_afterClone(ob)
+
+    notify(FiveObjectClonedEvent(ob))
 
     return ob
 

Modified: z3/Five/branch/efge-object-event/event.zcml
==============================================================================
--- z3/Five/branch/efge-object-event/event.zcml	(original)
+++ z3/Five/branch/efge-object-event/event.zcml	Tue Oct 25 18:13:01 2005
@@ -14,9 +14,8 @@
   <subscriber
       for="OFS.interfaces.IObjectManager
            .event.IObjectWillBeMovedEvent"
-      factory="zope.app.container.contained.dispatchToSublocations">
-      Handler dispatches moved events to sublocations of any ObjectManager.
-  </subscriber>
+      factory="zope.app.container.contained.dispatchToSublocations"
+      />
 
   <!-- manage_beforeDelete compatibility -->
 
@@ -52,11 +51,31 @@
   <subscriber
       for="OFS.interfaces.IObjectManager
            zope.app.container.interfaces.IObjectMovedEvent"
-      factory="zope.app.container.contained.dispatchToSublocations">
-      Handler dispatches moved events to sublocations of any ObjectManager.
-  </subscriber>
+      factory="zope.app.container.contained.dispatchToSublocations"
+      />
+
+  <!-- manage_afterClone compatibility -->
+
+  <subscriber
+      for="OFS.interfaces.ISimpleItem
+           .event.IFiveObjectClonedEvent"
+      factory=".event.callManageAfterClone"
+      />
+
+  <subscriber
+      for="OFS.interfaces.IObjectManager
+           .event.IFiveObjectClonedEvent"
+      factory=".event.callManageAfterClone"
+      />
+
+  <!-- dispatch IFiveObjectClonedEvent to sublocations after
+       compatibility calls, to have "top-down" semantics -->
 
-  <!-- XXX dispatcher for manage_afterClone -->
+  <subscriber
+      for="OFS.interfaces.IObjectManager
+           .event.IFiveObjectClonedEvent"
+      factory="zope.app.container.contained.dispatchToSublocations"
+      />
 
   <!-- XXX subscriber (not multi) for _notifOfCopyTo and _postCopy -->
 

Modified: z3/Five/branch/efge-object-event/tests/event.txt
==============================================================================
--- z3/Five/branch/efge-object-event/tests/event.txt	(original)
+++ z3/Five/branch/efge-object-event/tests/event.txt	Tue Oct 25 18:13:01 2005
@@ -108,21 +108,25 @@
   >>> from zope.app.event.interfaces import IObjectEvent
   >>> from zope.app.container.interfaces import IObjectMovedEvent
   >>> from Products.Five.event import IObjectWillBeMovedEvent
+  >>> from Products.Five.event import IFiveObjectClonedEvent
   >>> from OFS.interfaces import IObjectManager
   >>> from OFS.interfaces import ISimpleItem
   >>> from zope.app.tests import ztapi
   >>> def printObjectEvent(object, event):
   ...     print event.__class__.__name__, object.getId()
-  >>> def printObjectEventExceptMoved(object, event):
+  >>> def printObjectEventExceptSome(object, event):
   ...     if (IObjectMovedEvent.providedBy(event) or
-  ...         IObjectWillBeMovedEvent.providedBy(event)):
+  ...         IObjectWillBeMovedEvent.providedBy(event) or
+  ...         IFiveObjectClonedEvent.providedBy(event)):
   ...         return
   ...     print event.__class__.__name__, object.getId()
   >>> ztapi.handle([IObjectManager, IObjectMovedEvent], printObjectEvent)
   >>> ztapi.handle([ISimpleItem, IObjectMovedEvent], printObjectEvent)
   >>> ztapi.handle([IObjectManager, IObjectWillBeMovedEvent], printObjectEvent)
   >>> ztapi.handle([ISimpleItem, IObjectWillBeMovedEvent], printObjectEvent)
-  >>> ztapi.handle([None, IObjectEvent], printObjectEventExceptMoved)
+  >>> ztapi.handle([IObjectManager, IFiveObjectClonedEvent], printObjectEvent)
+  >>> ztapi.handle([ISimpleItem, IFiveObjectClonedEvent], printObjectEvent)
+  >>> ztapi.handle([None, IObjectEvent], printObjectEventExceptSome)
 
 Phase 1
 -------
@@ -150,8 +154,6 @@
   old manage_afterAdd tintin tintin folder
   old _postCopy tintin folder 1
   [{'new_id': 'tintin', 'id': 'tintin'}]
-  >>> 'tintin' in folder.objectIds()
-  True
 
 And we can copy them.
 
@@ -162,10 +164,6 @@
   old _postCopy copy_of_tintin folder 0
   old manage_afterClone copy_of_tintin copy_of_tintin
   [{'new_id': 'copy_of_tintin', 'id': 'tintin'}]
-  >>> 'tintin' in folder.objectIds()
-  True
-  >>> 'copy_of_tintin' in folder.objectIds()
-  True
 
 We can rename objects:
 
@@ -174,10 +172,6 @@
   old manage_beforeDelete copy_of_tintin copy_of_tintin folder
   old manage_afterAdd haddock haddock folder
   old _postCopy haddock folder 1
-  >>> 'copy_of_tintin' in folder.objectIds()
-  False
-  >>> 'haddock' in folder.objectIds()
-  True
 
 We can also call manage_clone by hand:
 
@@ -188,8 +182,6 @@
   old manage_afterClone tournesol tournesol
   >>> res.getId()
   'tournesol'
-  >>> 'tournesol' in folder.objectIds()
-  True
 
 Let's also test with a BTreeFolder:
 
@@ -213,7 +205,8 @@
   old manage_afterAdd riri riri subfolder
   'riri'
 
-Renaming a tree of objects:
+Renaming a tree of objects. Note that manage_beforeDelete is called
+bottom-up.
 
   >>> folder.manage_renameObject('subfolder', 'bob')
   old _notifyOfCopyTo subfolder folder 1
@@ -309,6 +302,7 @@
   ObjectAddedEvent copy_of_blueberry
   old manage_afterAdd copy_of_blueberry copy_of_blueberry folder
   old _postCopy copy_of_blueberry folder 0
+  FiveObjectClonedEvent copy_of_blueberry
   old manage_afterClone copy_of_blueberry copy_of_blueberry
   [{'new_id': 'copy_of_blueberry', 'id': 'blueberry'}]
   >>> 'blueberry' in folder.objectIds()
@@ -339,6 +333,7 @@
   ObjectAddedEvent strawberry
   old manage_afterAdd strawberry strawberry folder
   old _postCopy strawberry folder 0
+  FiveObjectClonedEvent strawberry
   old manage_afterClone strawberry strawberry
   >>> res.getId()
   'strawberry'
@@ -375,7 +370,8 @@
   old manage_afterAdd donald donald subfolder
   'donald'
 
-Renaming a tree of objects.
+Renaming a tree of objects. Note that manage_beforeDelete is called
+bottom-up.
 
   >>> folder.manage_renameObject('subfolder', 'pluto')
   old _notifyOfCopyTo subfolder folder 1
@@ -403,7 +399,10 @@
   ObjectAddedEvent donald
   old manage_afterAdd donald mickey folder
   old _postCopy mickey folder 0
+  FiveObjectClonedEvent mickey
   old manage_afterClone mickey mickey
+  FiveObjectClonedEvent donald
+  old manage_afterClone donald mickey
   >>> res.getId()
   'mickey'
   >>> 'pluto' in folder.objectIds()
@@ -411,8 +410,6 @@
   >>> 'mickey' in folder.objectIds()
   True
 
-XXX there should be more calls to manage_afterClone above
-
 If however we specify using ZCML that our classes can react to events,
 the framework won't call manage_afterAdd and manage_beforeDelete
 anymore.
@@ -452,6 +449,7 @@
   ObjectCopiedEvent copy_of_dilbert
   ObjectWillBeAddedEvent copy_of_dilbert
   ObjectAddedEvent copy_of_dilbert
+  FiveObjectClonedEvent copy_of_dilbert
   [{'new_id': 'copy_of_dilbert', 'id': 'dilbert'}]
   >>> 'dilbert' in folder.objectIds()
   True
@@ -472,6 +470,7 @@
   ObjectCopiedEvent phb
   ObjectWillBeAddedEvent phb
   ObjectAddedEvent phb
+  FiveObjectClonedEvent phb
   >>> res.getId()
   'phb'
   >>> 'dilbert' in folder.objectIds()
@@ -525,6 +524,8 @@
   ObjectWillBeAddedEvent mel
   ObjectAddedEvent serenity
   ObjectAddedEvent mel
+  FiveObjectClonedEvent serenity
+  FiveObjectClonedEvent mel
   >>> res.getId()
   'serenity'
   >>> 'firefly' in folder.objectIds()


More information about the z3-checkins mailing list