From dab41b235d53806ec45afdb66568cbc80860a246 Mon Sep 17 00:00:00 2001
From: Wenjie Zheng <wenjie.zheng@tiolive.com>
Date: Tue, 17 Mar 2015 21:12:58 +0000
Subject: [PATCH] patches/WorkflowTool.py: add doActionFor's compability.

---
 product/ERP5Type/patches/WorkflowTool.py | 67 +++++++++++++++---------
 1 file changed, 42 insertions(+), 25 deletions(-)

diff --git a/product/ERP5Type/patches/WorkflowTool.py b/product/ERP5Type/patches/WorkflowTool.py
index 8bbf7b7c02..2ff3651b77 100644
--- a/product/ERP5Type/patches/WorkflowTool.py
+++ b/product/ERP5Type/patches/WorkflowTool.py
@@ -25,7 +25,7 @@ from Products.CMFCore.WorkflowCore import ObjectMoved, ObjectDeleted
 from Products.CMFCore.WorkflowCore import WorkflowException
 from Products.DCWorkflow.DCWorkflow import DCWorkflowDefinition
 from Products.DCWorkflow.Transitions import TRIGGER_WORKFLOW_METHOD
-
+from Products.CMFCore.utils import Message as _
 from Products.CMFCore.utils import getToolByName
 from Products.ZSQLCatalog.SQLCatalog import SimpleQuery, AutoQuery, ComplexQuery, NegatedQuery
 from Products.CMFCore.utils import _getAuthenticatedUser
@@ -961,32 +961,49 @@ def _isJumpToStatePossibleFor(self, ob, state_id, wf_id=None):
       return True
   return False
 
+
 def _doActionFor(self, ob, action, wf_id=None, *args, **kw):
-    """ Perform the given workflow action on 'ob'.
-    """
-    ###raise NotImplementedError ("Redefine doActionFor") ###zwj: it workfs!
-    wfs = self.getWorkflowsFor(ob)
-    if wfs is None:
-        wfs = ()
-    if wf_id is None:
-        if not wfs:
-            raise WorkflowException(_(u'No workflows found.'))
-        found = 0
-        for wf in wfs:
-            if wf.isActionSupported(ob, action, **kw):
-                found = 1
-                break
-        if not found:
-            msg = _(u"No workflow provides the '${action_id}' action.",
-                    mapping={'action_id': action})
-            raise WorkflowException(msg)
+  ###raise NotImplementedError ("Redefine doActionFor") ###zwj: it workfs!
+  wfs = self.getWorkflowsFor(ob)
+  workflow_list = ob.getTypeInfo().getTypeERP5WorkflowList()
+  case = 1
+
+  if wfs is None:
+    wfs = ()
+    case = 2
+
+  if wf_id is None:
+    if wfs == () and workflow_list == []:
+      raise WorkflowException(_(u'No workflows found.'))
+    found = 0
+    for wf in wfs:
+      if wf.isActionSupported(ob, action, **kw):
+        found = 1
+        case = 1
+        break
+    for workflow_id in workflow_list:
+      workflow = self.getPortalObject().getDefaultModule('Workflow')._getOb(workflow_id)
+      if workflow.isActionSupported(ob, action, **kw):
+        found = 1
+        case = 2
+        break
+    if not found:
+      msg = _(u"No workflow provides the '${action_id}' action.",mapping={'action_id': action})
+      raise WorkflowException(msg)
+
+  else:
+    if case == 1:
+      wf = self.getWorkflowById(wf_id)
+      #wf = getattr(self, 'getWorkflowById', None)(wf_id)
     else:
-        wf = self.getWorkflowById(wf_id)
-        if wf is None:
-            raise WorkflowException(
-                _(u'Requested workflow definition not found.'))
-    return self._invokeWithNotification(
-        wfs, ob, action, wf.doActionFor, (ob, action) + args, kw)
+      workflow = self.getPortalObject().getDefaultModule('Workflow')._getOb(wf_id, None)
+    if wf is None and workflow is None:
+      raise WorkflowException(_(u'Requested workflow definition not found.'))
+
+  if case == 1:
+    return self._invokeWithNotification(wfs, ob, action, wf.doActionFor, (ob, action) + args, kw)
+  else:
+    return workflow.doActionFor(ob, action)
 
 WorkflowTool._jumpToStateFor = _jumpToStateFor
 WorkflowTool._isJumpToStatePossibleFor = _isJumpToStatePossibleFor
-- 
2.30.9