Commit 0fcbca5e authored by wenjie.zheng's avatar wenjie.zheng Committed by Sebastien Robin

WorkflowTool.py: add workfow conversion related functions.

parent dd9a31cd
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
# #
############################################################################## ##############################################################################
import cPickle
import os import os
import shutil import shutil
import sys import sys
...@@ -34,7 +35,6 @@ import subprocess ...@@ -34,7 +35,6 @@ import subprocess
import time import time
import transaction import transaction
import struct import struct
import cPickle
import urllib2 import urllib2
import re import re
...@@ -215,23 +215,6 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool): ...@@ -215,23 +215,6 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
raise WorkflowException(msg) raise WorkflowException(msg)
return res return res
def getWorkflowTempObjectList(self):
""" Return a list of converted temporary workflows. Only necessary in
Workflow Tool to get temporarilly converted DCWorkflow.
"""
temp_workflow_list = []
temp_workflow_id_list = []
for dc_workflow_id in self.getPortalObject().portal_workflow:
dc_workflow = self.getPortalObject().portal_workflow.get(dc_workflow_id)
workflow_type = dc_workflow.__class__.__name__
if workflow_type == 'Workflow' or workflow_type == 'Interaction Workflow':
continue
temp_obj = 1
temp_workflow = self.dc_workflow_asERP5Object(self, dc_workflow, temp_obj)
temp_workflow_list.append(temp_workflow)
temp_workflow_id_list.append(temp_workflow.getTitle())
return temp_workflow_list
def getWorkflowValueListFor(self, portal_type_id): def getWorkflowValueListFor(self, portal_type_id):
""" Return a list of workflows bound to selected portal_type. """ Return a list of workflows bound to selected portal_type.
""" """
...@@ -264,24 +247,68 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool): ...@@ -264,24 +247,68 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
return wfh[-1] return wfh[-1]
return None return None
def decodeWorkflowUid(self, uid):
return cPickle.loads(b64decode(uid))
def encodeWorkflowUid(self, id):
return b64encode(cPickle.dumps(id))
def getObjectFromPath(self, path):
return self.unrestrictedTraverse(path)
def getWorkflowTempObjectList(self, temp_obj=1):
""" Return a list of converted temporary workflows. Only necessary in
Workflow Tool to get temporarilly converted DCWorkflow.
"""
temp_workflow_list = []
temp_workflow_id_list = []
for dc_workflow in self.getPortalObject().portal_workflow.objectValues():
LOG( "Getting workflow '%s'"%dc_workflow.id, WARNING, " in WorkflowTool.py 257")
workflow_type = dc_workflow.__class__.__name__
if workflow_type == 'Workflow' or workflow_type == 'Interaction Workflow':
LOG( "Ingore workflow '%s'"%dc_workflow.id, WARNING, " in WorkflowTool.py 260")
continue
temp_workflow = self.dc_workflow_asERP5Object(self, dc_workflow, temp_obj)
temp_workflow_list.append(temp_workflow)
temp_workflow_id_list.append(temp_workflow.getTitle())
return temp_workflow_list
def dc_workflow_asERP5Object(self, container, dc_workflow, temp): def dc_workflow_asERP5Object(self, container, dc_workflow, temp):
# create a temporary ERP5 Workflow # create a temporary ERP5 Workflow
workflow_type_id = dc_workflow.__class__.__name__ workflow_type_id = dc_workflow.__class__.__name__
if workflow_type_id == 'DCWorkflowDefinition': if workflow_type_id == 'DCWorkflowDefinition':
LOG("2.a Workflow '%s' is a DCWorkflow'"%dc_workflow.id,WARNING,' in WorkflowTool.py') LOG("2.a Workflow '%s' is a DCWorkflow'"%dc_workflow.id,WARNING,' in WorkflowTool.py')
workflow = container.newContent(portal_type='Workflow', temp_object=temp) if temp == 0:
new_id = 'workflow_' + dc_workflow.id
else:
new_id = dc_workflow.id
uid = self.encodeWorkflowUid(new_id)
workflow = container.newContent(id=new_id, portal_type='Workflow', temp_object=temp)
LOG(" New workflow created '%s' '%s'"%(workflow.getId(), workflow.getPortalType()), WARNING, "in WorkfowTool.py")
workflow.setStateVariable(dc_workflow.state_var) workflow.setStateVariable(dc_workflow.state_var)
workflow.setWorkflowManagedPermission(dc_workflow.permissions) workflow.setWorkflowManagedPermission(dc_workflow.permissions)
workflow.setSource(dc_workflow.initial_state)
else: else:
LOG("2.b Workflow '%s' is a DC Interaction Workflow"%dc_workflow.getTitle(),WARNING,' in WorkflowTool.py') LOG("2.b Workflow '%s' is a DC Interaction Workflow"%dc_workflow.getTitle(),WARNING,' in WorkflowTool.py')
workflow = container.newContent(portal_type='Interaction Workflow', temp_object=temp) if temp == 0:
new_id = 'interactionworkflow_' + dc_workflow.id
else:
new_id = dc_workflow.id
uid = self.encodeWorkflowUid(new_id)
workflow = container.newContent(id=new_id, portal_type='Interaction Workflow', temp_object=temp)
LOG(" New workflow created '%s' '%s'"%(workflow.getId(), workflow.getPortalType()), WARNING, "in WorkfowTool.py")
workflow.setManagerBypass(dc_workflow.manager_bypass) workflow.setManagerBypass(dc_workflow.manager_bypass)
workflow.setReference(dc_workflow.id) if temp == 1:
# give temp workflow an uid for form_dialog.
workflow.uid = uid
workflow.default_reference = dc_workflow.id
workflow.edit(title=dc_workflow.title) workflow.edit(title=dc_workflow.title)
workflow.edit(description=dc_workflow.description) workflow.edit(description=dc_workflow.description)
if temp == 0: # convert under request only
LOG("Converting DCWorkflow", WARNING, " in WorkflowTool.py")
# create transitions # create transitions
if workflow_type_id == 'DCWorkflowDefinition': if workflow_type_id == 'DCWorkflowDefinition':
for tid in dc_workflow.transitions: for tid in dc_workflow.transitions:
...@@ -308,6 +335,7 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool): ...@@ -308,6 +335,7 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
state.setReference(sdef.id) state.setReference(sdef.id)
state.setStatePermissionRoles(sdef.permission_roles) state.setStatePermissionRoles(sdef.permission_roles)
state.setDestinationList(sdef.transitions) state.setDestinationList(sdef.transitions)
workflow.setSource(getattr(workflow, 'state_'+dc_workflow.initial_state).getPath())
# create worklists (portal_type = Worklist) # create worklists (portal_type = Worklist)
for qid in dc_workflow.worklists: for qid in dc_workflow.worklists:
qdef = dc_workflow.worklists.get(qid) qdef = dc_workflow.worklists.get(qid)
...@@ -353,9 +381,9 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool): ...@@ -353,9 +381,9 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
workflow_script = workflow.newContent(portal_type='Workflow Script', temp_object=temp) workflow_script = workflow.newContent(portal_type='Workflow Script', temp_object=temp)
LOG("2.5 Convert workflow script '%s' of workflow '%s'"%(workflow_script.id,workflow.getTitle()),WARNING,' in WorkflowTool.py') LOG("2.5 Convert workflow script '%s' of workflow '%s'"%(workflow_script.id,workflow.getTitle()),WARNING,' in WorkflowTool.py')
workflow_script.edit(title=script.title) workflow_script.edit(title=script.title)
workflow_script.setId(script.id) workflow_script.id = script.id
workflow_script.setParameterSignature(script._params) workflow_script.setParameterSignature(script._params)
#workflow_script.setCallableType(script.callable_type)# not defined in DC script? #workflow_script.setCallableType(script.callable_type)# not defined in python script?
workflow_script.setBody(script._body) workflow_script.setBody(script._body)
workflow_script.setProxyRole(script._proxy_roles) workflow_script.setProxyRole(script._proxy_roles)
# create variables (portal_type = Variable) # create variables (portal_type = Variable)
...@@ -535,6 +563,12 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool): ...@@ -535,6 +563,12 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
return getattr(self, return getattr(self,
'Base_getWorklistIgnoredSecurityColumnSet', lambda: ())() 'Base_getWorklistIgnoredSecurityColumnSet', lambda: ())()
def getTypeCBT(self, pt):
return self._chains_by_type.get(pt)
def delTypeCBT(self, pt, wf_id):
self._chains_by_type = tuple(list(self._chains_by_type).remove(wf_id))
def listActions(self, info=None, object=None, src__=False): def listActions(self, info=None, object=None, src__=False):
""" """
Returns a list of actions to be displayed to the user. Returns a list of actions to be displayed to the user.
......
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