Commit f842f060 authored by Tres Seaver's avatar Tres Seaver

Forward-port changes from PR #1 to master.

parent f38ccf47
...@@ -4,6 +4,8 @@ Products.DCWorkflow Changelog ...@@ -4,6 +4,8 @@ Products.DCWorkflow Changelog
2.3.0 (unreleased) 2.3.0 (unreleased)
------------------ ------------------
- Export / import workflow-managed groups.
2.3.0-beta (2012-03-21) 2.3.0-beta (2012-03-21)
----------------------- -----------------------
......
...@@ -64,6 +64,7 @@ class DCWorkflowDefinitionBodyAdapter(BodyAdapterBase): ...@@ -64,6 +64,7 @@ class DCWorkflowDefinitionBodyAdapter(BodyAdapterBase):
variables, variables,
worklists, worklists,
permissions, permissions,
groups,
scripts, scripts,
description, description,
manager_bypass, manager_bypass,
...@@ -82,6 +83,7 @@ class DCWorkflowDefinitionBodyAdapter(BodyAdapterBase): ...@@ -82,6 +83,7 @@ class DCWorkflowDefinitionBodyAdapter(BodyAdapterBase):
variables, variables,
worklists, worklists,
permissions, permissions,
groups,
scripts, scripts,
self.environ) self.environ)
...@@ -170,6 +172,7 @@ class WorkflowDefinitionConfigurator(Implicit): ...@@ -170,6 +172,7 @@ class WorkflowDefinitionConfigurator(Implicit):
variables = _extractVariableNodes(root, encoding) variables = _extractVariableNodes(root, encoding)
worklists = _extractWorklistNodes(root, encoding) worklists = _extractWorklistNodes(root, encoding)
permissions = _extractPermissionNodes(root, encoding) permissions = _extractPermissionNodes(root, encoding)
groups = _extractGroupNodes(root, encoding)
scripts = _extractScriptNodes(root, encoding) scripts = _extractScriptNodes(root, encoding)
return (workflow_id, return (workflow_id,
...@@ -181,6 +184,7 @@ class WorkflowDefinitionConfigurator(Implicit): ...@@ -181,6 +184,7 @@ class WorkflowDefinitionConfigurator(Implicit):
variables, variables,
worklists, worklists,
permissions, permissions,
groups,
scripts, scripts,
description, description,
manager_bypass, manager_bypass,
...@@ -205,6 +209,8 @@ class WorkflowDefinitionConfigurator(Implicit): ...@@ -205,6 +209,8 @@ class WorkflowDefinitionConfigurator(Implicit):
'permissions' -- a list of names of permissions managed 'permissions' -- a list of names of permissions managed
by the workflow by the workflow
'groups' -- a list of names of groups managed by the workflow
'state_variable' -- the name of the workflow's "main" 'state_variable' -- the name of the workflow's "main"
state variable state variable
...@@ -231,6 +237,7 @@ class WorkflowDefinitionConfigurator(Implicit): ...@@ -231,6 +237,7 @@ class WorkflowDefinitionConfigurator(Implicit):
workflow_info['state_variable'] = workflow.state_var workflow_info['state_variable'] = workflow.state_var
workflow_info['initial_state'] = workflow.initial_state workflow_info['initial_state'] = workflow.initial_state
workflow_info['permissions'] = workflow.permissions workflow_info['permissions'] = workflow.permissions
workflow_info['groups'] = workflow.groups
workflow_info['variable_info'] = self._extractVariables(workflow) workflow_info['variable_info'] = self._extractVariables(workflow)
workflow_info['state_info'] = self._extractStates(workflow) workflow_info['state_info'] = self._extractStates(workflow)
workflow_info['transition_info'] = self._extractTransitions(workflow) workflow_info['transition_info'] = self._extractTransitions(workflow)
...@@ -791,6 +798,15 @@ def _extractPermissionNodes(root, encoding='utf-8'): ...@@ -791,6 +798,15 @@ def _extractPermissionNodes(root, encoding='utf-8'):
return result return result
def _extractGroupNodes(root, encoding='utf-8'):
result = []
for p_node in root.getElementsByTagName('group'):
result.append(_coalesceTextNodeChildren(p_node, encoding))
return result
def _extractActionNode(parent, encoding='utf-8'): def _extractActionNode(parent, encoding='utf-8'):
nodes = parent.getElementsByTagName('action') nodes = parent.getElementsByTagName('action')
assert len(nodes) <= 1, nodes assert len(nodes) <= 1, nodes
...@@ -943,6 +959,7 @@ def _initDCWorkflow(workflow, ...@@ -943,6 +959,7 @@ def _initDCWorkflow(workflow,
variables, variables,
worklists, worklists,
permissions, permissions,
groups,
scripts, scripts,
context): context):
""" Initialize a DC Workflow using values parsed from XML. """ Initialize a DC Workflow using values parsed from XML.
...@@ -952,6 +969,7 @@ def _initDCWorkflow(workflow, ...@@ -952,6 +969,7 @@ def _initDCWorkflow(workflow,
workflow.manager_bypass = manager_bypass and 1 or 0 workflow.manager_bypass = manager_bypass and 1 or 0
workflow.state_var = state_variable workflow.state_var = state_variable
workflow.initial_state = initial_state workflow.initial_state = initial_state
workflow.groups = groups
permissions = permissions[:] permissions = permissions[:]
permissions.sort() permissions.sort()
......
...@@ -571,6 +571,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -571,6 +571,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
variables, variables,
worklists, worklists,
permissions, permissions,
groups,
scripts, scripts,
description, description,
_manager_bypass, _manager_bypass,
...@@ -587,6 +588,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -587,6 +588,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
self.assertEqual(len(variables), 0) self.assertEqual(len(variables), 0)
self.assertEqual(len(worklists), 0) self.assertEqual(len(worklists), 0)
self.assertEqual(len(permissions), 0) self.assertEqual(len(permissions), 0)
self.assertEqual(len(groups), 0)
self.assertEqual(len(scripts), 0) self.assertEqual(len(scripts), 0)
def test_parseWorkflowXML_normal_attribs(self): def test_parseWorkflowXML_normal_attribs(self):
...@@ -608,6 +610,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -608,6 +610,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
_variables, _variables,
_worklists, _worklists,
_permissions, _permissions,
_groups,
_scripts, _scripts,
description, description,
_manager_bypass, _manager_bypass,
...@@ -645,6 +648,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -645,6 +648,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
_variables, _variables,
_worklists, _worklists,
_permissions, _permissions,
_groups,
_scripts, _scripts,
description, description,
_manager_bypass, _manager_bypass,
...@@ -708,6 +712,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -708,6 +712,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
_variables, _variables,
_worklists, _worklists,
_permissions, _permissions,
_groups,
_scripts, _scripts,
description, description,
_manager_bypass, _manager_bypass,
...@@ -759,6 +764,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -759,6 +764,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
_variables, _variables,
_worklists, _worklists,
_permissions, _permissions,
_groups,
_scripts, _scripts,
description, description,
_manager_bypass, _manager_bypass,
...@@ -823,6 +829,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -823,6 +829,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
variables, variables,
_worklists, _worklists,
_permissions, _permissions,
_groups,
_scripts, _scripts,
description, description,
_manager_bypass, _manager_bypass,
...@@ -898,6 +905,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -898,6 +905,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
variables, variables,
_worklists, _worklists,
_permissions, _permissions,
_groups,
_scripts, _scripts,
description, description,
_manager_bypass, _manager_bypass,
...@@ -973,6 +981,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -973,6 +981,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
_variables, _variables,
worklists, worklists,
_permissions, _permissions,
_groups,
_scripts, _scripts,
description, description,
_manager_bypass, _manager_bypass,
...@@ -1030,6 +1039,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -1030,6 +1039,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
_variables, _variables,
_worklists, _worklists,
permissions, permissions,
_groups,
_scripts, _scripts,
_description, _description,
_manager_bypass, _manager_bypass,
...@@ -1047,6 +1057,40 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -1047,6 +1057,40 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
for permission in permissions: for permission in permissions:
self.assertTrue(permission in _WF_PERMISSIONS) self.assertTrue(permission in _WF_PERMISSIONS)
def test_parseWorkflowXML_normal_groups(self):
WF_ID = 'normal'
WF_TITLE = 'Normal DCWorkflow'
WF_DESCRIPTION = 'Normal workflow'
WF_INITIAL_STATE = 'closed'
site, _wtool = self._initSite()
configurator = self._makeOne(site).__of__(site)
(_workflow_id,
_title,
_state_variable,
_initial_state,
_states,
_transitions,
_variables,
_worklists,
_permissions,
groups,
_scripts,
_description,
_manager_bypass,
_creation_guard
) = configurator.parseWorkflowXML(
_NORMAL_WORKFLOW_EXPORT
% {'workflow_id': WF_ID,
'title': WF_TITLE,
'description': WF_DESCRIPTION,
'initial_state': WF_INITIAL_STATE,
'workflow_filename': WF_ID.replace(' ', '_')})
self.assertEqual(set(groups), set(_WF_GROUPS))
def test_parseWorkflowXML_normal_scripts(self): def test_parseWorkflowXML_normal_scripts(self):
WF_ID = 'normal' WF_ID = 'normal'
WF_TITLE = 'Normal DCWorkflow' WF_TITLE = 'Normal DCWorkflow'
...@@ -1066,6 +1110,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker): ...@@ -1066,6 +1110,7 @@ class WorkflowDefinitionConfiguratorTests(_WorkflowSetup, _GuardChecker):
_variables, _variables,
_worklists, _worklists,
_permissions, _permissions,
_groups,
scripts, scripts,
_description, _description,
_manager_bypass, _manager_bypass,
...@@ -1457,6 +1502,8 @@ _OLD_WORKFLOW_EXPORT = """\ ...@@ -1457,6 +1502,8 @@ _OLD_WORKFLOW_EXPORT = """\
state_variable="state" state_variable="state"
initial_state="%(initial_state)s" initial_state="%(initial_state)s"
manager_bypass="False"> manager_bypass="False">
<group>Content_owners</group>
<group>Content_assassins</group>
<permission>Open content for modifications</permission> <permission>Open content for modifications</permission>
<permission>Modify content</permission> <permission>Modify content</permission>
<permission>Query history</permission> <permission>Query history</permission>
...@@ -1702,6 +1749,8 @@ _NORMAL_WORKFLOW_EXPORT = """\ ...@@ -1702,6 +1749,8 @@ _NORMAL_WORKFLOW_EXPORT = """\
state_variable="state" state_variable="state"
initial_state="%(initial_state)s" initial_state="%(initial_state)s"
manager_bypass="False"> manager_bypass="False">
<group>Content_owners</group>
<group>Content_assassins</group>
<permission>Open content for modifications</permission> <permission>Open content for modifications</permission>
<permission>Modify content</permission> <permission>Modify content</permission>
<permission>Query history</permission> <permission>Query history</permission>
...@@ -2795,6 +2844,8 @@ class Test_importWorkflow(_WorkflowSetup, _GuardChecker): ...@@ -2795,6 +2844,8 @@ class Test_importWorkflow(_WorkflowSetup, _GuardChecker):
len(_WF_TRANSITIONS)) len(_WF_TRANSITIONS))
self.assertEqual(len(workflow.permissions), self.assertEqual(len(workflow.permissions),
len(_WF_PERMISSIONS)) len(_WF_PERMISSIONS))
self.assertEqual(len(workflow.groups),
len(_WF_GROUPS))
self.assertEqual(len(workflow.scripts.objectItems()), self.assertEqual(len(workflow.scripts.objectItems()),
len(_WF_SCRIPTS)) len(_WF_SCRIPTS))
self.assertEqual(len(workflow.worklists.objectItems()), self.assertEqual(len(workflow.worklists.objectItems()),
......
...@@ -33,6 +33,10 @@ tal:condition="creation_guard/guard_expr"> ...@@ -33,6 +33,10 @@ tal:condition="creation_guard/guard_expr">
tal:content="creation_guard/guard_expr">EXPR</guard-expression></tal:case> tal:content="creation_guard/guard_expr">EXPR</guard-expression></tal:case>
</guard> </guard>
</instance-creation-conditions></tal:case><tal:case </instance-creation-conditions></tal:case><tal:case
tal:condition="info/groups">
<group
tal:repeat="group info/groups"
tal:content="group">GROUP</group></tal:case><tal:case
tal:condition="info/permissions"> tal:condition="info/permissions">
<permission <permission
tal:repeat="permission info/permissions" tal:repeat="permission info/permissions"
......
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