[CMF-checkins] CVS: Products/CMFCore -
ActionInformation.py:1.26.10.1 ActionsTool.py:1.54.2.1
__init__.py:1.30.2.1
Yvo Schubbe
y.2005- at wcm-solutions.de
Mon Jan 24 14:31:45 EST 2005
Update of /cvs-repository/Products/CMFCore
In directory cvs.zope.org:/tmp/cvs-serv30226/CMFCore
Modified Files:
Tag: yuppie-new_actions-branch
ActionInformation.py ActionsTool.py __init__.py
Log Message:
- initial checkin of newstyle Actions
=== Products/CMFCore/ActionInformation.py 1.26 => 1.26.10.1 ===
--- Products/CMFCore/ActionInformation.py:1.26 Thu Aug 12 11:07:39 2004
+++ Products/CMFCore/ActionInformation.py Mon Jan 24 14:31:15 2005
@@ -20,17 +20,152 @@
from AccessControl import ClassSecurityInfo
from Acquisition import aq_base, aq_inner, aq_parent
from Globals import InitializeClass
+from OFS.ObjectManager import IFAwareObjectManager
+from OFS.OrderedFolder import OrderedFolder
from OFS.SimpleItem import SimpleItem
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
-from interfaces.portal_actions import ActionInfo as IActionInfo
from Expression import Expression
+from interfaces.portal_actions import Action as IAction
+from interfaces.portal_actions import ActionCategory as IActionCategory
+from interfaces.portal_actions import ActionInfo as IActionInfo
from permissions import View
from utils import _checkPermission
+from utils import _wwwdir
from utils import getToolByName
+from utils import SimpleItemWithProperties
_unchanged = [] # marker
+class ActionCategory(IFAwareObjectManager, OrderedFolder):
+ """ Group of Action objects.
+ """
+
+ __implements__ = (IActionCategory, OrderedFolder.__implements__)
+
+ meta_type = 'CMF Action Category'
+
+ _product_interfaces = (IActionCategory, IAction)
+
+ security = ClassSecurityInfo()
+
+ security.declarePrivate('listActions')
+ def listActions(self):
+ """ List the actions defined in this category and its subcategories.
+ """
+ actions = []
+
+ for obj in self.objectValues():
+ if IActionCategory.isImplementedBy(obj):
+ actions.extend( obj.listActions() )
+ elif IAction.isImplementedBy(obj):
+ actions.append(obj)
+
+ return tuple(actions)
+
+InitializeClass(ActionCategory)
+
+manage_addActionCategoryForm = PageTemplateFile('addActionCategory.zpt',
+ _wwwdir)
+
+def manage_addActionCategory(self, id, REQUEST=None):
+ """Add a new CMF Action Category object with ID *id*.
+ """
+ obj = ActionCategory(id)
+ self._setObject(id, obj)
+
+ if REQUEST:
+ return self.manage_main(self, REQUEST, update_menu=1)
+
+
+class Action(SimpleItemWithProperties):
+ """ Reference to an action.
+ """
+
+ __implements__ = IAction
+
+ meta_type = 'CMF Action'
+
+ security = ClassSecurityInfo()
+
+ _properties = (
+ {'id': 'title', 'type': 'string', 'mode': 'w',
+ 'label': 'Title'},
+ {'id': 'description', 'type': 'text', 'mode': 'w',
+ 'label': 'Description'},
+ {'id': 'url_expr', 'type': 'string', 'mode': 'w',
+ 'label': 'URL (Expression)'},
+ {'id': 'icon_expr', 'type': 'string', 'mode': 'w',
+ 'label': 'Icon (Expression)'},
+ {'id': 'available_expr', 'type': 'string', 'mode': 'w',
+ 'label': 'Condition (Expression)'},
+ {'id': 'permissions', 'type': 'multiple selection', 'mode': 'w',
+ 'label': 'Permissions', 'select_variable': 'possible_permissions'},
+ {'id': 'visible', 'type': 'boolean', 'mode': 'w',
+ 'label': 'Visible?'},
+ )
+
+ def __init__(self, id, **kw):
+ self.id = id
+ self._setPropValue( 'title', kw.get('title', '') )
+ self._setPropValue( 'description', kw.get('description', '') )
+ self._setPropValue( 'url_expr', kw.get('url_expr', '') )
+ self._setPropValue( 'icon_expr', kw.get('icon_expr', '') )
+ self._setPropValue( 'available_expr', kw.get('available_expr', '') )
+ self._setPropValue( 'permissions', kw.get('permissions', () ) )
+ self._setPropValue( 'visible', kw.get('visible', True) )
+
+ def _setPropValue(self, id, value):
+ self._wrapperCheck(value)
+ if isinstance(value, list):
+ value = tuple(value)
+ setattr(self, id, value)
+ if id.endswith('_expr'):
+ setattr( self, '%s_object' % id, Expression(value) )
+
+ security.declarePrivate('getInfoData')
+ def getInfoData(self):
+ """ Get the data needed to create an ActionInfo.
+ """
+ category_path = []
+ lazy_keys = []
+ lazy_map = {}
+
+ lazy_map['id'] = self.getId()
+
+ parent = aq_parent(self)
+ while parent is not None and parent.getId() != 'portal_actions':
+ category_path.append( parent.getId() )
+ parent = aq_parent(parent)
+ lazy_map['category'] = '/'.join(category_path[::-1])
+
+ for id, val in self.propertyItems():
+ if id.endswith('_expr'):
+ id = id[:-5]
+ if val:
+ val = getattr(self, '%s_expr_object' % id)
+ lazy_keys.append(id)
+ elif id == 'available':
+ val = True
+ lazy_map[id] = val
+
+ return (lazy_map, lazy_keys)
+
+InitializeClass(Action)
+
+manage_addActionForm = PageTemplateFile( 'addAction.zpt', _wwwdir)
+
+def manage_addAction(self, id, REQUEST=None):
+ """Add a new CMF Action object with ID *id*.
+ """
+ obj = Action(id)
+ self._setObject(id, obj)
+
+ if REQUEST:
+ return self.manage_main(self, REQUEST)
+
+
class ActionInfo(UserDict):
""" A lazy dictionary for Action infos.
"""
@@ -40,7 +175,12 @@
def __init__(self, action, ec):
lazy_keys = []
- if isinstance(action, dict):
+ if IAction.isImplementedBy(action):
+ self._ec = ec
+ (lazy_map, lazy_keys) = action.getInfoData()
+ UserDict.__init__(self, lazy_map)
+
+ elif isinstance(action, dict):
UserDict.__init__(self, action)
self.data.setdefault( 'id', self.data['name'].lower() )
self.data.setdefault( 'title', self.data['name'] )
@@ -82,7 +222,7 @@
def __getitem__(self, key):
value = UserDict.__getitem__(self, key)
if key in self._lazy_keys:
- value = self.data[key] = value()
+ value = self.data[key] = value(self._ec)
self._lazy_keys.remove(key)
return value
@@ -98,30 +238,30 @@
else:
return self.data == other
- def _getURL(self):
+ def _getURL(self, ec):
""" Get the result of the URL expression in the current context.
"""
- return self._action._getActionObject()(self._ec)
+ return self._action._getActionObject()(ec)
- def _checkCondition(self):
+ def _checkCondition(self, ec):
""" Check condition expression in the current context.
"""
- return self._action.testCondition(self._ec)
+ return self._action.testCondition(ec)
- def _checkPermissions(self):
+ def _checkPermissions(self, ec):
""" Check permissions in the current context.
"""
category = self['category']
- object = self._ec.contexts['object']
+ object = ec.contexts['object']
if object is not None and ( category.startswith('object') or
category.startswith('workflow') ):
context = object
else:
- folder = self._ec.contexts['folder']
+ folder = ec.contexts['folder']
if folder is not None and category.startswith('folder'):
context = folder
else:
- context = self._ec.contexts['portal']
+ context = ec.contexts['portal']
for permission in self['permissions']:
if _checkPermission(permission, context):
=== Products/CMFCore/ActionsTool.py 1.54 => 1.54.2.1 ===
--- Products/CMFCore/ActionsTool.py:1.54 Tue Sep 14 15:02:21 2004
+++ Products/CMFCore/ActionsTool.py Mon Jan 24 14:31:15 2005
@@ -18,30 +18,35 @@
from AccessControl import ClassSecurityInfo
from Globals import DTMLFile
from Globals import InitializeClass
-from OFS.Folder import Folder
+from OFS.ObjectManager import IFAwareObjectManager
+from OFS.OrderedFolder import OrderedFolder
from ActionInformation import ActionInformation
from ActionProviderBase import ActionProviderBase
from Expression import Expression
+from interfaces.portal_actions import Action as IAction
+from interfaces.portal_actions import ActionCategory as IActionCategory
from interfaces.portal_actions import ActionProvider as IActionProvider
from interfaces.portal_actions import portal_actions as IActionsTool
from permissions import ListFolderContents
from permissions import ManagePortal
from utils import _dtmldir
-from utils import SimpleItemWithProperties
from utils import UniqueObject
-class ActionsTool(UniqueObject, Folder, ActionProviderBase):
+class ActionsTool(UniqueObject, IFAwareObjectManager, OrderedFolder,
+ ActionProviderBase):
"""
Weave together the various sources of "actions" which are apropos
to the current user and context.
"""
- __implements__ = (IActionsTool, ActionProviderBase.__implements__)
+ __implements__ = (IActionsTool, OrderedFolder.__implements__,
+ ActionProviderBase.__implements__)
id = 'portal_actions'
meta_type = 'CMF Actions Tool'
+ _product_interfaces = (IActionCategory,)
_actions = (ActionInformation(id='folderContents'
, title='Folder contents'
, action=Expression(
@@ -68,15 +73,13 @@
security = ClassSecurityInfo()
- manage_options = ( ActionProviderBase.manage_options
- + ( { 'label' : 'Action Providers'
- , 'action' : 'manage_actionProviders'
- }
- , { 'label' : 'Overview'
- , 'action' : 'manage_overview'
- }
- ) + Folder.manage_options
- )
+ manage_options = ( ( OrderedFolder.manage_options[0],
+ ActionProviderBase.manage_options[0],
+ {'label': 'Action Providers',
+ 'action': 'manage_actionProviders'},
+ {'label': 'Overview',
+ 'action': 'manage_overview'} ) +
+ OrderedFolder.manage_options[2:] )
#
# ZMI methods
@@ -108,6 +111,34 @@
if REQUEST is not None:
return self.manage_actionProviders(self , REQUEST
, manage_tabs_message='Providers changed.')
+
+ security.declareProtected( ManagePortal, 'manage_editActionsForm' )
+ def manage_editActionsForm( self, REQUEST, manage_tabs_message=None ):
+ """ Show the 'Actions' management tab.
+ """
+ actions = [ ai.getMapping() for ai in self._actions ]
+
+ # possible_permissions is in AccessControl.Role.RoleManager.
+ pp = self.possible_permissions()
+ return self._actions_form( self
+ , REQUEST
+ , actions=actions
+ , possible_permissions=pp
+ , management_view='Actions'
+ , manage_tabs_message=manage_tabs_message
+ )
+
+ #
+ # ActionProvider interface
+ #
+ security.declarePrivate('listActions')
+ def listActions(self, info=None, object=None):
+ """ List all the actions defined by a provider.
+ """
+ actions = list(self._actions)
+ for category in self.objectValues():
+ actions.extend( category.listActions() )
+ return tuple(actions)
#
# Programmatically manipulate the list of action providers
=== Products/CMFCore/__init__.py 1.30 => 1.30.2.1 ===
--- Products/CMFCore/__init__.py:1.30 Sun Nov 28 16:40:27 2004
+++ Products/CMFCore/__init__.py Mon Jan 24 14:31:15 2005
@@ -26,6 +26,7 @@
import FSDTMLMethod, FSPythonScript, FSSTXMethod
import FSPageTemplate
import FSZSQLMethod
+import ActionInformation
import CookieCrumbler
import ContentTypeRegistry
import CachingPolicyManager
@@ -99,6 +100,22 @@
constructors=( CachingPolicyManager.manage_addCachingPolicyManager, ),
icon = 'images/registry.gif'
)
+
+ context.registerClass(
+ ActionInformation.ActionCategory,
+ permission=ManagePortal,
+ constructors=(ActionInformation.manage_addActionCategoryForm,
+ ActionInformation.manage_addActionCategory),
+ icon='images/cmf_action_category.gif',
+ visibility=None)
+
+ context.registerClass(
+ ActionInformation.Action,
+ permission=ManagePortal,
+ constructors=(ActionInformation.manage_addActionForm,
+ ActionInformation.manage_addAction),
+ icon='images/cmf_action.gif',
+ visibility=None)
context.registerClass(
TypesTool.FactoryTypeInformation,
More information about the CMF-checkins
mailing list