[CMF-checkins] CVS: CMF/CMFCore - CMFCatalogAware.py:1.9 PortalContent.py:1.35

Tres Seaver tseaver@zope.com
19 Jul 2002 14:02:07 -0400


Hmmm, if you want OMs to be discussable, then you need to propagate
afterAdd and beforeDelete to both 'objectValues' and 'opaqueValues';
otherwise, "real" items won't do the Right Thing (TM).


On Fri, 2002-07-19 at 13:50, Florent Guillaume wrote:
> Update of /cvs-repository/CMF/CMFCore
> In directory cvs.zope.org:/tmp/cvs-serv8774/CMFCore
> 
> Modified Files:
> 	CMFCatalogAware.py PortalContent.py 
> Log Message:
> Deal with the presence of opaque subitems (subitems that are not stored
> using standard ObjectManager interface, typically talkbacks) in
> PortalContent using opaqueItems/opaqueIds/opaqueValues instead of
> objectValues & co.
> 
> Using objectValues for that purpose was wrong because:
> 
>  - It's not really an ObjectManager.
> 
>  - We'd like to have ObjectManagers that are also discussable.
> 
> 
> === CMF/CMFCore/CMFCatalogAware.py 1.8 => 1.9 ===
>          #
>          if aq_base(container) is not aq_base(self):
>              self.indexObject()
> -            #
> -            #   Now let our "aspects" know we were added or moved.
> -            #   For instance, talkbacks.
> -            #
> -            for item_id, subitem in self.objectItems():
> -                if hasattr(aq_base(subitem), 'manage_afterAdd'):
> -                    subitem.manage_afterAdd(item, container)
> +            # Recurse in opaque subitems (talkbacks for instance).
> +            if hasattr(aq_base(self), 'opaqueValues'):
> +                for subitem in self.opaqueValues():
> +                    if hasattr(aq_base(subitem), 'manage_afterAdd'):
> +                        subitem.manage_afterAdd(item, container)
>  
>      def manage_afterClone(self, item):
>          """
>              Add self to workflow, as we have just been cloned.
>          """
>          self.notifyWorkflowCreated()
> -        #
> -        #   Now let our "aspects" know we have been cloned.
> -        #   For instance, talkbacks.
> -        #
> -        for item_id, subitem in self.objectItems():
> -            if hasattr(aq_base(subitem), 'manage_afterClone'):
> -                subitem.manage_afterClone(item)
> +        # Recurse in opaque subitems.
> +        if hasattr(aq_base(self), 'opaqueValues'):
> +            for subitem in self.opaqueValues():
> +                if hasattr(aq_base(subitem), 'manage_afterClone'):
> +                    subitem.manage_afterClone(item)
>  
>      def manage_beforeDelete(self, item, container):
>          """
> @@ -88,15 +84,11 @@
>          #
>          if aq_base(container) is not aq_base(self):
>              self.unindexObject()
> -            #
> -            #   Now let our "aspects" know we are going away.
> -            #   For instance, talkbacks.
> -            #
> -            for item_id, subitem in self.objectItems():
> -                # Carefully avoid implicit acquisition of the
> -                # name "manage_beforeDelete"
> -                if hasattr(aq_base(subitem), 'manage_beforeDelete'):
> -                    subitem.manage_beforeDelete(item, container)
> +            # Recurse in opaque subitems.
> +            if hasattr(aq_base(self), 'opaqueValues'):
> +                for subitem in self.opaqueValues():
> +                    if hasattr(aq_base(subitem), 'manage_beforeDelete'):
> +                        subitem.manage_beforeDelete(item, container)
>  
>      security.declarePrivate('notifyWorkflowCreated')
>      def notifyWorkflowCreated(self):
> 
> 
> === CMF/CMFCore/PortalContent.py 1.34 => 1.35 ===
>          '''
>          return self()
>  
> -    # Overridden methods to support cataloging items that might
> -    # be stored in attributes unknown to the content object, such
> -    # as the DiscussionItemContainer "talkback"
> +    # Methods to support items that might be stored in attributes
> +    # unknown to the content object, such as the DiscussionItemContainer
> +    # "talkback".
>  
> -    security.declareProtected(AccessContentsInformation, 'objectItems')
> -    def objectItems(self):
> +    security.declareProtected(AccessContentsInformation, 'opaqueItems')
> +    def opaqueItems(self):
>          """
> -        since 'talkback' is the only opaque item on content
> -        right now, I will return that. Should be replaced with
> -        a list of tuples for every opaque item!
> -        """
> -        talkback = ( hasattr( aq_base( self ), 'talkback' ) and
> -                      self.talkback or None )
> -        if talkback is not None:
> -            return ((talkback.id, talkback),)
> -        else:
> -            return ()
> +        Returns opaque items (subelements that are contained
> +        using something that is not an ObjectManager).
> +        """
> +        # Since 'talkback' is the only opaque item on content
> +        # right now, I will return that. Should be replaced with
> +        # a list of tuples for every opaque item!
> +        if hasattr(aq_base(self), 'talkback'):
> +            talkback = self.talkback
> +            if talkback is not None:
> +                return ((talkback.id, talkback),)
> +        return ()
> +
> +    security.declareProtected(AccessContentsInformation, 'opaqueIds')
> +    def opaqueIds(self):
> +        """
> +        Returns opaque ids (subelements that are contained
> +        using something that is not an ObjectManager).
> +        """
> +        return [t[0] for t in self.opaqueItems()]
> +
> +    security.declareProtected(AccessContentsInformation, 'opaqueValues')
> +    def opaqueValues(self):
> +        """
> +        Returns opaque values (subelements that are contained
> +        using something that is not an ObjectManager).
> +        """
> +        return [t[1] for t in self.opaqueItems()]
>  
>  InitializeClass(PortalContent)

Tres.
-- 
===============================================================
Tres Seaver                                tseaver@zope.com
Zope Corporation      "Zope Dealers"       http://www.zope.com