[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