[Zope-Checkins] SVN: Zope/branches/philikon-zope32-integration/lib/python/ Moved more stuff from Five into Zope itself.

Florent Guillaume fg at nuxeo.com
Wed Nov 2 09:51:27 EST 2005


Log message for revision 39846:
  Moved more stuff from Five into Zope itself.
  Event interfaces are now in OFS.interfaces.
  IFiveObjectClonedEvent has been renamed into IObjectClonedEvent.
  
  

Changed:
  U   Zope/branches/philikon-zope32-integration/lib/python/OFS/CopySupport.py
  U   Zope/branches/philikon-zope32-integration/lib/python/OFS/ObjectManager.py
  U   Zope/branches/philikon-zope32-integration/lib/python/OFS/SimpleItem.py
  A   Zope/branches/philikon-zope32-integration/lib/python/OFS/event.py
  U   Zope/branches/philikon-zope32-integration/lib/python/OFS/interfaces.py
  A   Zope/branches/philikon-zope32-integration/lib/python/OFS/subscribers.py
  U   Zope/branches/philikon-zope32-integration/lib/python/Products/BTreeFolder2/BTreeFolder2.py

-=-
Modified: Zope/branches/philikon-zope32-integration/lib/python/OFS/CopySupport.py
===================================================================
--- Zope/branches/philikon-zope32-integration/lib/python/OFS/CopySupport.py	2005-11-02 14:30:36 UTC (rev 39845)
+++ Zope/branches/philikon-zope32-integration/lib/python/OFS/CopySupport.py	2005-11-02 14:51:27 UTC (rev 39846)
@@ -33,8 +33,9 @@
 from zope.event import notify
 from zope.app.event.objectevent import ObjectCopiedEvent
 from zope.app.container.contained import ObjectMovedEvent
-from Products.Five.event import ObjectWillBeMovedEvent
-from Products.Five.event import FiveObjectClonedEvent
+from OFS.event import ObjectWillBeMovedEvent
+from OFS.event import ObjectClonedEvent
+import OFS.subscribers
 
 from OFS.interfaces import ICopyContainer
 from OFS.interfaces import ICopySource
@@ -160,12 +161,9 @@
         previous call to manage_cutObjects or manage_copyObjects as the first
         argument.
 
-        Also sends IObjectCopiedEvent and IFiveObjectClonedEvent
+        Also sends IObjectCopiedEvent and IObjectClonedEvent
         or IObjectWillBeMovedEvent and IObjectMovedEvent.
         """
-        # Done here to avoid circular imports
-        from Products.Five.subscribers import maybeCallDeprecated
-
         if cb_copy_data is not None:
             cp = cb_copy_data
         elif REQUEST is not None and REQUEST.has_key('__cp'):
@@ -224,9 +222,9 @@
 
                 ob._postCopy(self, op=0)
 
-                maybeCallDeprecated('manage_afterClone', ob)
+                OFS.subscribers.maybeCallDeprecated('manage_afterClone', ob)
 
-                notify(FiveObjectClonedEvent(ob))
+                notify(ObjectClonedEvent(ob))
 
             if REQUEST is not None:
                 return self.manage_main(self, REQUEST, update_menu=1,
@@ -359,9 +357,6 @@
     def manage_clone(self, ob, id, REQUEST=None):
         """Clone an object, creating a new object with the given id.
         """
-        # Done here to avoid circular imports
-        from Products.Five.subscribers import maybeCallDeprecated
-
         if not ob.cb_isCopyable():
             raise CopyError, eNotSupported % escape(ob.getId())
         try:
@@ -393,9 +388,9 @@
 
         ob._postCopy(self, op=0)
 
-        maybeCallDeprecated('manage_afterClone', ob)
+        OFS.subscribers.maybeCallDeprecated('manage_afterClone', ob)
 
-        notify(FiveObjectClonedEvent(ob))
+        notify(ObjectClonedEvent(ob))
 
         return ob
 

Modified: Zope/branches/philikon-zope32-integration/lib/python/OFS/ObjectManager.py
===================================================================
--- Zope/branches/philikon-zope32-integration/lib/python/OFS/ObjectManager.py	2005-11-02 14:30:36 UTC (rev 39845)
+++ Zope/branches/philikon-zope32-integration/lib/python/OFS/ObjectManager.py	2005-11-02 14:51:27 UTC (rev 39846)
@@ -46,8 +46,9 @@
 from zope.event import notify
 from zope.app.container.contained import ObjectAddedEvent
 from zope.app.container.contained import ObjectRemovedEvent
-from Products.Five.event import ObjectWillBeAddedEvent
-from Products.Five.event import ObjectWillBeRemovedEvent
+from OFS.event import ObjectWillBeAddedEvent
+from OFS.event import ObjectWillBeRemovedEvent
+import OFS.subscribers
 
 
 # the name BadRequestException is relied upon by 3rd-party code
@@ -278,9 +279,6 @@
 
         Also sends IObjectWillBeAddedEvent and IObjectAddedEvent.
         """
-        # Done here to avoid circular imports
-        from Products.Five.subscribers import maybeCallDeprecated
-
         ob = object # better name, keep original function signature
         v = self._checkId(id)
         if v is not None:
@@ -317,7 +315,7 @@
         if not suppress_events:
             notify(ObjectAddedEvent(ob, self, id))
 
-        maybeCallDeprecated('manage_afterAdd', ob, self)
+        OFS.subscribers.maybeCallDeprecated('manage_afterAdd', ob, self)
 
         return id
 
@@ -334,7 +332,7 @@
         # 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 IFiveObjectClonedEvent "
+            "Zope 2.11, you should use an IObjectClonedEvent "
             "subscriber instead." % self.__class__.__name__,
             DeprecationWarning, stacklevel=2)
     manage_afterClone.__five_method__ = True
@@ -353,12 +351,9 @@
 
         Also sends IObjectWillBeRemovedEvent and IObjectRemovedEvent.
         """
-        # Done here to avoid circular imports
-        from Products.Five.subscribers import maybeCallDeprecated
-
         ob = self._getOb(id)
 
-        maybeCallDeprecated('manage_beforeDelete', ob, self)
+        OFS.subscribers.maybeCallDeprecated('manage_beforeDelete', ob, self)
 
         if not suppress_events:
             notify(ObjectWillBeRemovedEvent(ob, self, id))

Modified: Zope/branches/philikon-zope32-integration/lib/python/OFS/SimpleItem.py
===================================================================
--- Zope/branches/philikon-zope32-integration/lib/python/OFS/SimpleItem.py	2005-11-02 14:30:36 UTC (rev 39845)
+++ Zope/branches/philikon-zope32-integration/lib/python/OFS/SimpleItem.py	2005-11-02 14:51:27 UTC (rev 39846)
@@ -79,7 +79,7 @@
     def manage_afterClone(self, item):
         warnings.warn(
             "%s.manage_afterClone is deprecated and will be removed in "
-            "Zope 2.11, you should use an IFiveObjectClonedEvent "
+            "Zope 2.11, you should use an IObjectClonedEvent "
             "subscriber instead." % self.__class__.__name__,
             DeprecationWarning, stacklevel=2)
     manage_afterClone.__five_method__ = True

Added: Zope/branches/philikon-zope32-integration/lib/python/OFS/event.py
===================================================================
--- Zope/branches/philikon-zope32-integration/lib/python/OFS/event.py	2005-11-02 14:30:36 UTC (rev 39845)
+++ Zope/branches/philikon-zope32-integration/lib/python/OFS/event.py	2005-11-02 14:51:27 UTC (rev 39846)
@@ -0,0 +1,62 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+OFS event definitions.
+
+$Id$
+"""
+
+from zope.interface import implements
+from zope.app.event.objectevent import ObjectEvent
+import OFS.interfaces
+
+
+class ObjectWillBeMovedEvent(ObjectEvent):
+    """An object will be moved."""
+    implements(OFS.interfaces.IObjectWillBeMovedEvent)
+
+    def __init__(self, object, oldParent, oldName, newParent, newName):
+        ObjectEvent.__init__(self, object)
+        self.oldParent = oldParent
+        self.oldName = oldName
+        self.newParent = newParent
+        self.newName = newName
+
+class ObjectWillBeAddedEvent(ObjectWillBeMovedEvent):
+    """An object will be added to a container."""
+    implements(OFS.interfaces.IObjectWillBeAddedEvent)
+
+    def __init__(self, object, newParent=None, newName=None):
+        #if newParent is None:
+        #    newParent = object.__parent__
+        #if newName is None:
+        #    newName = object.__name__
+        ObjectWillBeMovedEvent.__init__(self, object, None, None,
+                                        newParent, newName)
+
+class ObjectWillBeRemovedEvent(ObjectWillBeMovedEvent):
+    """An object will be removed from a container."""
+    implements(OFS.interfaces.IObjectWillBeRemovedEvent)
+
+    def __init__(self, object, oldParent=None, oldName=None):
+        #if oldParent is None:
+        #    oldParent = object.__parent__
+        #if oldName is None:
+        #    oldName = object.__name__
+        ObjectWillBeMovedEvent.__init__(self, object, oldParent, oldName,
+                                        None, None)
+
+class ObjectClonedEvent(ObjectEvent):
+    """An object has been cloned into a container."""
+    implements(OFS.interfaces.IObjectClonedEvent)


Property changes on: Zope/branches/philikon-zope32-integration/lib/python/OFS/event.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope/branches/philikon-zope32-integration/lib/python/OFS/interfaces.py
===================================================================
--- Zope/branches/philikon-zope32-integration/lib/python/OFS/interfaces.py	2005-11-02 14:30:36 UTC (rev 39845)
+++ Zope/branches/philikon-zope32-integration/lib/python/OFS/interfaces.py	2005-11-02 14:51:27 UTC (rev 39846)
@@ -894,3 +894,33 @@
         """Check the global (zclass) registry for problems, which can
         be caused by things like disk-based products being deleted.
         Return true if a problem is found"""
+
+
+##################################################
+# Event interfaces
+
+from zope.app.event.interfaces import IObjectEvent
+
+class IObjectWillBeMovedEvent(IObjectEvent):
+    """An object will be moved."""
+    oldParent = Attribute("The old location parent for the object.")
+    oldName = Attribute("The old location name for the object.")
+    newParent = Attribute("The new location parent for the object.")
+    newName = Attribute("The new location name for the object.")
+
+class IObjectWillBeAddedEvent(IObjectWillBeMovedEvent):
+    """An object will be added to a container."""
+
+class IObjectWillBeRemovedEvent(IObjectWillBeMovedEvent):
+    """An object will be removed from a container"""
+
+class IObjectClonedEvent(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.
+    """

Added: Zope/branches/philikon-zope32-integration/lib/python/OFS/subscribers.py
===================================================================
--- Zope/branches/philikon-zope32-integration/lib/python/OFS/subscribers.py	2005-11-02 14:30:36 UTC (rev 39845)
+++ Zope/branches/philikon-zope32-integration/lib/python/OFS/subscribers.py	2005-11-02 14:51:27 UTC (rev 39846)
@@ -0,0 +1,159 @@
+##############################################################################
+#
+# Copyright (c) 2005 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+Five subscriber definitions.
+
+$Id$
+"""
+
+import warnings
+import sys
+
+from zLOG import LOG, ERROR
+from App.config import getConfiguration
+from AccessControl import getSecurityManager
+from ZODB.POSException import ConflictError
+import OFS.interfaces
+
+from zope.interface import implements
+from zope.component import adapts
+from zope.app.container.contained import dispatchToSublocations
+from zope.app.location.interfaces import ISublocations
+
+
+deprecatedManageAddDeleteClasses = []
+
+
+def hasDeprecatedMethods(ob):
+    """Do we need to call the deprecated methods?
+    """
+    for class_ in deprecatedManageAddDeleteClasses:
+        if isinstance(ob, class_):
+            return True
+    return False
+
+def maybeCallDeprecated(method_name, ob, *args):
+    """Call a deprecated method, if the framework doesn't call it already.
+    """
+    if hasDeprecatedMethods(ob):
+        # Already deprecated through zcml
+        return
+    method = getattr(ob, method_name)
+    if getattr(method, '__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 ObjectManagerSublocations(object):
+    """Get the sublocations for an ObjectManager.
+    """
+    adapts(OFS.interfaces.IObjectManager)
+    implements(ISublocations)
+
+    def __init__(self, container):
+        self.container = container
+
+    def sublocations(self):
+        for ob in self.container.objectValues():
+            yield ob
+
+# The following subscribers should really be defined in ZCML
+# but we don't have enough control over subscriber ordering for
+# that to work exactly right.
+# (Sometimes IItem comes before IObjectManager, sometimes after,
+# depending on some of Zope's classes.)
+# This code can be simplified when Zope is completely rid of
+# manage_afterAdd & co, then IItem wouldn't be relevant anymore and we
+# could have a simple subscriber for IObjectManager that directly calls
+# dispatchToSublocations.
+
+def dispatchObjectWillBeMovedEvent(ob, event):
+    """Multi-subscriber for IItem + IObjectWillBeMovedEvent.
+    """
+    # First, dispatch to sublocations
+    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)
+
+def dispatchObjectMovedEvent(ob, event):
+    """Multi-subscriber for IItem + IObjectMovedEvent.
+    """
+    # First, do the manage_afterAdd dance
+    if hasDeprecatedMethods(ob):
+        callManageAfterAdd(ob, event)
+    # Next, dispatch to sublocations
+    if OFS.interfaces.IObjectManager.providedBy(ob):
+        dispatchToSublocations(ob, event)
+
+def dispatchObjectClonedEvent(ob, event):
+    """Multi-subscriber for IItem + IObjectClonedEvent.
+    """
+    # First, do the manage_afterClone dance
+    if hasDeprecatedMethods(ob):
+        callManageAfterClone(ob, event)
+    # Next, dispatch to sublocations
+    if OFS.interfaces.IObjectManager.providedBy(ob):
+        dispatchToSublocations(ob, event)
+
+
+def callManageAfterAdd(ob, event):
+    """Compatibility subscriber for manage_afterAdd.
+    """
+    container = event.newParent
+    if container is None:
+        # this is a remove
+        return
+    ob.manage_afterAdd(event.object, container)
+
+def callManageBeforeDelete(ob, event):
+    """Compatibility subscriber for manage_beforeDelete.
+    """
+    import OFS.ObjectManager # avoid circular imports
+    container = event.oldParent
+    if container is None:
+        # this is an add
+        return
+    try:
+        ob.manage_beforeDelete(event.object, container)
+    except OFS.ObjectManager.BeforeDeleteException:
+        raise
+    except ConflictError:
+        raise
+    except:
+        LOG('Zope', ERROR, '_delObject() threw', error=sys.exc_info())
+        # In debug mode when non-Manager, let exceptions propagate.
+        if getConfiguration().debug_mode:
+            if not getSecurityManager().getUser().has_role('Manager'):
+                raise
+
+def callManageAfterClone(ob, event):
+    """Compatibility subscriber for manage_afterClone.
+    """
+    ob.manage_afterClone(event.object)


Property changes on: Zope/branches/philikon-zope32-integration/lib/python/OFS/subscribers.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope/branches/philikon-zope32-integration/lib/python/Products/BTreeFolder2/BTreeFolder2.py
===================================================================
--- Zope/branches/philikon-zope32-integration/lib/python/Products/BTreeFolder2/BTreeFolder2.py	2005-11-02 14:30:36 UTC (rev 39845)
+++ Zope/branches/philikon-zope32-integration/lib/python/Products/BTreeFolder2/BTreeFolder2.py	2005-11-02 14:51:27 UTC (rev 39846)
@@ -40,8 +40,9 @@
 from zope.event import notify
 from zope.app.container.contained import ObjectAddedEvent
 from zope.app.container.contained import ObjectRemovedEvent
-from Products.Five.event import ObjectWillBeAddedEvent
-from Products.Five.event import ObjectWillBeRemovedEvent
+from OFS.event import ObjectWillBeAddedEvent
+from OFS.event import ObjectWillBeRemovedEvent
+import OFS.subscribers
 
 
 manage_addBTreeFolderForm = DTMLFile('folderAdd', globals())
@@ -411,9 +412,6 @@
 
     def _setObject(self, id, object, roles=None, user=None, set_owner=1,
                    suppress_events=False):
-        # Done here to avoid circular imports
-        from Products.Five.subscribers import maybeCallDeprecated
-
         ob = object # better name, keep original function signature
         v = self._checkId(id)
         if v is not None:
@@ -446,18 +444,15 @@
         if not suppress_events:
             notify(ObjectAddedEvent(ob, self, id))
 
-        maybeCallDeprecated('manage_afterAdd', ob, self)
+        OFS.subscribers.maybeCallDeprecated('manage_afterAdd', ob, self)
 
         return id
 
 
     def _delObject(self, id, dp=1, suppress_events=False):
-        # Done here to avoid circular imports
-        from Products.Five.subscribers import maybeCallDeprecated
-
         ob = self._getOb(id)
 
-        maybeCallDeprecated('manage_beforeDelete', ob, self)
+        OFS.subscribers.maybeCallDeprecated('manage_beforeDelete', ob, self)
 
         if not suppress_events:
             notify(ObjectWillBeRemovedEvent(ob, self, id))



More information about the Zope-Checkins mailing list