Commit cd29c843 authored by 's avatar

code cleanup:

- replaced has_key
- replaced oldstyle errors
- PEP 8
parent 471e6021
##############################################################################
#
# Copyright (c) 2001 Zope Foundation and Contributors.
#
#
# 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.
#
#
##############################################################################
""" A convenient base class for representing a container as a management tab.
"""
......@@ -51,27 +51,27 @@ class ContainerTab(Folder):
def _checkId(self, id, allow_dup=0):
if not allow_dup:
if self._mapping.has_key(id):
if id in self._mapping:
raise BadRequest('The id "%s" is already in use.' % id)
return Folder._checkId(self, id, allow_dup)
def _getOb(self, name, default=_marker):
mapping = self._mapping
if mapping.has_key(name):
if name in mapping:
res = mapping[name]
if hasattr(res, '__of__'):
res = res.__of__(self)
return res
else:
if default is _marker:
raise KeyError, name
raise KeyError(name)
return default
def __getattr__(self, name):
ob = self._mapping.get(name, None)
if ob is not None:
return ob
raise AttributeError, name
raise AttributeError(name)
def _setOb(self, name, value):
mapping = self._mapping
......@@ -84,13 +84,13 @@ class ContainerTab(Folder):
self._mapping = mapping # Trigger persistence.
def get(self, name, default=None):
if self._mapping.has_key(name):
if name in self._mapping:
return self[name]
else:
return default
def has_key(self, key):
return self._mapping.has_key(key)
return key in self._mapping
def objectIds(self, spec=None):
# spec is not important for now...
......
......@@ -45,7 +45,7 @@ from Products.DCWorkflow.WorkflowUIMixin import WorkflowUIMixin
def checkId(id):
res = bad_id(id)
if res != -1 and res is not None:
raise ValueError, 'Illegal ID'
raise ValueError('Illegal ID')
return 1
......@@ -88,8 +88,7 @@ class DCWorkflowDefinition(WorkflowUIMixin, Folder):
{'label': 'Worklists', 'action': 'worklists/manage_main'},
{'label': 'Scripts', 'action': 'scripts/manage_main'},
{'label': 'Permissions', 'action': 'manage_permissions'},
{'label': 'Groups', 'action': 'manage_groups'},
)
{'label': 'Groups', 'action': 'manage_groups'})
security = ClassSecurityInfo()
security.declareObjectProtected(ManagePortal)
......@@ -155,7 +154,7 @@ class DCWorkflowDefinition(WorkflowUIMixin, Folder):
status = self._getStatusOf(ob)
for id, vdef in self.variables.items():
if vdef.for_catalog:
if status.has_key(id):
if id in status:
value = status[id]
# Not set yet. Use a default.
......@@ -195,7 +194,7 @@ class DCWorkflowDefinition(WorkflowUIMixin, Folder):
'name': tdef.actbox_name % info,
'url': tdef.actbox_url % info,
'icon': tdef.actbox_icon % info,
'permissions': (), # Predetermined.
'permissions': (), # Predetermined.
'category': tdef.actbox_category,
'transition': tdef}))
res.sort()
......@@ -234,7 +233,7 @@ class DCWorkflowDefinition(WorkflowUIMixin, Folder):
'name': qdef.actbox_name % fmt_data,
'url': qdef.actbox_url % fmt_data,
'icon': qdef.actbox_icon % fmt_data,
'permissions': (), # Predetermined.
'permissions': (), # Predetermined.
'category': qdef.actbox_category}))
fmt_data._pop()
res.sort()
......@@ -303,7 +302,7 @@ class DCWorkflowDefinition(WorkflowUIMixin, Folder):
getSecurityManager(), self, ob):
return default
status = self._getStatusOf(ob)
if status is not None and status.has_key(name):
if status is not None and name in status:
value = status[name]
# Not set yet. Use a default.
......@@ -332,7 +331,7 @@ class DCWorkflowDefinition(WorkflowUIMixin, Folder):
"""
try:
self._changeStateOf(ob, None)
except ( ObjectDeleted, ObjectMoved ):
except (ObjectDeleted, ObjectMoved):
# Swallow.
pass
......@@ -459,7 +458,8 @@ class DCWorkflowDefinition(WorkflowUIMixin, Folder):
raise WorkflowException(msg)
# Fire "before" event
notify(BeforeTransitionEvent(ob, self, old_sdef, new_sdef, tdef, former_status, kwargs))
notify(BeforeTransitionEvent(ob, self, old_sdef, new_sdef, tdef,
former_status, kwargs))
# Execute the "before" script.
if tdef is not None and tdef.script_name:
......@@ -475,20 +475,23 @@ class DCWorkflowDefinition(WorkflowUIMixin, Folder):
# Update variables.
state_values = new_sdef.var_values
if state_values is None: state_values = {}
if state_values is None:
state_values = {}
tdef_exprs = None
if tdef is not None: tdef_exprs = tdef.var_exprs
if tdef_exprs is None: tdef_exprs = {}
if tdef is not None:
tdef_exprs = tdef.var_exprs
if tdef_exprs is None:
tdef_exprs = {}
status = {}
for id, vdef in self.variables.items():
if not vdef.for_status:
continue
expr = None
if state_values.has_key(id):
if id in state_values:
value = state_values[id]
elif tdef_exprs.has_key(id):
elif id in tdef_exprs:
expr = tdef_exprs[id]
elif not vdef.update_always and former_status.has_key(id):
elif not vdef.update_always and id in former_status:
# Preserve former value
value = former_status[id]
else:
......@@ -525,7 +528,8 @@ class DCWorkflowDefinition(WorkflowUIMixin, Folder):
script(sci) # May throw an exception.
# Fire "after" event
notify(AfterTransitionEvent(ob, self, old_sdef, new_sdef, tdef, status, kwargs))
notify(AfterTransitionEvent(ob, self, old_sdef, new_sdef, tdef, status,
kwargs))
# Return the new state object.
if moved_exc is not None:
......
##############################################################################
#
# Copyright (c) 2001 Zope Foundation and Contributors.
#
#
# 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.
#
#
##############################################################################
""" Expressions in a web-configurable workflow.
"""
......@@ -19,6 +19,7 @@ from Acquisition import aq_inner
from Acquisition import aq_parent
from App.class_init import InitializeClass
from DateTime.DateTime import DateTime
from MultiMapping import MultiMapping
from Products.PageTemplates.Expressions import getEngine
from Products.PageTemplates.Expressions import SecureModuleImporter
......@@ -28,10 +29,8 @@ from Products.CMFCore.WorkflowCore import ObjectDeleted
from Products.CMFCore.WorkflowCore import ObjectMoved
# We don't import SafeMapping from Products.PageTemplates.TALES
# because it's deprecated in Zope 2.10
from MultiMapping import MultiMapping
class SafeMapping(MultiMapping):
"""Mapping with security declarations and limited method exposure.
Since it subclasses MultiMapping, this class can be used to wrap
......@@ -45,7 +44,8 @@ class SafeMapping(MultiMapping):
_pop = MultiMapping.pop
class StateChangeInfo:
class StateChangeInfo(object):
'''
Provides information for expressions and scripts.
'''
......@@ -83,7 +83,7 @@ class StateChangeInfo:
def __getitem__(self, name):
if name[:1] != '_' and hasattr(self, name):
return getattr(self, name)
raise KeyError, name
raise KeyError(name)
def getHistory(self):
wf = self.workflow
......@@ -126,7 +126,7 @@ def createExprContext(sci):
'folder': container,
'nothing': None,
'root': ob.getPhysicalRoot(),
'request': getattr( ob, 'REQUEST', None ),
'request': getattr(ob, 'REQUEST', None),
'modules': SecureModuleImporter,
'user': getSecurityManager().getUser(),
'state_change': sci,
......
......@@ -30,7 +30,8 @@ from Products.DCWorkflow.permissions import ManagePortal
from Products.DCWorkflow.utils import _dtmldir
class Guard (Persistent, Explicit):
class Guard(Persistent, Explicit):
permissions = ()
roles = ()
groups = ()
......@@ -68,10 +69,10 @@ class Guard (Persistent, Explicit):
if self.groups:
# Require at least one of the specified groups.
u = sm.getUser()
b = aq_base( u )
if hasattr( b, 'getGroupsInContext' ):
u_groups = u.getGroupsInContext( ob )
elif hasattr( b, 'getGroups' ):
b = aq_base(u)
if hasattr(b, 'getGroupsInContext'):
u_groups = u.getGroupsInContext(ob)
elif hasattr(b, 'getGroups'):
u_groups = u.getGroups()
else:
u_groups = ()
......
......@@ -21,7 +21,7 @@ from Products.DCWorkflow.ContainerTab import ContainerTab
from Products.DCWorkflow.permissions import ManagePortal
class Scripts (ContainerTab):
class Scripts(ContainerTab):
"""A container for workflow scripts"""
meta_type = 'Workflow Scripts'
......
......@@ -29,6 +29,7 @@ from Products.DCWorkflow.utils import _dtmldir
class StateDefinition(SimpleItem):
"""State definition"""
meta_type = 'Workflow State'
......@@ -37,8 +38,7 @@ class StateDefinition(SimpleItem):
{'label': 'Properties', 'action': 'manage_properties'},
{'label': 'Permissions', 'action': 'manage_permissions'},
{'label': 'Groups', 'action': 'manage_groups'},
{'label': 'Variables', 'action': 'manage_variables'},
)
{'label': 'Variables', 'action': 'manage_variables'})
title = ''
description = ''
......@@ -60,8 +60,8 @@ class StateDefinition(SimpleItem):
return aq_parent(aq_inner(aq_parent(aq_inner(self))))
def getTransitions(self):
return filter(self.getWorkflow().transitions.has_key,
self.transitions)
return [ t for t in self.transitions
if t in self.getWorkflow().transitions ]
def getTransitionTitle(self, tid):
t = self.getWorkflow().transitions.get(tid, None)
......@@ -88,13 +88,13 @@ class StateDefinition(SimpleItem):
if self.permission_roles:
roles = self.permission_roles.get(p, None)
if roles is None:
return {'acquired':1, 'roles':[]}
return {'acquired': 1, 'roles': []}
else:
if isinstance(roles, tuple):
acq = 0
else:
acq = 1
return {'acquired':acq, 'roles':list(roles)}
return {'acquired': acq, 'roles': list(roles)}
def getGroupInfo(self, group):
"""Returns the list of roles to be assigned to a group.
......@@ -112,7 +112,8 @@ class StateDefinition(SimpleItem):
manage_tabs_message=manage_tabs_message,
)
def setProperties(self, title='', transitions=(), REQUEST=None, description=''):
def setProperties(self, title='', transitions=(), REQUEST=None,
description=''):
"""Set the properties for this State."""
self.title = str(title)
self.description = str(description)
......@@ -120,7 +121,6 @@ class StateDefinition(SimpleItem):
if REQUEST is not None:
return self.manage_properties(REQUEST, 'Properties changed.')
_variables_form = DTMLFile('state_variables', _dtmldir)
def manage_variables(self, REQUEST, manage_tabs_message=None):
......@@ -147,11 +147,11 @@ class StateDefinition(SimpleItem):
return wf_vars
ret = []
for vid in wf_vars:
if not self.var_values.has_key(vid):
if not vid in self.var_values:
ret.append(vid)
return ret
def addVariable(self,id,value,REQUEST=None):
def addVariable(self, id, value, REQUEST=None):
"""Add a WorkflowVariable to State."""
if self.var_values is None:
self.var_values = PersistentMapping()
......@@ -161,11 +161,11 @@ class StateDefinition(SimpleItem):
if REQUEST is not None:
return self.manage_variables(REQUEST, 'Variable added.')
def deleteVariables(self,ids=[],REQUEST=None):
def deleteVariables(self, ids=[], REQUEST=None):
"""Delete a WorkflowVariable from State."""
vv = self.var_values
for id in ids:
if vv.has_key(id):
if id in vv:
del vv[id]
if REQUEST is not None:
......@@ -184,8 +184,6 @@ class StateDefinition(SimpleItem):
vv[id] = str(REQUEST[fname])
return self.manage_variables(REQUEST, 'Variables changed.')
_permissions_form = DTMLFile('state_permissions', _dtmldir)
def manage_permissions(self, REQUEST, manage_tabs_message=None):
......@@ -254,6 +252,7 @@ InitializeClass(StateDefinition)
class States(ContainerTab):
"""A container for state definitions"""
meta_type = 'Workflow States'
......@@ -261,10 +260,9 @@ class States(ContainerTab):
security = ClassSecurityInfo()
security.declareObjectProtected(ManagePortal)
all_meta_types = ({'name':StateDefinition.meta_type,
'action':'addState',
'permission': ManagePortal,
},)
all_meta_types = ({'name': StateDefinition.meta_type,
'action': 'addState',
'permission': ManagePortal},)
_manage_states = DTMLFile('states', _dtmldir)
......@@ -297,7 +295,7 @@ class States(ContainerTab):
'''
if not id:
if len(ids) != 1:
raise ValueError, 'One and only one state must be selected'
raise ValueError('One and only one state must be selected')
id = ids[0]
id = str(id)
aq_parent(aq_inner(self)).initial_state = id
......
......@@ -31,7 +31,8 @@ TRIGGER_AUTOMATIC = 0
TRIGGER_USER_ACTION = 1
class TransitionDefinition (SimpleItem):
class TransitionDefinition(SimpleItem):
"""Transition definition"""
meta_type = 'Workflow Transition'
......@@ -54,8 +55,7 @@ class TransitionDefinition (SimpleItem):
manage_options = (
{'label': 'Properties', 'action': 'manage_properties'},
{'label': 'Variables', 'action': 'manage_variables'},
)
{'label': 'Variables', 'action': 'manage_variables'})
def __init__(self, id):
self.id = id
......@@ -152,7 +152,7 @@ class TransitionDefinition (SimpleItem):
else:
ret = []
for key in ve.keys():
ret.append((key,self.getVarExprText(key)))
ret.append((key, self.getVarExprText(key)))
return ret
def getWorkflowVariables(self):
......@@ -164,7 +164,7 @@ class TransitionDefinition (SimpleItem):
return wf_vars
ret = []
for vid in wf_vars:
if not self.var_exprs.has_key(vid):
if not vid in self.var_exprs:
ret.append(vid)
return ret
......@@ -183,12 +183,12 @@ class TransitionDefinition (SimpleItem):
if REQUEST is not None:
return self.manage_variables(REQUEST, 'Variable added.')
def deleteVariables(self,ids=[],REQUEST=None):
def deleteVariables(self, ids=[], REQUEST=None):
''' delete a WorkflowVariable from State
'''
ve = self.var_exprs
for id in ids:
if ve.has_key(id):
if id in ve:
del ve[id]
if REQUEST is not None:
......@@ -217,7 +217,8 @@ class TransitionDefinition (SimpleItem):
InitializeClass(TransitionDefinition)
class Transitions (ContainerTab):
class Transitions(ContainerTab):
"""A container for transition definitions"""
meta_type = 'Workflow Transitions'
......@@ -225,10 +226,9 @@ class Transitions (ContainerTab):
security = ClassSecurityInfo()
security.declareObjectProtected(ManagePortal)
all_meta_types = ({'name':TransitionDefinition.meta_type,
'action':'addTransition',
'permission': ManagePortal,
},)
all_meta_types = ({'name': TransitionDefinition.meta_type,
'action': 'addTransition',
'permission': ManagePortal},)
_manage_transitions = DTMLFile('transitions', _dtmldir)
......
##############################################################################
#
# Copyright (c) 2001 Zope Foundation and Contributors.
#
#
# 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.
#
#
##############################################################################
""" Web-configurable workflow UI.
"""
......@@ -27,7 +27,8 @@ from Products.DCWorkflow.Guard import Guard
from Products.DCWorkflow.utils import _dtmldir
class WorkflowUIMixin:
class WorkflowUIMixin(object):
'''
'''
......@@ -39,7 +40,7 @@ class WorkflowUIMixin:
security.declareProtected(ManagePortal, 'setProperties')
@postonly
def setProperties(self, title, manager_bypass=0, props=None,
def setProperties(self, title, manager_bypass=0, props=None,
REQUEST=None, description=''):
"""Sets basic properties.
"""
......@@ -72,9 +73,9 @@ class WorkflowUIMixin:
"""Adds to the list of permissions to manage.
"""
if p in self.permissions:
raise ValueError, 'Already a managed permission: ' + p
raise ValueError('Already a managed permission: ' + p)
if REQUEST is not None and p not in self.getPossiblePermissions():
raise ValueError, 'Not a valid permission name:' + p
raise ValueError('Not a valid permission name:' + p)
self.permissions = self.permissions + (p,)
if REQUEST is not None:
return self.manage_permissions(
......@@ -111,7 +112,7 @@ class WorkflowUIMixin:
def getAvailableGroups(self):
"""Returns a list of available group names.
"""
gf = aq_get( self, '__allow_groups__', None, 1 )
gf = aq_get(self, '__allow_groups__', None, 1)
if gf is None:
return ()
try:
......
......@@ -37,6 +37,7 @@ tales_re = re.compile(r'(\w+:)?(.*)')
class WorklistDefinition(SimpleItem):
"""Worklist definiton"""
meta_type = 'Worklist'
......@@ -52,9 +53,7 @@ class WorklistDefinition(SimpleItem):
actbox_category = 'global'
guard = None
manage_options = (
{'label': 'Properties', 'action': 'manage_properties'},
)
manage_options = ({'label': 'Properties', 'action': 'manage_properties'},)
def __init__(self, id):
self.id = id
......@@ -141,7 +140,7 @@ class WorklistDefinition(SimpleItem):
self.var_matches[key] = tuple(v)
else:
if self.var_matches and self.var_matches.has_key(key):
if self.var_matches and key in self.var_matches:
del self.var_matches[key]
self.actbox_name = str(actbox_name)
self.actbox_url = str(actbox_url)
......@@ -189,6 +188,7 @@ InitializeClass(WorklistDefinition)
class Worklists(ContainerTab):
"""A container for worklist definitions"""
meta_type = 'Worklists'
......@@ -196,10 +196,9 @@ class Worklists(ContainerTab):
security = ClassSecurityInfo()
security.declareObjectProtected(ManagePortal)
all_meta_types = ({'name':WorklistDefinition.meta_type,
'action':'addWorklist',
'permission': ManagePortal,
},)
all_meta_types = ({'name': WorklistDefinition.meta_type,
'action': 'addWorklist',
'permission': ManagePortal},)
_manage_worklists = DTMLFile('worklists', _dtmldir)
......
......@@ -32,7 +32,7 @@ from Products.DCWorkflow.utils import _xmldir
from Products.GenericSetup.interfaces import ISetupEnviron
from Products.GenericSetup.utils import BodyAdapterBase
TRIGGER_TYPES = ( 'AUTOMATIC', 'USER' )
TRIGGER_TYPES = ('AUTOMATIC', 'USER')
_FILENAME = 'workflows.xml'
......@@ -55,36 +55,35 @@ class DCWorkflowDefinitionBodyAdapter(BodyAdapterBase):
encoding = 'utf-8'
wfdc = WorkflowDefinitionConfigurator(self.context)
( workflow_id
, title
, state_variable
, initial_state
, states
, transitions
, variables
, worklists
, permissions
, scripts
, description
, manager_bypass
, creation_guard
(_workflow_id,
title,
state_variable,
initial_state,
states,
transitions,
variables,
worklists,
permissions,
scripts,
description,
manager_bypass,
creation_guard
) = wfdc.parseWorkflowXML(body, encoding)
_initDCWorkflow( self.context
, title
, description
, manager_bypass
, creation_guard
, state_variable
, initial_state
, states
, transitions
, variables
, worklists
, permissions
, scripts
, self.environ
)
_initDCWorkflow(self.context,
title,
description,
manager_bypass,
creation_guard,
state_variable,
initial_state,
states,
transitions,
variables,
worklists,
permissions,
scripts,
self.environ)
body = property(_exportBody, _importBody)
......@@ -93,7 +92,7 @@ class DCWorkflowDefinitionBodyAdapter(BodyAdapterBase):
suffix = '/definition.xml'
class WorkflowDefinitionConfigurator( Implicit ):
class WorkflowDefinitionConfigurator(Implicit):
""" Synthesize XML description of site's workflows.
"""
security = ClassSecurityInfo()
......@@ -101,9 +100,8 @@ class WorkflowDefinitionConfigurator( Implicit ):
def __init__(self, obj):
self._obj = obj
security.declareProtected( ManagePortal, 'getWorkflowInfo' )
def getWorkflowInfo( self, workflow_id ):
security.declareProtected(ManagePortal, 'getWorkflowInfo')
def getWorkflowInfo(self, workflow_id):
""" Return a mapping describing a given workflow.
o Keys in the mappings:
......@@ -122,81 +120,78 @@ class WorkflowDefinitionConfigurator( Implicit ):
"""
workflow = self._obj
workflow_info = { 'id' : workflow_id
, 'meta_type' : workflow.meta_type
, 'title' : workflow.title_or_id()
, 'description' : workflow.description
}
workflow_info = {'id': workflow_id,
'meta_type': workflow.meta_type,
'title': workflow.title_or_id(),
'description': workflow.description}
if workflow.meta_type == DCWorkflowDefinition.meta_type:
self._extractDCWorkflowInfo( workflow, workflow_info )
self._extractDCWorkflowInfo(workflow, workflow_info)
return workflow_info
security.declareProtected( ManagePortal, 'generateWorkflowXML' )
security.declareProtected(ManagePortal, 'generateWorkflowXML')
def generateWorkflowXML(self):
""" Pseudo API.
"""
return self._workflowConfig(workflow_id=self._obj.getId())\
.encode('utf-8')
security.declareProtected( ManagePortal, 'getWorkflowScripts' )
security.declareProtected(ManagePortal, 'getWorkflowScripts')
def getWorkflowScripts(self):
""" Get workflow scripts information
"""
return self._extractScripts(self._obj)
security.declareProtected( ManagePortal, 'parseWorkflowXML' )
def parseWorkflowXML( self, xml, encoding='utf-8' ):
security.declareProtected(ManagePortal, 'parseWorkflowXML')
def parseWorkflowXML(self, xml, encoding='utf-8'):
""" Pseudo API.
"""
dom = parseString( xml )
dom = parseString(xml)
root = dom.getElementsByTagName( 'dc-workflow' )[ 0 ]
root = dom.getElementsByTagName('dc-workflow')[0]
workflow_id = _getNodeAttribute( root, 'workflow_id', encoding )
title = _getNodeAttribute( root, 'title', encoding )
workflow_id = _getNodeAttribute(root, 'workflow_id', encoding)
title = _getNodeAttribute(root, 'title', encoding)
try:
description = _getNodeAttribute( root, 'description', encoding )
description = _getNodeAttribute(root, 'description', encoding)
except ValueError:
# Don't fail on export files that do not have the description field!
# Don't fail on export files that do not have the description
# field!
description = ''
manager_bypass = _queryNodeAttributeBoolean(root,'manager_bypass',False)
manager_bypass = _queryNodeAttributeBoolean(root, 'manager_bypass',
False)
creation_guard = _extractCreationGuard(root, encoding)
state_variable = _getNodeAttribute( root, 'state_variable', encoding )
initial_state = _getNodeAttribute( root, 'initial_state', encoding )
states = _extractStateNodes( root, encoding )
transitions = _extractTransitionNodes( root, encoding )
variables = _extractVariableNodes( root, encoding )
worklists = _extractWorklistNodes( root, encoding )
permissions = _extractPermissionNodes( root, encoding )
scripts = _extractScriptNodes( root, encoding )
return ( workflow_id
, title
, state_variable
, initial_state
, states
, transitions
, variables
, worklists
, permissions
, scripts
, description
, manager_bypass
, creation_guard
)
security.declarePrivate( '_workflowConfig' )
_workflowConfig = PageTemplateFile( 'wtcWorkflowExport.xml'
, _xmldir
, __name__='workflowConfig'
)
security.declarePrivate( '_extractDCWorkflowInfo' )
def _extractDCWorkflowInfo( self, workflow, workflow_info ):
state_variable = _getNodeAttribute(root, 'state_variable', encoding)
initial_state = _getNodeAttribute(root, 'initial_state', encoding)
states = _extractStateNodes(root, encoding)
transitions = _extractTransitionNodes(root, encoding)
variables = _extractVariableNodes(root, encoding)
worklists = _extractWorklistNodes(root, encoding)
permissions = _extractPermissionNodes(root, encoding)
scripts = _extractScriptNodes(root, encoding)
return (workflow_id,
title,
state_variable,
initial_state,
states,
transitions,
variables,
worklists,
permissions,
scripts,
description,
manager_bypass,
creation_guard)
security.declarePrivate('_workflowConfig')
_workflowConfig = PageTemplateFile('wtcWorkflowExport.xml', _xmldir,
__name__='workflowConfig')
security.declarePrivate('_extractDCWorkflowInfo')
def _extractDCWorkflowInfo(self, workflow, workflow_info):
""" Append the information for a 'workflow' into 'workflow_info'
o 'workflow' must be a DCWorkflowDefinition instance.
......@@ -209,7 +204,7 @@ class WorkflowDefinitionConfigurator( Implicit ):
'permissions' -- a list of names of permissions managed
by the workflow
'state_variable' -- the name of the workflow's "main"
state variable
......@@ -231,17 +226,16 @@ class WorkflowDefinitionConfigurator( Implicit ):
'script_info' -- a list of mappings describing the scripts which
provide added business logic (see '_extractScripts').
"""
workflow_info[ 'manager_bypass' ] = bool(workflow.manager_bypass)
workflow_info[ 'creation_guard' ] = self._extractCreationGuard(workflow)
workflow_info[ 'state_variable' ] = workflow.state_var
workflow_info[ 'initial_state' ] = workflow.initial_state
workflow_info[ 'permissions' ] = workflow.permissions
workflow_info[ 'variable_info' ] = self._extractVariables( workflow )
workflow_info[ 'state_info' ] = self._extractStates( workflow )
workflow_info[ 'transition_info' ] = self._extractTransitions(
workflow )
workflow_info[ 'worklist_info' ] = self._extractWorklists( workflow )
workflow_info[ 'script_info' ] = self._extractScripts( workflow )
workflow_info['manager_bypass'] = bool(workflow.manager_bypass)
workflow_info['creation_guard'] = self._extractCreationGuard(workflow)
workflow_info['state_variable'] = workflow.state_var
workflow_info['initial_state'] = workflow.initial_state
workflow_info['permissions'] = workflow.permissions
workflow_info['variable_info'] = self._extractVariables(workflow)
workflow_info['state_info'] = self._extractStates(workflow)
workflow_info['transition_info'] = self._extractTransitions(workflow)
workflow_info['worklist_info'] = self._extractWorklists(workflow)
workflow_info['script_info'] = self._extractScripts(workflow)
security.declarePrivate('_extractCreationGuard')
def _extractCreationGuard(self, workflow):
......@@ -249,17 +243,15 @@ class WorkflowDefinitionConfigurator( Implicit ):
if 'creation_guard' is initialized or None
"""
guard = workflow.creation_guard
if guard is not None :
info = { 'guard_permissions' : guard.permissions
, 'guard_roles' : guard.roles
, 'guard_groups' : guard.groups
, 'guard_expr' : guard.getExprText()
}
if guard is not None:
info = {'guard_permissions': guard.permissions,
'guard_roles': guard.roles,
'guard_groups': guard.groups,
'guard_expr': guard.getExprText()}
return info
security.declarePrivate( '_extractVariables' )
def _extractVariables( self, workflow ):
security.declarePrivate('_extractVariables')
def _extractVariables(self, workflow):
""" Return a sequence of mappings describing DCWorkflow variables.
o Keys for each mapping will include:
......@@ -298,29 +290,27 @@ class WorkflowDefinitionConfigurator( Implicit ):
guard = v.getInfoGuard()
default_type = _guessVariableType( v.default_value )
default_type = _guessVariableType(v.default_value)
info = { 'id' : k
, 'description' : v.description
, 'for_catalog' : bool( v.for_catalog )
, 'for_status' : bool( v.for_status )
, 'update_always' : bool( v.update_always )
, 'default_value' : v.default_value
, 'default_type' : default_type
, 'default_expr' : v.getDefaultExprText()
, 'guard_permissions' : guard.permissions
, 'guard_roles' : guard.roles
, 'guard_groups' : guard.groups
, 'guard_expr' : guard.getExprText()
}
info = {'id': k,
'description': v.description,
'for_catalog': bool(v.for_catalog),
'for_status': bool(v.for_status),
'update_always': bool(v.update_always),
'default_value': v.default_value,
'default_type': default_type,
'default_expr': v.getDefaultExprText(),
'guard_permissions': guard.permissions,
'guard_roles': guard.roles,
'guard_groups': guard.groups,
'guard_expr': guard.getExprText()}
result.append( info )
result.append(info)
return result
security.declarePrivate( '_extractStates' )
def _extractStates( self, workflow ):
security.declarePrivate('_extractStates')
def _extractStates(self, workflow):
""" Return a sequence of mappings describing DCWorkflow states.
o Within the workflow mapping, each 'state_info' mapping has keys:
......@@ -368,37 +358,34 @@ class WorkflowDefinitionConfigurator( Implicit ):
for k, v in items:
groups = v.group_roles and list( v.group_roles.items() ) or []
groups = v.group_roles and list(v.group_roles.items()) or []
groups = [ x for x in groups if x[1] ]
groups.sort()
variables = list( v.getVariableValues() )
variables = list(v.getVariableValues())
variables.sort()
v_info = []
for v_name, value in variables:
v_info.append( { 'name' : v_name
, 'type' :_guessVariableType( value )
, 'value' : value
} )
info = { 'id' : k
, 'title' : v.title
, 'description' : v.description
, 'transitions' : v.transitions
, 'permissions' : self._extractStatePermissions( v )
, 'groups' : groups
, 'variables' : v_info
}
result.append( info )
v_info.append({'name': v_name,
'type': _guessVariableType(value),
'value': value})
return result
info = {'id': k,
'title': v.title,
'description': v.description,
'transitions': v.transitions,
'permissions': self._extractStatePermissions(v),
'groups': groups,
'variables': v_info}
security.declarePrivate( '_extractStatePermissions' )
def _extractStatePermissions( self, state ):
result.append(info)
return result
security.declarePrivate('_extractStatePermissions')
def _extractStatePermissions(self, state):
""" Return a sequence of mappings for the permissions in a state.
o Each mapping has the keys:
......@@ -417,18 +404,14 @@ class WorkflowDefinitionConfigurator( Implicit ):
items.sort()
for k, v in items:
result.append( { 'name' : k
, 'roles' : v
, 'acquired' : not isinstance( v, tuple )
} )
result.append({'name': k,
'roles': v,
'acquired': not isinstance(v, tuple)})
return result
security.declarePrivate( '_extractTransitions' )
def _extractTransitions( self, workflow ):
security.declarePrivate('_extractTransitions')
def _extractTransitions(self, workflow):
""" Return a sequence of mappings describing DCWorkflow transitions.
o Each mapping has the keys:
......@@ -492,33 +475,31 @@ class WorkflowDefinitionConfigurator( Implicit ):
v_info = []
for v_name, expr in v.getVariableExprs():
v_info.append( { 'name' : v_name, 'expr' : expr } )
info = { 'id' : k
, 'title' : v.title
, 'description' : v.description
, 'new_state_id' : v.new_state_id
, 'trigger_type' : TRIGGER_TYPES[ v.trigger_type ]
, 'script_name' : v.script_name
, 'after_script_name' : v.after_script_name
, 'actbox_name' : v.actbox_name
, 'actbox_url' : v.actbox_url
, 'actbox_icon' : v.actbox_icon
, 'actbox_category' : v.actbox_category
, 'variables' : v_info
, 'guard_permissions' : guard.permissions
, 'guard_roles' : guard.roles
, 'guard_groups' : guard.groups
, 'guard_expr' : guard.getExprText()
}
result.append( info )
v_info.append({'name': v_name, 'expr': expr})
info = {'id': k,
'title': v.title,
'description': v.description,
'new_state_id': v.new_state_id,
'trigger_type': TRIGGER_TYPES[v.trigger_type],
'script_name': v.script_name,
'after_script_name': v.after_script_name,
'actbox_name': v.actbox_name,
'actbox_url': v.actbox_url,
'actbox_icon': v.actbox_icon,
'actbox_category': v.actbox_category,
'variables': v_info,
'guard_permissions': guard.permissions,
'guard_roles': guard.roles,
'guard_groups': guard.groups,
'guard_expr': guard.getExprText()}
result.append(info)
return result
security.declarePrivate( '_extractWorklists' )
def _extractWorklists( self, workflow ):
security.declarePrivate('_extractWorklists')
def _extractWorklists(self, workflow):
""" Return a sequence of mappings describing DCWorkflow transitions.
o Each mapping has the keys:
......@@ -538,7 +519,7 @@ class WorkflowDefinitionConfigurator( Implicit ):
'actbox_url' -- the URL of the "action" corresponding to the
worklist
'actbox_icon' -- the icon URL of the "action" corresponding to
'actbox_icon' -- the icon URL of the "action" corresponding to
the worklist
'actbox_category' -- the category of the "action" corresponding
......@@ -562,30 +543,28 @@ class WorkflowDefinitionConfigurator( Implicit ):
guard = v.getGuard()
var_match = [ ( id, v.getVarMatchText( id ) )
for id in v.getVarMatchKeys() ]
info = { 'id' : k
, 'title' : v.title
, 'description' : v.description
, 'var_match' : var_match
, 'actbox_name' : v.actbox_name
, 'actbox_url' : v.actbox_url
, 'actbox_icon' : v.actbox_icon
, 'actbox_category' : v.actbox_category
, 'guard_permissions' : guard.permissions
, 'guard_roles' : guard.roles
, 'guard_groups' : guard.groups
, 'guard_expr' : guard.getExprText()
}
result.append( info )
var_match = [ (id, v.getVarMatchText(id))
for id in v.getVarMatchKeys() ]
return result
info = {'id': k,
'title': v.title,
'description': v.description,
'var_match': var_match,
'actbox_name': v.actbox_name,
'actbox_url': v.actbox_url,
'actbox_icon': v.actbox_icon,
'actbox_category': v.actbox_category,
'guard_permissions': guard.permissions,
'guard_roles': guard.roles,
'guard_groups': guard.groups,
'guard_expr': guard.getExprText()}
security.declarePrivate( '_extractScripts' )
def _extractScripts( self, workflow ):
result.append(info)
return result
security.declarePrivate('_extractScripts')
def _extractScripts(self, workflow):
""" Return a sequence of mappings describing DCWorkflow scripts.
o Each mapping has the keys:
......@@ -613,7 +592,7 @@ class WorkflowDefinitionConfigurator( Implicit ):
for k, v in items:
filename = _getScriptFilename( workflow.getId(), k, v.meta_type )
filename = _getScriptFilename(workflow.getId(), k, v.meta_type)
module = ''
function = ''
......@@ -621,342 +600,301 @@ class WorkflowDefinitionConfigurator( Implicit ):
module = v.module()
function = v.function()
info = { 'id' : k
, 'meta_type' : v.meta_type
, 'module' : module
, 'function' : function
, 'filename' : filename
}
info = {'id': k,
'meta_type': v.meta_type,
'module': module,
'function': function,
'filename': filename}
result.append( info )
result.append(info)
return result
InitializeClass( WorkflowDefinitionConfigurator )
InitializeClass(WorkflowDefinitionConfigurator)
def _getScriptFilename( workflow_id, script_id, meta_type ):
def _getScriptFilename(workflow_id, script_id, meta_type):
""" Return the name of the file which holds the script.
"""
wf_dir = workflow_id.replace( ' ', '_' )
wf_dir = workflow_id.replace(' ', '_')
suffix = _METATYPE_SUFFIXES.get(meta_type, None)
if suffix is None:
return ''
return 'workflows/%s/scripts/%s.%s' % ( wf_dir, script_id, suffix )
return 'workflows/%s/scripts/%s.%s' % (wf_dir, script_id, suffix)
def _extractCreationGuard(root, encoding='utf-8') :
def _extractCreationGuard(root, encoding='utf-8'):
icc = root.getElementsByTagName('instance-creation-conditions')
assert len(icc) <= 1
if icc :
if icc:
parent = icc[0]
return _extractGuardNode(parent, encoding)
else :
else:
return None
def _extractStateNodes( root, encoding='utf-8' ):
def _extractStateNodes(root, encoding='utf-8'):
result = []
for s_node in root.getElementsByTagName( 'state' ):
info = { 'state_id' : _getNodeAttribute( s_node, 'state_id', encoding )
, 'title' : _getNodeAttribute( s_node, 'title', encoding )
, 'description' : _extractDescriptionNode( s_node, encoding )
}
for s_node in root.getElementsByTagName('state'):
info = {'state_id': _getNodeAttribute(s_node, 'state_id', encoding),
'title': _getNodeAttribute(s_node, 'title', encoding),
'description': _extractDescriptionNode(s_node, encoding)}
info[ 'transitions' ] = [ _getNodeAttribute( x, 'transition_id'
, encoding )
for x in s_node.getElementsByTagName(
'exit-transition' ) ]
info['transitions'] = [ _getNodeAttribute(x, 'transition_id', encoding)
for x in s_node.getElementsByTagName(
'exit-transition') ]
info[ 'permissions' ] = permission_map = {}
info['permissions'] = permission_map = {}
for p_map in s_node.getElementsByTagName( 'permission-map' ):
for p_map in s_node.getElementsByTagName('permission-map'):
name = _getNodeAttribute( p_map, 'name', encoding )
acquired = _queryNodeAttributeBoolean( p_map, 'acquired', False )
name = _getNodeAttribute(p_map, 'name', encoding)
acquired = _queryNodeAttributeBoolean(p_map, 'acquired', False)
roles = [ _coalesceTextNodeChildren( x, encoding )
for x in p_map.getElementsByTagName(
'permission-role' ) ]
roles = [ _coalesceTextNodeChildren(x, encoding)
for x in p_map.getElementsByTagName('permission-role') ]
if not acquired:
roles = tuple( roles )
roles = tuple(roles)
permission_map[ name ] = roles
permission_map[name] = roles
info[ 'groups' ] = group_map = []
info['groups'] = group_map = []
for g_map in s_node.getElementsByTagName( 'group-map' ):
for g_map in s_node.getElementsByTagName('group-map'):
name = _getNodeAttribute( g_map, 'name', encoding )
name = _getNodeAttribute(g_map, 'name', encoding)
roles = [ _coalesceTextNodeChildren( x, encoding )
for x in g_map.getElementsByTagName(
'group-role' ) ]
roles = [ _coalesceTextNodeChildren(x, encoding)
for x in g_map.getElementsByTagName('group-role') ]
group_map.append( ( name, tuple( roles ) ) )
group_map.append((name, tuple(roles)))
info[ 'variables' ] = var_map = {}
info['variables'] = var_map = {}
for assignment in s_node.getElementsByTagName( 'assignment' ):
for assignment in s_node.getElementsByTagName('assignment'):
name = _getNodeAttribute( assignment, 'name', encoding )
type_id = _getNodeAttribute( assignment, 'type', encoding )
value = _coalesceTextNodeChildren( assignment, encoding )
name = _getNodeAttribute(assignment, 'name', encoding)
type_id = _getNodeAttribute(assignment, 'type', encoding)
value = _coalesceTextNodeChildren(assignment, encoding)
var_map[ name ] = { 'name' : name
, 'type' : type_id
, 'value' : value
}
var_map[name] = {'name': name, 'type': type_id, 'value': value}
result.append( info )
result.append(info)
return result
def _extractTransitionNodes( root, encoding='utf-8' ):
def _extractTransitionNodes(root, encoding='utf-8'):
result = []
for t_node in root.getElementsByTagName( 'transition' ):
for t_node in root.getElementsByTagName('transition'):
info = { 'transition_id' : _getNodeAttribute( t_node, 'transition_id'
, encoding )
, 'title' : _getNodeAttribute( t_node, 'title', encoding )
, 'description' : _extractDescriptionNode( t_node, encoding )
, 'new_state' : _getNodeAttribute( t_node, 'new_state'
, encoding )
, 'trigger' : _getNodeAttribute( t_node, 'trigger', encoding )
, 'before_script' : _getNodeAttribute( t_node, 'before_script'
, encoding )
, 'after_script' : _getNodeAttribute( t_node, 'after_script'
, encoding )
, 'action' : _extractActionNode( t_node, encoding )
, 'guard' : _extractGuardNode( t_node, encoding )
}
info = {'transition_id': _getNodeAttribute(t_node, 'transition_id',
encoding),
'title': _getNodeAttribute(t_node, 'title', encoding),
'description': _extractDescriptionNode(t_node, encoding),
'new_state': _getNodeAttribute(t_node, 'new_state', encoding),
'trigger': _getNodeAttribute(t_node, 'trigger', encoding),
'before_script': _getNodeAttribute(t_node, 'before_script',
encoding),
'after_script': _getNodeAttribute(t_node, 'after_script',
encoding),
'action': _extractActionNode(t_node, encoding),
'guard': _extractGuardNode(t_node, encoding)}
info[ 'variables' ] = var_map = {}
info['variables'] = var_map = {}
for assignment in t_node.getElementsByTagName( 'assignment' ):
for assignment in t_node.getElementsByTagName('assignment'):
name = _getNodeAttribute( assignment, 'name', encoding )
expr = _coalesceTextNodeChildren( assignment, encoding )
var_map[ name ] = expr
name = _getNodeAttribute(assignment, 'name', encoding)
expr = _coalesceTextNodeChildren(assignment, encoding)
var_map[name] = expr
result.append( info )
result.append(info)
return result
def _extractVariableNodes( root, encoding='utf-8' ):
def _extractVariableNodes(root, encoding='utf-8'):
result = []
for v_node in root.getElementsByTagName( 'variable' ):
info = { 'variable_id' : _getNodeAttribute( v_node, 'variable_id'
, encoding )
, 'description' : _extractDescriptionNode( v_node, encoding )
, 'for_catalog' : _queryNodeAttributeBoolean( v_node
, 'for_catalog'
, False
)
, 'for_status' : _queryNodeAttributeBoolean( v_node
, 'for_status'
, False
)
, 'update_always' : _queryNodeAttributeBoolean( v_node
, 'update_always'
, False
)
, 'default' : _extractDefaultNode( v_node, encoding )
, 'guard' : _extractGuardNode( v_node, encoding )
}
result.append( info )
for v_node in root.getElementsByTagName('variable'):
return result
info = {'variable_id': _getNodeAttribute(v_node, 'variable_id',
encoding),
'description': _extractDescriptionNode(v_node, encoding),
'for_catalog': _queryNodeAttributeBoolean(v_node,
'for_catalog', False),
'for_status': _queryNodeAttributeBoolean(v_node, 'for_status',
False),
'update_always': _queryNodeAttributeBoolean(v_node,
'update_always', False),
'default': _extractDefaultNode(v_node, encoding),
'guard': _extractGuardNode(v_node, encoding)}
result.append(info)
def _extractWorklistNodes( root, encoding='utf-8' ):
return result
def _extractWorklistNodes(root, encoding='utf-8'):
result = []
for w_node in root.getElementsByTagName( 'worklist' ):
for w_node in root.getElementsByTagName('worklist'):
info = { 'worklist_id' : _getNodeAttribute( w_node, 'worklist_id'
, encoding )
, 'title' : _getNodeAttribute( w_node, 'title' , encoding )
, 'description' : _extractDescriptionNode( w_node, encoding )
, 'match' : _extractMatchNode( w_node, encoding )
, 'action' : _extractActionNode( w_node, encoding )
, 'guard' : _extractGuardNode( w_node, encoding )
}
info = {'worklist_id': _getNodeAttribute(w_node, 'worklist_id',
encoding),
'title': _getNodeAttribute(w_node, 'title', encoding),
'description': _extractDescriptionNode(w_node, encoding),
'match': _extractMatchNode(w_node, encoding),
'action': _extractActionNode(w_node, encoding),
'guard': _extractGuardNode(w_node, encoding)}
result.append( info )
result.append(info)
return result
def _extractScriptNodes( root, encoding='utf-8' ):
def _extractScriptNodes(root, encoding='utf-8'):
result = []
for s_node in root.getElementsByTagName( 'script' ):
for s_node in root.getElementsByTagName('script'):
try:
function = _getNodeAttribute( s_node, 'function' )
function = _getNodeAttribute(s_node, 'function')
except ValueError:
function = ''
try:
module = _getNodeAttribute( s_node, 'module' )
module = _getNodeAttribute(s_node, 'module')
except ValueError:
module = ''
info = { 'script_id' : _getNodeAttribute( s_node, 'script_id' )
, 'meta_type' : _getNodeAttribute( s_node, 'type' , encoding )
, 'function' : function
, 'module' : module
}
info = {'script_id': _getNodeAttribute(s_node, 'script_id'),
'meta_type': _getNodeAttribute(s_node, 'type', encoding),
'function': function,
'module': module}
filename = _queryNodeAttribute( s_node, 'filename' , None, encoding )
filename = _queryNodeAttribute(s_node, 'filename', None, encoding)
if filename is not None:
info[ 'filename' ] = filename
info['filename'] = filename
result.append( info )
result.append(info)
return result
def _extractPermissionNodes( root, encoding='utf-8' ):
def _extractPermissionNodes(root, encoding='utf-8'):
result = []
for p_node in root.getElementsByTagName( 'permission' ):
for p_node in root.getElementsByTagName('permission'):
result.append( _coalesceTextNodeChildren( p_node, encoding ) )
result.append(_coalesceTextNodeChildren(p_node, encoding))
return result
def _extractActionNode( parent, encoding='utf-8' ):
def _extractActionNode(parent, encoding='utf-8'):
nodes = parent.getElementsByTagName('action')
assert len(nodes) <= 1, nodes
nodes = parent.getElementsByTagName( 'action' )
assert len( nodes ) <= 1, nodes
if len(nodes) < 1:
return {'name': '', 'url': '', 'category': '', 'icon': ''}
if len( nodes ) < 1:
return { 'name' : '', 'url' : '', 'category' : '', 'icon': ''}
node = nodes[0]
node = nodes[ 0 ]
return {'name': _coalesceTextNodeChildren(node, encoding),
'url': _getNodeAttribute(node, 'url', encoding),
'category': _getNodeAttribute(node, 'category', encoding),
'icon': _queryNodeAttribute(node, 'icon', '', encoding)}
return { 'name' : _coalesceTextNodeChildren( node, encoding )
, 'url' : _getNodeAttribute( node, 'url', encoding )
, 'category' : _getNodeAttribute( node, 'category', encoding )
, 'icon' : _queryNodeAttribute( node, 'icon', '', encoding )
}
def _extractGuardNode(parent, encoding='utf-8'):
nodes = parent.getElementsByTagName('guard')
assert len(nodes) <= 1, nodes
def _extractGuardNode( parent, encoding='utf-8' ):
if len(nodes) < 1:
return {'permissions': (), 'roles': (), 'groups': (), 'expr': ''}
nodes = parent.getElementsByTagName( 'guard' )
assert len( nodes ) <= 1, nodes
node = nodes[0]
if len( nodes ) < 1:
return { 'permissions' : (), 'roles' : (), 'groups' : (), 'expr' : '' }
expr_nodes = node.getElementsByTagName('guard-expression')
assert(len(expr_nodes) <= 1)
node = nodes[ 0 ]
expr_text = expr_nodes and _coalesceTextNodeChildren(expr_nodes[0],
encoding) or ''
expr_nodes = node.getElementsByTagName( 'guard-expression' )
assert( len( expr_nodes ) <= 1 )
return {'permissions': [ _coalesceTextNodeChildren(x, encoding)
for x in node.getElementsByTagName(
'guard-permission') ],
'roles': [ _coalesceTextNodeChildren(x, encoding)
for x in node.getElementsByTagName('guard-role') ],
'groups': [ _coalesceTextNodeChildren(x, encoding)
for x in node.getElementsByTagName('guard-group') ],
'expression': expr_text}
expr_text = expr_nodes and _coalesceTextNodeChildren( expr_nodes[ 0 ]
, encoding
) or ''
def _extractDefaultNode(parent, encoding='utf-8'):
nodes = parent.getElementsByTagName('default')
assert len(nodes) <= 1, nodes
return { 'permissions' : [ _coalesceTextNodeChildren( x, encoding )
for x in node.getElementsByTagName(
'guard-permission' ) ]
, 'roles' : [ _coalesceTextNodeChildren( x, encoding )
for x in node.getElementsByTagName( 'guard-role' ) ]
, 'groups' : [ _coalesceTextNodeChildren( x, encoding )
for x in node.getElementsByTagName( 'guard-group' ) ]
, 'expression' : expr_text
}
if len(nodes) < 1:
return {'value': '', 'expression': '', 'type': 'n/a'}
def _extractDefaultNode( parent, encoding='utf-8' ):
node = nodes[0]
nodes = parent.getElementsByTagName( 'default' )
assert len( nodes ) <= 1, nodes
if len( nodes ) < 1:
return { 'value' : '', 'expression' : '', 'type' : 'n/a' }
node = nodes[ 0 ]
value_nodes = node.getElementsByTagName( 'value' )
assert( len( value_nodes ) <= 1 )
value_nodes = node.getElementsByTagName('value')
assert(len(value_nodes) <= 1)
value_type = 'n/a'
if value_nodes:
value_type = value_nodes[ 0 ].getAttribute( 'type' ) or 'n/a'
value_text = value_nodes and _coalesceTextNodeChildren( value_nodes[ 0 ]
, encoding
) or ''
value_type = value_nodes[0].getAttribute('type') or 'n/a'
expr_nodes = node.getElementsByTagName( 'expression' )
assert( len( expr_nodes ) <= 1 )
value_text = value_nodes and _coalesceTextNodeChildren(value_nodes[0],
encoding) or ''
expr_text = expr_nodes and _coalesceTextNodeChildren( expr_nodes[ 0 ]
, encoding
) or ''
expr_nodes = node.getElementsByTagName('expression')
assert(len(expr_nodes) <= 1)
return { 'value' : value_text
, 'type' : value_type
, 'expression' : expr_text
}
expr_text = expr_nodes and _coalesceTextNodeChildren(expr_nodes[0],
encoding) or ''
_SEMICOLON_LIST_SPLITTER = re.compile( r';[ ]*' )
return {'value': value_text, 'type': value_type, 'expression': expr_text}
def _extractMatchNode( parent, encoding='utf-8' ):
_SEMICOLON_LIST_SPLITTER = re.compile(r';[ ]*')
nodes = parent.getElementsByTagName( 'match' )
def _extractMatchNode(parent, encoding='utf-8'):
nodes = parent.getElementsByTagName('match')
result = {}
for node in nodes:
name = _getNodeAttribute( node, 'name', encoding )
values = _getNodeAttribute( node, 'values', encoding )
result[ name ] = _SEMICOLON_LIST_SPLITTER.split( values )
name = _getNodeAttribute(node, 'name', encoding)
values = _getNodeAttribute(node, 'values', encoding)
result[name] = _SEMICOLON_LIST_SPLITTER.split(values)
return result
def _guessVariableType( value ):
def _guessVariableType(value):
from DateTime.DateTime import DateTime
if value is None:
return 'none'
if isinstance( value, DateTime ):
if isinstance(value, DateTime):
return 'datetime'
if isinstance( value, bool ):
if isinstance(value, bool):
return 'bool'
if isinstance( value, int ):
if isinstance(value, int):
return 'int'
if isinstance( value, float ):
if isinstance(value, float):
return 'float'
if isinstance( value, basestring ):
if isinstance(value, basestring):
return 'string'
return 'unknown'
def _convertVariableValue( value, type_id ):
def _convertVariableValue(value, type_id):
from DateTime.DateTime import DateTime
if type_id == 'none':
......@@ -964,24 +902,24 @@ def _convertVariableValue( value, type_id ):
if type_id == 'datetime':
return DateTime( value )
return DateTime(value)
if type_id == 'bool':
if isinstance( value, basestring ):
if isinstance(value, basestring):
value = str( value ).lower()
value = str(value).lower()
return value in ( 'true', 'yes', '1' )
return value in ('true', 'yes', '1')
else:
return bool( value )
return bool(value)
if type_id == 'int':
return int( value )
return int(value)
if type_id == 'float':
return float( value )
return float(value)
return value
......@@ -989,26 +927,24 @@ from Products.PythonScripts.PythonScript import PythonScript
from Products.ExternalMethod.ExternalMethod import ExternalMethod
from OFS.DTMLMethod import DTMLMethod
_METATYPE_SUFFIXES = \
{ PythonScript.meta_type : 'py'
, DTMLMethod.meta_type : 'dtml'
}
def _initDCWorkflow( workflow
, title
, description
, manager_bypass
, creation_guard
, state_variable
, initial_state
, states
, transitions
, variables
, worklists
, permissions
, scripts
, context
):
_METATYPE_SUFFIXES = {
PythonScript.meta_type: 'py',
DTMLMethod.meta_type: 'dtml'}
def _initDCWorkflow(workflow,
title,
description,
manager_bypass,
creation_guard,
state_variable,
initial_state,
states,
transitions,
variables,
worklists,
permissions,
scripts,
context):
""" Initialize a DC Workflow using values parsed from XML.
"""
workflow.title = title
......@@ -1021,208 +957,187 @@ def _initDCWorkflow( workflow
permissions.sort()
workflow.permissions = tuple(permissions)
_initDCWorkflowCreationGuard( workflow, creation_guard )
_initDCWorkflowVariables( workflow, variables )
_initDCWorkflowStates( workflow, states )
_initDCWorkflowTransitions( workflow, transitions )
_initDCWorkflowWorklists( workflow, worklists )
_initDCWorkflowScripts( workflow, scripts, context )
_initDCWorkflowCreationGuard(workflow, creation_guard)
_initDCWorkflowVariables(workflow, variables)
_initDCWorkflowStates(workflow, states)
_initDCWorkflowTransitions(workflow, transitions)
_initDCWorkflowWorklists(workflow, worklists)
_initDCWorkflowScripts(workflow, scripts, context)
def _initDCWorkflowCreationGuard( workflow, guard ):
def _initDCWorkflowCreationGuard(workflow, guard):
"""Initialize Instance creation conditions guard
"""
if guard is None :
if guard is None:
workflow.creation_guard = None
else :
props = { 'guard_roles' : ';'.join( guard[ 'roles' ] )
, 'guard_permissions' : ';'.join( guard[ 'permissions' ] )
, 'guard_groups' : ';'.join( guard[ 'groups' ] )
, 'guard_expr' : guard[ 'expression' ]
}
else:
props = {'guard_roles': ';'.join(guard['roles']),
'guard_permissions': ';'.join(guard['permissions']),
'guard_groups': ';'.join(guard['groups']),
'guard_expr': guard['expression']}
g = Guard()
g.changeFromProperties(props)
workflow.creation_guard = g
def _initDCWorkflowVariables( workflow, variables ):
def _initDCWorkflowVariables(workflow, variables):
""" Initialize DCWorkflow variables
"""
from Products.DCWorkflow.Variables import VariableDefinition
for v_info in variables:
id = str( v_info[ 'variable_id' ] ) # no unicode!
if not workflow.variables.has_key(id):
id = str(v_info['variable_id']) # no unicode!
if not id in workflow.variables:
v = VariableDefinition(id)
workflow.variables._setObject(id, v)
v = workflow.variables._getOb( id )
guard = v_info[ 'guard' ]
props = { 'guard_roles' : ';'.join( guard[ 'roles' ] )
, 'guard_permissions' : ';'.join( guard[ 'permissions' ] )
, 'guard_groups' : ';'.join( guard[ 'groups' ] )
, 'guard_expr' : guard[ 'expression' ]
}
default = v_info[ 'default' ]
default_value = _convertVariableValue( default[ 'value' ]
, default[ 'type' ] )
v.setProperties( description = v_info[ 'description' ]
, default_value = default_value
, default_expr = default[ 'expression' ]
, for_catalog = v_info[ 'for_catalog' ]
, for_status = v_info[ 'for_status' ]
, update_always = v_info[ 'update_always' ]
, props = props
)
def _initDCWorkflowStates( workflow, states ):
v = workflow.variables._getOb(id)
guard = v_info['guard']
props = {'guard_roles': ';'.join(guard['roles']),
'guard_permissions': ';'.join(guard['permissions']),
'guard_groups': ';'.join(guard['groups']),
'guard_expr': guard['expression']}
default = v_info['default']
default_value = _convertVariableValue(default['value'],
default['type'])
v.setProperties(description=v_info['description'],
default_value=default_value,
default_expr=default['expression'],
for_catalog=v_info['for_catalog'],
for_status=v_info['for_status'],
update_always=v_info['update_always'],
props=props)
def _initDCWorkflowStates(workflow, states):
""" Initialize DCWorkflow states
"""
from Products.DCWorkflow.States import StateDefinition
for s_info in states:
id = str( s_info[ 'state_id' ] ) # no unicode!
if not workflow.states.has_key(id):
id = str(s_info['state_id']) # no unicode!
if not id in workflow.states:
s = StateDefinition(id)
workflow.states._setObject(id, s)
s = workflow.states._getOb( id )
s = workflow.states._getOb(id)
s.setProperties( title = s_info[ 'title' ]
, description = s_info[ 'description' ]
, transitions = s_info[ 'transitions' ]
)
s.setProperties(title=s_info['title'],
description=s_info['description'],
transitions=s_info['transitions'])
for k, v in s_info[ 'permissions' ].items():
s.setPermission( k, isinstance(v, list), v )
for k, v in s_info['permissions'].items():
s.setPermission(k, isinstance(v, list), v)
gmap = s.group_roles = PersistentMapping()
for group_id, roles in s_info[ 'groups' ]:
gmap[ group_id ] = roles
for group_id, roles in s_info['groups']:
gmap[group_id] = roles
vmap = s.var_values = PersistentMapping()
for name, v_info in s_info[ 'variables' ].items():
value = _convertVariableValue( v_info[ 'value' ]
, v_info[ 'type' ] )
vmap[ name ] = value
def _initDCWorkflowTransitions( workflow, transitions ):
for name, v_info in s_info['variables'].items():
value = _convertVariableValue(v_info['value'], v_info['type'])
vmap[name] = value
def _initDCWorkflowTransitions(workflow, transitions):
""" Initialize DCWorkflow transitions
"""
from Products.DCWorkflow.Transitions import TransitionDefinition
for t_info in transitions:
id = str( t_info[ 'transition_id' ] ) # no unicode!
if not workflow.transitions.has_key(id):
id = str(t_info['transition_id']) # no unicode!
if not id in workflow.transitions:
t = TransitionDefinition(id)
workflow.transitions._setObject(id, t)
t = workflow.transitions._getOb( id )
trigger_type = list( TRIGGER_TYPES ).index( t_info[ 'trigger' ] )
action = t_info[ 'action' ]
guard = t_info[ 'guard' ]
props = { 'guard_roles' : ';'.join( guard[ 'roles' ] )
, 'guard_permissions' : ';'.join( guard[ 'permissions' ] )
, 'guard_groups' : ';'.join( guard[ 'groups' ] )
, 'guard_expr' : guard[ 'expression' ]
}
t.setProperties( title = t_info[ 'title' ]
, description = t_info[ 'description' ]
, new_state_id = t_info[ 'new_state' ]
, trigger_type = trigger_type
, script_name = t_info[ 'before_script' ]
, after_script_name = t_info[ 'after_script' ]
, actbox_name = action[ 'name' ]
, actbox_url = action[ 'url' ]
, actbox_category = action[ 'category' ]
, actbox_icon = action.get('icon', '')
, props = props
)
var_mapping = [(name, Expression(text)) for name, text in
t_info[ 'variables' ].items()]
t = workflow.transitions._getOb(id)
trigger_type = list(TRIGGER_TYPES).index(t_info['trigger'])
action = t_info['action']
guard = t_info['guard']
props = {'guard_roles': ';'.join(guard['roles']),
'guard_permissions': ';'.join(guard['permissions']),
'guard_groups': ';'.join(guard['groups']),
'guard_expr': guard['expression']}
t.setProperties(title=t_info['title'],
description=t_info['description'],
new_state_id=t_info['new_state'],
trigger_type=trigger_type,
script_name=t_info['before_script'],
after_script_name=t_info['after_script'],
actbox_name=action['name'],
actbox_url=action['url'],
actbox_category=action['category'],
actbox_icon=action.get('icon', ''),
props=props)
var_mapping = [ (name, Expression(text))
for name, text in t_info['variables'].items() ]
t.var_exprs = PersistentMapping(var_mapping)
def _initDCWorkflowWorklists( workflow, worklists ):
def _initDCWorkflowWorklists(workflow, worklists):
""" Initialize DCWorkflow worklists
"""
from Products.DCWorkflow.Worklists import WorklistDefinition
for w_info in worklists:
id = str( w_info[ 'worklist_id' ] ) # no unicode!
if not workflow.worklists.has_key(id):
id = str(w_info['worklist_id']) # no unicode!
if not id in workflow.worklists:
w = WorklistDefinition(id)
workflow.worklists._setObject(id, w)
w = workflow.worklists._getOb( id )
w = workflow.worklists._getOb(id)
action = w_info[ 'action' ]
action = w_info['action']
guard = w_info[ 'guard' ]
props = { 'guard_roles' : ';'.join( guard[ 'roles' ] )
, 'guard_permissions' : ';'.join( guard[ 'permissions' ] )
, 'guard_groups' : ';'.join( guard[ 'groups' ] )
, 'guard_expr' : guard[ 'expression' ]
}
guard = w_info['guard']
props = {'guard_roles': ';'.join(guard['roles']),
'guard_permissions': ';'.join(guard['permissions']),
'guard_groups': ';'.join(guard['groups']),
'guard_expr': guard['expression']}
w.setProperties( description = w_info[ 'description' ]
, actbox_name = action[ 'name' ]
, actbox_url = action[ 'url' ]
, actbox_category = action[ 'category' ]
, actbox_icon = action.get('icon', '')
, props = props
)
w.setProperties(description=w_info['description'],
actbox_name=action['name'],
actbox_url=action['url'],
actbox_category=action['category'],
actbox_icon=action.get('icon', ''),
props=props)
w.var_matches = PersistentMapping()
for k, v in w_info[ 'match' ].items():
w.var_matches[ str( k ) ] = tuple( [ str(x) for x in v ] )
def _initDCWorkflowScripts( workflow, scripts, context ):
for k, v in w_info['match'].items():
w.var_matches[str(k)] = tuple([ str(x) for x in v ])
def _initDCWorkflowScripts(workflow, scripts, context):
""" Initialize DCWorkflow scripts
"""
for s_info in scripts:
id = str( s_info[ 'script_id' ] ) # no unicode!
meta_type = s_info[ 'meta_type' ]
filename = s_info[ 'filename' ]
id = str(s_info['script_id']) # no unicode!
meta_type = s_info['meta_type']
filename = s_info['filename']
file = ''
if filename:
file = context.readDataFile( filename )
file = context.readDataFile(filename)
if meta_type == PythonScript.meta_type:
script = PythonScript( id )
script.write( file )
script = PythonScript(id)
script.write(file)
elif meta_type == ExternalMethod.meta_type:
script = ExternalMethod( id
, ''
, s_info['module']
, s_info['function']
)
script = ExternalMethod(id, '', s_info['module'],
s_info['function'])
elif meta_type == DTMLMethod.meta_type:
script = DTMLMethod( file, __name__=id )
script = DTMLMethod(file, __name__=id)
else:
for mt in workflow.scripts.filtered_meta_types():
if mt['name']==meta_type:
if mt['name'] == meta_type:
if hasattr(mt['instance'], 'write'):
script = mt['instance'](id)
script.write(file)
......@@ -1230,24 +1145,23 @@ def _initDCWorkflowScripts( workflow, scripts, context ):
script = mt['instance'](file, __name__=id)
break
else:
raise ValueError, 'Invalid type: %s' % meta_type
raise ValueError('Invalid type: %s' % meta_type)
if workflow.scripts.has_key(id):
if id in workflow.scripts:
workflow.scripts._delObject(id)
workflow.scripts._setObject( id, script )
workflow.scripts._setObject(id, script)
#
# deprecated DOM parsing utilities
#
_marker = object()
def _queryNodeAttribute( node, attr_name, default, encoding='utf-8' ):
def _queryNodeAttribute(node, attr_name, default, encoding='utf-8'):
""" Extract a string-valued attribute from node.
o Return 'default' if the attribute is not present.
"""
attr_node = node.attributes.get( attr_name, _marker )
attr_node = node.attributes.get(attr_name, _marker)
if attr_node is _marker:
return default
......@@ -1255,46 +1169,42 @@ def _queryNodeAttribute( node, attr_name, default, encoding='utf-8' ):
value = attr_node.nodeValue
if encoding is not None:
value = value.encode( encoding )
value = value.encode(encoding)
return value
def _getNodeAttribute( node, attr_name, encoding='utf-8' ):
def _getNodeAttribute(node, attr_name, encoding='utf-8'):
""" Extract a string-valued attribute from node.
"""
value = _queryNodeAttribute( node, attr_name, _marker, encoding )
value = _queryNodeAttribute(node, attr_name, _marker, encoding)
if value is _marker:
raise ValueError, 'Invalid attribute: %s' % attr_name
raise ValueError('Invalid attribute: %s' % attr_name)
return value
def _queryNodeAttributeBoolean( node, attr_name, default ):
def _queryNodeAttributeBoolean(node, attr_name, default):
""" Extract a string-valued attribute from node.
o Return 'default' if the attribute is not present.
"""
attr_node = node.attributes.get( attr_name, _marker )
attr_node = node.attributes.get(attr_name, _marker)
if attr_node is _marker:
return default
value = node.attributes[ attr_name ].nodeValue.lower()
value = node.attributes[attr_name].nodeValue.lower()
return value in ( 'true', 'yes', '1' )
def _getNodeAttributeBoolean( node, attr_name ):
return value in ('true', 'yes', '1')
def _getNodeAttributeBoolean(node, attr_name):
""" Extract a string-valued attribute from node.
"""
value = node.attributes[ attr_name ].nodeValue.lower()
return value in ( 'true', 'yes', '1' )
value = node.attributes[attr_name].nodeValue.lower()
def _coalesceTextNodeChildren( node, encoding='utf-8' ):
return value in ('true', 'yes', '1')
def _coalesceTextNodeChildren(node, encoding='utf-8'):
""" Concatenate all childe text nodes into a single string.
"""
from xml.dom import Node
......@@ -1305,19 +1215,19 @@ def _coalesceTextNodeChildren( node, encoding='utf-8' ):
while child is not None:
if child.nodeType == Node.TEXT_NODE:
fragments.append( child.nodeValue )
fragments.append(child.nodeValue)
child = child.nextSibling
joined = ''.join( fragments )
joined = ''.join(fragments)
if encoding is not None:
joined = joined.encode( encoding )
joined = joined.encode(encoding)
return ''.join( [ line.lstrip() for line in joined.splitlines(True) ] ).rstrip()
return ''.join([ line.lstrip()
for line in joined.splitlines(True) ]).rstrip()
def _extractDescriptionNode(parent, encoding='utf-8'):
d_nodes = parent.getElementsByTagName('description')
if d_nodes:
return _coalesceTextNodeChildren(d_nodes[0], encoding)
......
......@@ -23,8 +23,8 @@ from zope.i18nmessageid import MessageFactory
security = ModuleSecurityInfo('Products.DCWorkflow.utils')
_dtmldir = os.path.join( package_home( globals() ), 'dtml' )
_xmldir = os.path.join( package_home( globals() ), 'xml' )
_dtmldir = os.path.join(package_home(globals()), 'dtml')
_xmldir = os.path.join(package_home(globals()), 'xml')
def ac_inherited_permissions(ob, all=0):
......@@ -33,14 +33,15 @@ def ac_inherited_permissions(ob, all=0):
# an empty tuple as the second.
d = {}
perms = getattr(ob, '__ac_permissions__', ())
for p in perms: d[p[0]] = None
for p in perms:
d[p[0]] = None
r = gather_permissions(ob.__class__, [], d)
if all:
if hasattr(ob, '_subobject_permissions'):
for p in ob._subobject_permissions():
pname=p[0]
if not d.has_key(pname):
d[pname]=1
pname = p[0]
if not pname in d:
d[pname] = 1
r.append(p)
r = list(perms) + r
return r
......@@ -92,7 +93,7 @@ def modifyRolesForGroup(ob, group, grant_roles, managed_roles):
roles.remove(role)
changed = 1
if changed:
if not roles and local_roles.has_key(group):
if not roles and group in local_roles:
del local_roles[group]
else:
local_roles[group] = roles
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment