Commit 6119445c authored by wenjie.zheng's avatar wenjie.zheng

Interaction.py: complete the execution part.

parent c0d00075
......@@ -26,7 +26,7 @@
#
##############################################################################
from AccessControl import ClassSecurityInfo
from AccessControl import getSecurityManager, ClassSecurityInfo
from Products.ERP5Type import Permissions, PropertySheet
from Products.ERP5Type.XMLObject import XMLObject
from Products.ERP5Type.Globals import PersistentMapping
......@@ -53,6 +53,7 @@ class Interaction(XMLObject):
managed_role = ()
erp5_permission_roles = {} # { permission: [role] or (role,) }
manager_bypass = 0
method_id = ()
trigger_type = TRIGGER_WORKFLOW_METHOD
script_name = () # Executed before transition
after_script_name = () # Executed after transition
......@@ -116,6 +117,99 @@ class Interaction(XMLObject):
elif self.guard.expr != self.getExpression():
self.guard.expr = self.getExpression()
def execute(self, ob, workflow, result, args=None, kw=None):
### zwj: What will be done this part
### this part shoud be called in Base.py as transition be called.
# 1: execute before script;
# 2: execute after script;
# 3: Queue before commit script;
# 4: execute activity script.
workflow = self.getParent()
assert self.trigger_type == TRIGGER_WORKFLOW_METHOD
# Initialize variables
former_status = workflow._getStatusOf(ob)
econtext = None
sci = None
# Update variables.
tdef_exprs = self.var_exprs
if tdef_exprs is None: tdef_exprs = {}
status = {}
for vdef in workflow.objectValues(portal_type='Variable'):
id = vdef.getId()
if not vdef.for_status:
continue
expr = None
if id in tdef_exprs:
expr = tdef_exprs[id]
elif not vdef.update_always and id in former_status:
# Preserve former value
value = former_status[id]
else:
if vdef.default_expr is not None:
expr = vdef.default_expr
else:
value = vdef.default_value
if expr is not None:
# Evaluate an expression.
if econtext is None:
# Lazily create the expression context.
if sci is None:
sci = StateChangeInfo(
ob, workflow, former_status, self,
None, None, None)
econtext = createExprContext(sci)
value = expr(econtext)
status[id] = value
sci = StateChangeInfo(
ob, worfklow, former_status, self, None, None, kwargs=kw)
# Execute the "after" script.
for script_name in self.after_script_name:
script = workflow._getOb(script_name)
# Pass lots of info to the script in a single parameter.
script(sci) # May throw an exception
# Queue the "Before Commit" scripts
sm = getSecurityManager()
for script_name in self.before_commit_script_name:
transaction.get().addBeforeCommitHook(self._before_commit,
(sci, script_name, sm))
# Execute "activity" scripts
for script_name in self.activate_script_name:
workflow.activate(activity='SQLQueue')\
.activeScript(script_name, ob.getRelativeUrl(),
status, self.getId())
def _before_commit(self, sci, script_name, security_manager):
# check the object still exists before calling the script
ob = sci.object
workflow = self.getParent()
while ob.isTempObject():
ob = ob.getParentValue()
if aq_base(self.unrestrictedTraverse(ob.getPhysicalPath(), None)) is \
aq_base(ob):
current_security_manager = getSecurityManager()
try:
# Who knows what happened to the authentication context
# between here and when the interaction was executed... So we
# need to switch to the security manager as it was back then
setSecurityManager(security_manager)
workflow._getOb(script_name)(sci)
finally:
setSecurityManager(current_security_manager)
def activeScript(self, script_name, ob_url, status):
workflow = self.getParent()
script = workflow._getOb(script_name)
ob = self.unrestrictedTraverse(ob_url)
sci = StateChangeInfo(
ob, workflow, status, self, None, None, None)
script(sci)
def getVarExprText(self, id):
if not self.var_exprs:
return ''
......
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