Log message for revision 40023: To be used with Five efge-1.3-event-work branch. Changed deprecation strategy a bit, for maximum compatibility. This fixes a bug, seen in the expanded tests in Five/tests/event.txt, about "compatibility" recursion for old classes.
Changed: U Zope/branches/efge-five-events-work/lib/python/OFS/CopySupport.py U Zope/branches/efge-five-events-work/lib/python/OFS/ObjectManager.py U Zope/branches/efge-five-events-work/lib/python/OFS/SimpleItem.py U Zope/branches/efge-five-events-work/lib/python/OFS/subscribers.py U Zope/branches/efge-five-events-work/lib/python/Products/BTreeFolder2/BTreeFolder2.py -=- Modified: Zope/branches/efge-five-events-work/lib/python/OFS/CopySupport.py =================================================================== --- Zope/branches/efge-five-events-work/lib/python/OFS/CopySupport.py 2005-11-10 11:40:37 UTC (rev 40022) +++ Zope/branches/efge-five-events-work/lib/python/OFS/CopySupport.py 2005-11-10 13:06:53 UTC (rev 40023) @@ -222,7 +222,7 @@ ob._postCopy(self, op=0) - OFS.subscribers.maybeCallDeprecated('manage_afterClone', ob) + OFS.subscribers.compatibilityCall('manage_afterClone', ob, ob) notify(ObjectClonedEvent(ob)) @@ -388,7 +388,7 @@ ob._postCopy(self, op=0) - OFS.subscribers.maybeCallDeprecated('manage_afterClone', ob) + OFS.subscribers.compatibilityCall('manage_afterClone', ob, ob) notify(ObjectClonedEvent(ob)) Modified: Zope/branches/efge-five-events-work/lib/python/OFS/ObjectManager.py =================================================================== --- Zope/branches/efge-five-events-work/lib/python/OFS/ObjectManager.py 2005-11-10 11:40:37 UTC (rev 40022) +++ Zope/branches/efge-five-events-work/lib/python/OFS/ObjectManager.py 2005-11-10 13:06:53 UTC (rev 40023) @@ -50,7 +50,6 @@ from OFS.event import ObjectWillBeRemovedEvent import OFS.subscribers - # the name BadRequestException is relied upon by 3rd-party code BadRequestException = BadRequest @@ -315,35 +314,23 @@ if not suppress_events: notify(ObjectAddedEvent(ob, self, id)) - OFS.subscribers.maybeCallDeprecated('manage_afterAdd', ob, self) + OFS.subscribers.compatibilityCall('manage_afterAdd', ob, ob, self) return id def manage_afterAdd(self, item, container): # Don't do recursion anymore, a subscriber does that. - warnings.warn( - "%s.manage_afterAdd is deprecated and will be removed in " - "Zope 2.11, you should use an IObjectAddedEvent " - "subscriber instead." % self.__class__.__name__, - DeprecationWarning, stacklevel=2) + pass manage_afterAdd.__five_method__ = True def manage_afterClone(self, item): # Don't do recursion anymore, a subscriber does that. - warnings.warn( - "%s.manage_afterClone is deprecated and will be removed in " - "Zope 2.11, you should use an IObjectClonedEvent " - "subscriber instead." % self.__class__.__name__, - DeprecationWarning, stacklevel=2) + pass manage_afterClone.__five_method__ = True def manage_beforeDelete(self, item, container): # Don't do recursion anymore, a subscriber does that. - warnings.warn( - "%s.manage_beforeDelete is deprecated and will be removed in " - "Zope 2.11, you should use an IObjectWillBeRemovedEvent " - "subscriber instead." % self.__class__.__name__, - DeprecationWarning, stacklevel=2) + pass manage_beforeDelete.__five_method__ = True def _delObject(self, id, dp=1, suppress_events=False): @@ -353,7 +340,7 @@ """ ob = self._getOb(id) - OFS.subscribers.maybeCallDeprecated('manage_beforeDelete', ob, self) + OFS.subscribers.compatibilityCall('manage_beforeDelete', ob, ob, self) if not suppress_events: notify(ObjectWillBeRemovedEvent(ob, self, id)) Modified: Zope/branches/efge-five-events-work/lib/python/OFS/SimpleItem.py =================================================================== --- Zope/branches/efge-five-events-work/lib/python/OFS/SimpleItem.py 2005-11-10 11:40:37 UTC (rev 40022) +++ Zope/branches/efge-five-events-work/lib/python/OFS/SimpleItem.py 2005-11-10 13:06:53 UTC (rev 40023) @@ -61,27 +61,15 @@ isTopLevelPrincipiaApplicationObject=0 def manage_afterAdd(self, item, container): - warnings.warn( - "%s.manage_afterAdd is deprecated and will be removed in " - "Zope 2.11, you should use an IObjectAddedEvent " - "subscriber instead." % self.__class__.__name__, - DeprecationWarning, stacklevel=2) + pass manage_afterAdd.__five_method__ = True def manage_beforeDelete(self, item, container): - warnings.warn( - "%s.manage_beforeDelete is deprecated and will be removed in " - "Zope 2.11, you should use an IObjectWillBeRemovedEvent " - "subscriber instead." % self.__class__.__name__, - DeprecationWarning, stacklevel=2) + pass manage_beforeDelete.__five_method__ = True def manage_afterClone(self, item): - warnings.warn( - "%s.manage_afterClone is deprecated and will be removed in " - "Zope 2.11, you should use an IObjectClonedEvent " - "subscriber instead." % self.__class__.__name__, - DeprecationWarning, stacklevel=2) + pass manage_afterClone.__five_method__ = True # Direct use of the 'id' attribute is deprecated - use getId() Modified: Zope/branches/efge-five-events-work/lib/python/OFS/subscribers.py =================================================================== --- Zope/branches/efge-five-events-work/lib/python/OFS/subscribers.py 2005-11-10 11:40:37 UTC (rev 40022) +++ Zope/branches/efge-five-events-work/lib/python/OFS/subscribers.py 2005-11-10 13:06:53 UTC (rev 40023) @@ -21,6 +21,7 @@ import sys from zLOG import LOG, ERROR +from Acquisition import aq_base from App.config import getConfiguration from AccessControl import getSecurityManager from ZODB.POSException import ConflictError @@ -35,36 +36,42 @@ deprecatedManageAddDeleteClasses = [] -def hasDeprecatedMethods(ob): - """Do we need to call the deprecated methods? +def compatibilityCall(method_name, *args): + """Call a method if events have not been setup yet. + + This is the case for some unit tests that have not been converted to + use the component architecture. """ - for class_ in deprecatedManageAddDeleteClasses: - if isinstance(ob, class_): - return True - return False + if deprecatedManageAddDeleteClasses: + # Events initialized, don't do compatibility call + return + if method_name == 'manage_afterAdd': + callManageAfterAdd(*args) + elif method_name == 'manage_beforeDelete': + callManageBeforeDelete(*args) + else: + callManageAfterClone(*args) -def maybeCallDeprecated(method_name, ob, *args): - """Call a deprecated method, if the framework doesn't call it already. +def maybeWarnDeprecated(ob, method_name): + """Send a warning if a method is deprecated. """ - if hasDeprecatedMethods(ob): - # Already deprecated through zcml + if not deprecatedManageAddDeleteClasses: + # Directives not fully loaded return - method = getattr(ob, method_name) - if getattr(method, '__five_method__', False): + for cls in deprecatedManageAddDeleteClasses: + if isinstance(ob, cls): + # Already deprecated through zcml + return + if getattr(getattr(ob, method_name), '__five_method__', False): # Method knows it's deprecated return - if deprecatedManageAddDeleteClasses: - # Not deprecated through zcml and directives fully loaded - class_ = ob.__class__ - warnings.warn( - "Calling %s.%s.%s is deprecated when using Five, " - "instead use event subscribers or " - "mark the class with <five:deprecatedManageAddDelete/>" - % (class_.__module__, class_.__name__, method_name), - DeprecationWarning) - # Note that calling the method can lead to incorrect behavior - # but in the most common case that's better than not calling it. - method(ob, *args) + class_ = ob.__class__ + warnings.warn( + "%s.%s.%s is deprecated and will be removed in Zope 2.11, " + "you should use event subscribers instead, and meanwhile " + "mark the class with <five:deprecatedManageAddDelete/>" + % (class_.__module__, class_.__name__, method_name), + DeprecationWarning) ################################################## @@ -98,16 +105,13 @@ if OFS.interfaces.IObjectManager.providedBy(ob): dispatchToSublocations(ob, event) # Next, do the manage_beforeDelete dance - #import pdb; pdb.set_trace() - if hasDeprecatedMethods(ob): - callManageBeforeDelete(ob, event) + callManageBeforeDelete(ob, event.object, event.oldParent) def dispatchObjectMovedEvent(ob, event): """Multi-subscriber for IItem + IObjectMovedEvent. """ # First, do the manage_afterAdd dance - if hasDeprecatedMethods(ob): - callManageAfterAdd(ob, event) + callManageAfterAdd(ob, event.object, event.newParent) # Next, dispatch to sublocations if OFS.interfaces.IObjectManager.providedBy(ob): dispatchToSublocations(ob, event) @@ -116,32 +120,33 @@ """Multi-subscriber for IItem + IObjectClonedEvent. """ # First, do the manage_afterClone dance - if hasDeprecatedMethods(ob): - callManageAfterClone(ob, event) + callManageAfterClone(ob, event.object) # Next, dispatch to sublocations if OFS.interfaces.IObjectManager.providedBy(ob): dispatchToSublocations(ob, event) -def callManageAfterAdd(ob, event): +def callManageAfterAdd(ob, item, container): """Compatibility subscriber for manage_afterAdd. """ - container = event.newParent if container is None: - # this is a remove return - ob.manage_afterAdd(event.object, container) + if getattr(aq_base(ob), 'manage_afterAdd', None) is None: + return + maybeWarnDeprecated(ob, 'manage_afterAdd') + ob.manage_afterAdd(item, container) -def callManageBeforeDelete(ob, event): +def callManageBeforeDelete(ob, item, container): """Compatibility subscriber for manage_beforeDelete. """ - import OFS.ObjectManager # avoid circular imports - container = event.oldParent + if getattr(aq_base(ob), 'manage_beforeDelete', None) is None: + return if container is None: - # this is an add return + import OFS.ObjectManager # avoid circular imports + maybeWarnDeprecated(ob, 'manage_beforeDelete') try: - ob.manage_beforeDelete(event.object, container) + ob.manage_beforeDelete(item, container) except OFS.ObjectManager.BeforeDeleteException: raise except ConflictError: @@ -153,7 +158,10 @@ if not getSecurityManager().getUser().has_role('Manager'): raise -def callManageAfterClone(ob, event): +def callManageAfterClone(ob, item): """Compatibility subscriber for manage_afterClone. """ - ob.manage_afterClone(event.object) + if getattr(aq_base(ob), 'manage_afterClone', None) is None: + return + maybeWarnDeprecated(ob, 'manage_afterClone') + ob.manage_afterClone(item) Modified: Zope/branches/efge-five-events-work/lib/python/Products/BTreeFolder2/BTreeFolder2.py =================================================================== --- Zope/branches/efge-five-events-work/lib/python/Products/BTreeFolder2/BTreeFolder2.py 2005-11-10 11:40:37 UTC (rev 40022) +++ Zope/branches/efge-five-events-work/lib/python/Products/BTreeFolder2/BTreeFolder2.py 2005-11-10 13:06:53 UTC (rev 40023) @@ -444,7 +444,7 @@ if not suppress_events: notify(ObjectAddedEvent(ob, self, id)) - OFS.subscribers.maybeCallDeprecated('manage_afterAdd', ob, self) + OFS.subscribers.compatibilityCall('manage_afterAdd', ob, ob, self) return id @@ -452,7 +452,7 @@ def _delObject(self, id, dp=1, suppress_events=False): ob = self._getOb(id) - OFS.subscribers.maybeCallDeprecated('manage_beforeDelete', ob, self) + OFS.subscribers.compatibilityCall('manage_beforeDelete', ob, ob, self) if not suppress_events: notify(ObjectWillBeRemovedEvent(ob, self, id)) _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins