Commit 71b83d25 authored by Tres Seaver's avatar Tres Seaver Committed by GitHub

Merge pull request #3 from zopefoundation/pr1-merge-to-master

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