[CMF-checkins] CVS: CMF/CMFDefault - DiscussionTool.py:1.7 MembershipTool.py:1.18 MetadataTool.py:1.10 PropertiesTool.py:1.6 RegistrationTool.py:1.9 SyndicationTool.py:1.10 URLTool.py:1.8

Andrew Sawyers andrew@zope.com
Fri, 4 Jan 2002 14:50:05 -0500


Update of /cvs-repository/CMF/CMFDefault
In directory cvs.zope.org:/tmp/cvs-serv10417/CMFDefault

Modified Files:
	DiscussionTool.py MembershipTool.py MetadataTool.py 
	PropertiesTool.py RegistrationTool.py SyndicationTool.py 
	URLTool.py 
Log Message:

*Merging andrew_ttw_actions-branch into the head
*Adds TTW configuration of Action Providers
*Allows tools to have actions managed TTW
*Added unittests for ActionTool, ActionInformation, and
Expression
*Added TTW action management to all stock CMF tools
*Added Expression module for allowing actions and conditions of
actions to be TALES.


=== CMF/CMFDefault/DiscussionTool.py 1.6 => 1.7 ===
 from utils import _dtmldir
 from DiscussionItem import DiscussionItemContainer
+from Products.CMFCore.ActionInformation import ActionInformation
+from Products.CMFCore.ActionProviderBase import ActionProviderBase
+from Products.CMFCore.Expression import Expression
 
 class DiscussionNotAllowed( Exception ):
     pass
 
-class DiscussionTool( UniqueObject, SimpleItem ):
+class DiscussionTool( UniqueObject, SimpleItem, ActionProviderBase ):
 
     id = 'portal_discussion'
     meta_type = 'Default Discussion Tool'
+    _actions = [ActionInformation(id='reply'
+                                , title='Reply'
+                                , action=Expression(
+                text='string: ${object_url}/discussion_reply_form')
+                                , condition=Expression(
+                text='python: object is not None and ' +
+                'portal.portal_discussion.isDiscussionAllowedFor(object)')
+                                , permissions=('Reply to item',)
+                                , category='object'
+                                , visible=1
+                                 )]
 
     security = ClassSecurityInfo()
 
-    manage_options = ( { 'label' : 'Overview', 'action' : 'manage_overview' }
+    manage_options = (ActionProviderBase.manage_options +
+                     ({ 'label' : 'Overview', 'action' : 'manage_overview' }
                      , 
-                     ) + SimpleItem.manage_options
+                     ) + SimpleItem.manage_options)
 
     #
     #   ZMI methods
@@ -52,6 +67,13 @@
     #   'portal_discussion' interface methods
     #
 
+    security.declarePrivate('listActions')
+    def listActions(self, info=None):
+        """
+        Return available actions via tool.
+        """
+        return self._actions
+
     security.declarePublic( 'overrideDiscussionFor' )
     def overrideDiscussionFor(self, content, allowDiscussion):
         """
@@ -96,29 +118,6 @@
         if typeInfo:
             return typeInfo.allowDiscussion()
         return 0
-
-    #
-    #   ActionProvider interface
-    #
-    security.declarePrivate( 'listActions' )
-    def listActions(self, info):
-        # Return actions for reply and show replies
-        content = info.content
-        if content is None or not self.isDiscussionAllowedFor(content):
-            return None
-
-        discussion = self.getDiscussionFor(content)
-        discussion_url = info.content_url
-
-        actions = (
-            {'name': 'Reply',
-             'url': discussion_url + '/discussion_reply_form',
-             'permissions': ['Reply to item'],
-             'category': 'object'
-             },
-            )
-
-        return actions
 
     #
     #   Utility methods


=== CMF/CMFDefault/MembershipTool.py 1.17 => 1.18 ===
 from Products.CMFCore.utils import _getAuthenticatedUser, _checkPermission
 from Products.CMFCore.utils import getToolByName
+from Products.CMFCore.ActionsTool import ActionInformation
 import Products.CMFCore.MembershipTool
 from Products.CMFCore.PortalFolder import manage_addPortalFolder
 import Document
 
 from Globals import InitializeClass, DTMLFile
 from AccessControl import ClassSecurityInfo
+from Products.CMFCore.Expression import Expression
 from Products.CMFCore.CMFCorePermissions import View, AccessContentsInformation
 from Products.CMFCore.CMFCorePermissions import ListPortalMembers, AddPortalMember
 from Products.CMFCore.CMFCorePermissions import ManagePortal
@@ -40,10 +42,73 @@
   in the Tool Box on the left.
 '''
 
-
 class MembershipTool ( Products.CMFCore.MembershipTool.MembershipTool ):
     """
     """
+    _actions =[ActionInformation(id='login'
+                            , title='Login'
+                            , description='Click here to Login'
+                            , action=Expression(
+            text='string: ${portal_url}/login_form')
+                            , permissions=(View,)
+                            , category='user'
+                            , condition=Expression(text='not: member')
+                            , visible=1
+                             ) 
+          , ActionInformation(id='preferences'
+                            , title='Preferences'
+                            , description='Change your user preferences'
+                            , action=Expression(
+            text='string: ${portal_url}/personalize_form')
+                            , permissions=(View,)
+                            , category='user'
+                            , condition=Expression(text='member')
+                            , visible=1
+                             )
+          , ActionInformation(id='logout'
+                            , title='Log out'
+                            , description='Click here to logout'
+                            , action=Expression(
+            text='string: ${portal_url}/logout')
+                            , permissions=(View,)
+                            , category='user'
+                            , condition=Expression(text='member')
+                            , visible=1
+                             )
+          , ActionInformation(id='addFavorite'
+                            , title='Add to favorites'
+                            , description='Add this item to your favorites'
+                            , action=Expression(
+            text='string: ${portal_url}/addtoFavorites')
+                            , permissions=(View,)
+                            , category='user'
+                            , condition=Expression(
+            text='python: portal.portal_membership.getHomeFolder()')
+                            , visible=1
+                             )
+          , ActionInformation(id='mystuff'
+                            , title='my stuff'
+                            , description='Goto your home folder'
+                            , action=Expression(
+          text='python: portal.portal_membership.getHomeUrl()')
+                            , permissions=(View,)
+                            , category='user'
+                            , condition=Expression(
+           text='python: member and portal.portal_membership.getHomeFolder()')
+                            , visible=1
+                             )
+          , ActionInformation(id='favorites'
+                            , title='My favorites'
+                            , description='Browser your favorites'
+                            , action=Expression(
+           text='python: portal.portal_membership.getHomeUrl() + \'/Favorites/folder_contents\'')
+                            , permissions=(View,)
+                            , category='user'
+                            , condition=Expression(
+           text='python: member and hasattr(portal.portal_membership.getHomeFolder(), \'Favorites\')')
+                            , visible=1
+                             )
+                           ]
 
     meta_type = 'Default Membership Tool'
 
@@ -151,63 +216,8 @@
             return None
 
     security.declarePrivate( 'listActions' )
-    def listActions(self, info):
-        '''Lists actions available to the user.'''
-        user_actions = None
-        portal_url = info.portal_url
-        if info.isAnonymous:
-            user_actions = (
-                {'name': 'Log in',
-                 'url': portal_url + '/login_form',
-                 'permissions': [],
-                 'category': 'user'},
-                {'name': 'Join',
-                 'url': portal_url + '/join_form',
-                 'permissions': [AddPortalMember],
-                 'category': 'user'},
-                )
-
-        if not info.isAnonymous:
-            home_folder = self.getHomeFolder()
-            homeUrl = self.getHomeUrl()
-            user_actions = (
-                {'name': 'Preferences',
-                 'url': portal_url + '/personalize_form',
-                 'permissions': [],
-                 'category': 'user'},
-                {'name': 'Log out',
-                 'url': portal_url + '/logout',
-                 'permissions' : [],
-                 'category': 'user'},
-                {'name': 'Reconfigure portal',
-                 'url': portal_url + '/reconfig_form',
-                 'permissions': ['Manage portal'],
-                 'category': 'global'},
-                )
-
-            if homeUrl is not None:
-                content_url = info.content_url
-                actions = (
-                    {'name': 'Add to Favorites',
-                     'url': ( content_url + '/addtoFavorites' ),
-                     'permissions' : [],
-                     'category': 'user'},
-                    {'name': 'My Stuff',
-                     'url': homeUrl + '/folder_contents',
-                     'permissions': [],
-                     'category': 'user'},
-                    )
-                user_actions = user_actions + actions
-
-                if hasattr( home_folder, 'Favorites' ):
-                    added_actions = (
-                      {'name': 'My Favorites',
-                       'url' : homeUrl + '/Favorites/folder_contents',
-                       'permissions': [],
-                       'category': 'user'},) 
-                    user_actions = user_actions + added_actions
-                    
-        return user_actions
-
+    def listActions(self, info=None):
+        '''Lists actions available through the tool.'''
+        return self._actions
 
 InitializeClass(MembershipTool)


=== CMF/CMFDefault/MetadataTool.py 1.9 => 1.10 ===
 from AccessControl import ClassSecurityInfo, getSecurityManager
 from Products.CMFCore import CMFCorePermissions
+from Products.CMFCore.ActionProviderBase import ActionProviderBase
 from utils import _dtmldir
 
 class MetadataElementPolicy( Persistent ):
@@ -190,11 +191,13 @@
 class MetadataError( Exception ):
     pass
 
-class MetadataTool( UniqueObject, SimpleItem ):
+class MetadataTool( UniqueObject, SimpleItem, ActionProviderBase ):
 
     id              = 'portal_metadata'
     meta_type       = 'Default Metadata Tool'
 
+    _actions = []
+
     security = ClassSecurityInfo()
 
     #
@@ -225,7 +228,8 @@
     #
     #   ZMI methods
     #
-    manage_options = ( ( { 'label'      : 'Overview'
+    manage_options = ( ActionProviderBase.manage_options + 
+                     ( { 'label'      : 'Overview'
                          , 'action'     : 'manage_overview'
                          }
                        , { 'label'      : 'Properties'
@@ -248,6 +252,13 @@
     security.declareProtected( CMFCorePermissions.ManagePortal
                              , 'propertiesForm' )
     propertiesForm = DTMLFile( 'metadataProperties', _dtmldir )
+
+    security.declarePrivate('listActions')
+    def listActions(self, info=None):
+        """
+        Return actions provided via tool.
+        """
+        return self._actions
 
     security.declareProtected( CMFCorePermissions.ManagePortal
                              , 'editProperties' )


=== CMF/CMFDefault/PropertiesTool.py 1.5 => 1.6 ===
 from Globals import InitializeClass, DTMLFile
 from AccessControl import ClassSecurityInfo
+from Products.CMFCore.ActionProviderBase import ActionProviderBase
+from Products.CMFCore.ActionInformation import ActionInformation
+from Products.CMFCore.Expression import Expression
 from Products.CMFCore import CMFCorePermissions
 from utils import _dtmldir
 
 
-class PropertiesTool (UniqueObject, SimpleItem):
+class PropertiesTool(UniqueObject, SimpleItem, ActionProviderBase):
     id = 'portal_properties'
     meta_type = 'Default Properties Tool'
+    _actions = [ActionInformation(id='configPortal'
+                            , title='Reconfigure Portal'
+                            , description='Reconfigure the portal'
+                            , action=Expression(
+            text='string: ${portal_url}/reconfig_form')
+                            , permissions=(CMFCorePermissions.ManagePortal,)
+                            , category='global'
+                            , condition=None
+                            , visible=1
+                             )] 
 
     security = ClassSecurityInfo()
 
-    manage_options = ( { 'label' : 'Overview', 'action' : 'manage_overview' }
+    manage_options = ( ActionProviderBase.manage_options +
+                      ({ 'label' : 'Overview', 'action' : 'manage_overview' }
                      , 
                      ) + SimpleItem.manage_options
+                     )
 
     #
     #   ZMI methods
@@ -48,6 +63,13 @@
     #
     #   'portal_properties' interface methods
     #
+    security.declarePrivate('listActions')
+    def listActions(self, info=None):
+        """
+        Return actions provided by tool.
+        """
+        return self._actions
+
     security.declareProtected( CMFCorePermissions.ManagePortal
                              , 'editProperties' )
     def editProperties(self, props):


=== CMF/CMFDefault/RegistrationTool.py 1.8 => 1.9 ===
 from Products.CMFCore.utils import UniqueObject
 from Products.CMFCore.utils import _checkPermission, getToolByName
+from Products.CMFCore.ActionInformation import ActionInformation
+from Products.CMFCore.Expression import Expression
+from Products.CMFCore.ActionProviderBase import ActionProviderBase
 from Products.CMFCore.RegistrationTool import RegistrationTool
 
 from Globals import InitializeClass, DTMLFile
@@ -27,9 +30,20 @@
 from Products.CMFCore import CMFCorePermissions
 from utils import _dtmldir
 
-class RegistrationTool (RegistrationTool):
+class RegistrationTool (RegistrationTool, ActionProviderBase):
     meta_type = 'Default Registration Tool'
 
+    _actions = [ActionInformation(id='join'
+                            , title='Join'
+                            , description='Click here to Join'
+                            , action=Expression(
+            text='string: ${portal_url}/join_form')
+                            , permissions=(CMFCorePermissions.View,)
+                            , category='user'
+                            , condition=Expression(text='not: member')
+                            , visible=1
+                             )]
+
     security = ClassSecurityInfo()
 
     #
@@ -37,6 +51,11 @@
     #
     security.declareProtected( CMFCorePermissions.ManagePortal
                              , 'manage_overview' )
+
+    manage_options = ( ActionProviderBase.manage_options +
+                       ({ 'label' : 'Overview', 'action' : 'manage_overview' }
+                     , 
+                     ))
     manage_overview = DTMLFile( 'explainRegistrationTool', _dtmldir )
 
     #
@@ -55,10 +74,11 @@
         return None
 
     security.declarePublic('listActions')
-    def listActions(self, info):
+    def listActions(self, info=None):
         """
+        Return actions provided via tool.
         """
-        return None
+        return self._actions 
 
     security.declarePublic( 'testPropertiesValidity' )
     def testPropertiesValidity(self, props, member=None):


=== CMF/CMFDefault/SyndicationTool.py 1.9 => 1.10 ===
 from Products.CMFCore.CMFCorePermissions import ManageProperties
 from Products.CMFCore.CMFCorePermissions import AccessContentsInformation
+from Products.CMFCore.ActionProviderBase import ActionProviderBase
+from Products.CMFCore.ActionInformation import ActionInformation
+from Products.CMFCore.Expression import Expression
 import Products.CMFCore.CMFCorePermissions
 from Products.CMFCore.PortalFolder import PortalFolder
 from SyndicationInfo import SyndicationInformation
 
 _dtmldir = os.path.join( package_home( globals() ), 'dtml' )
 
-class SyndicationTool (UniqueObject, SimpleItem):
+class SyndicationTool (UniqueObject, SimpleItem, ActionProviderBase):
     id = 'portal_syndication'
     meta_type = 'Default Syndication Tool'
 
+    _actions = [ActionInformation(id='syndication'
+                                , title='Syndication'
+                                , action=Expression(
+               text='string: ${folder_url}/synPropertiesForm')
+                                , condition=Expression(
+               text='python: folder is object') 
+                                , permissions=(ManageProperties,)
+                                , category='folder'
+                                , visible=1
+                                 )]
+
     security = ClassSecurityInfo()
     
     #Default Sitewide Values
@@ -46,7 +60,8 @@
     max_items = 15
 
     #ZMI Methods
-    manage_options = (({'label'     :  'Overview'
+    manage_options = (ActionProviderBase.manage_options + 
+                        ({'label'     :  'Overview'
                         ,'action'   :  'overview'
                         , 'help'    :  ('CMFDefault', 'Syndication-Tool_Overview.stx') }
                         ,{'label'   :  'Properties'
@@ -69,6 +84,13 @@
     security.declareProtected(ManagePortal, 'reportForm')
     reportForm = HTMLFile('synReports', _dtmldir)
    
+    security.declarePrivate('listActions')
+    def listActions(self, info=None):
+        """
+        Return actions provided by tool
+        """
+        return self._actions
+
     security.declareProtected(ManagePortal, 'editProperties')
     def editProperties(self
                        , updatePeriod=None


=== CMF/CMFDefault/URLTool.py 1.7 => 1.8 ===
 from Globals import InitializeClass, DTMLFile
 from AccessControl import ClassSecurityInfo
+from Products.CMFCore.ActionProviderBase import ActionProviderBase
+from Products.CMFCore.ActionInformation import ActionInformation
+from Products.CMFCore.Expression import Expression
 from Products.CMFCore import CMFCorePermissions
 from utils import _dtmldir
 
 
-class URLTool (UniqueObject, SimpleItem):
+class URLTool (UniqueObject, SimpleItem, ActionProviderBase):
     id = 'portal_url'
     meta_type = 'Default URL Tool'
+    _actions = []
 
     security = ClassSecurityInfo()
 
-    manage_options = ( { 'label' : 'Overview', 'action' : 'manage_overview' }
+    manage_options = ( ActionProviderBase.manage_options +
+                      ({ 'label' : 'Overview', 'action' : 'manage_overview' } 
                      , 
                      ) + SimpleItem.manage_options
+                     )
 
     #
     #   ZMI methods
@@ -55,6 +61,13 @@
         Returns the absolute URL of the portal.
         '''
         return aq_parent(aq_inner(self)).absolute_url(relative=relative)
+
+    security.declarePrivate('listActions')
+    def listActions(self, info=None):
+        """
+        Return a list of actions provided via the tool
+        """
+        return self._actions
 
     security.declarePublic( 'getPortalObject' )
     def getPortalObject( self ):