Commit f7189be4 authored by Sebastien Robin's avatar Sebastien Robin

Dynamic workflow methods have to be registered on the prop_holder insteadof the klass


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@2767 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent f0902443
...@@ -32,7 +32,6 @@ from AccessControl import ClassSecurityInfo ...@@ -32,7 +32,6 @@ from AccessControl import ClassSecurityInfo
from AccessControl.Permission import pname from AccessControl.Permission import pname
from Acquisition import aq_base, aq_inner, aq_acquire, aq_chain from Acquisition import aq_base, aq_inner, aq_acquire, aq_chain
from Products.CMFCore.WorkflowCore import WorkflowMethod
from Products.CMFCore.PortalContent import PortalContent from Products.CMFCore.PortalContent import PortalContent
from Products.CMFCore.utils import getToolByName from Products.CMFCore.utils import getToolByName
from Products.CMFCore.Expression import Expression from Products.CMFCore.Expression import Expression
...@@ -49,6 +48,7 @@ from Products.ERP5Type.Utils2 import _getListFor ...@@ -49,6 +48,7 @@ from Products.ERP5Type.Utils2 import _getListFor
from Products.ERP5Type.Accessor.TypeDefinition import list_types from Products.ERP5Type.Accessor.TypeDefinition import list_types
from Products.ERP5Type.Accessor import Base as BaseAccessor from Products.ERP5Type.Accessor import Base as BaseAccessor
from Products.ERP5Type.XMLExportImport import Base_asXML from Products.ERP5Type.XMLExportImport import Base_asXML
from Products.CMFCore.WorkflowCore import ObjectDeleted
from Accessor import WorkflowState from Accessor import WorkflowState
from ZopePatch import ERP5PropertyManager from ZopePatch import ERP5PropertyManager
...@@ -56,6 +56,7 @@ from ZopePatch import ERP5PropertyManager ...@@ -56,6 +56,7 @@ from ZopePatch import ERP5PropertyManager
from CopySupport import CopyContainer from CopySupport import CopyContainer
from Errors import DeferredCatalogError from Errors import DeferredCatalogError
from Products.CMFActivity.ActiveObject import ActiveObject from Products.CMFActivity.ActiveObject import ActiveObject
from Products.ERP5Type.Accessor.Accessor import Accessor as Method
from string import join from string import join
import sys import sys
...@@ -71,6 +72,33 @@ import random ...@@ -71,6 +72,33 @@ import random
from zLOG import LOG, INFO, ERROR, WARNING from zLOG import LOG, INFO, ERROR, WARNING
class WorkflowMethod(Method):
def __init__(self, method, id=None, reindex=1):
self._m = method
if id is None:
id = method.__name__
self._id = id
def __call__(self, instance, *args, **kw):
""" Invoke the wrapped method, and deal with the results.
"""
wf = getToolByName(instance, 'portal_workflow', None)
if wf is None or not hasattr(wf, 'wrapWorkflowMethod'):
# No workflow tool found.
try:
res = apply(self._m, (instance,) + args, kw)
except ObjectDeleted, ex:
res = ex.getResult()
else:
if hasattr(aq_base(instance), 'reindexObject'):
instance.reindexObject()
else:
res = wf.wrapWorkflowMethod(instance, self._id, self.__dict__['_m'],
(instance,) + args, kw)
return res
def _aq_reset(): def _aq_reset():
Base.aq_method_generated = PersistentMapping() Base.aq_method_generated = PersistentMapping()
Base.aq_portal_type = PersistentMapping() Base.aq_portal_type = PersistentMapping()
...@@ -189,34 +217,35 @@ def initializePortalTypeDynamicProperties(self, klass, ptype, recursive=0): ...@@ -189,34 +217,35 @@ def initializePortalTypeDynamicProperties(self, klass, ptype, recursive=0):
tdef = wf.transitions.get(tr_id, None) tdef = wf.transitions.get(tr_id, None)
if tdef.trigger_type == TRIGGER_WORKFLOW_METHOD: if tdef.trigger_type == TRIGGER_WORKFLOW_METHOD:
method_id = convertToMixedCase(tr_id) method_id = convertToMixedCase(tr_id)
if not hasattr(klass, method_id): if not hasattr(prop_holder, method_id):
method = WorkflowMethod(klass._doNothing, tr_id) method = WorkflowMethod(klass._doNothing, tr_id)
setattr(prop_holder, method_id, method) # Attach to portal_type setattr(prop_holder, method_id, method) # Attach to portal_type
prop_holder.security.declareProtected( Permissions.AccessContentsInformation, method_id ) prop_holder.security.declareProtected( Permissions.AccessContentsInformation, method_id )
#LOG('in aq_portal_type %s' % id, 0, "added transition method %s" % method_id) #LOG('in aq_portal_type %s' % id, 0, "added transition method %s" % method_id)
else: else:
# Wrap method into WorkflowMethod is needed # Wrap method into WorkflowMethod is needed
method = getattr(klass, method_id) method = getattr(prop_holder, method_id)
if callable(method): if callable(method):
if not isinstance(method, WorkflowMethod): if not isinstance(method, WorkflowMethod):
setattr(klass, method_id, WorkflowMethod(method, method_id)) setattr(prop_holder, method_id, WorkflowMethod(method, method_id))
elif wf.__class__.__name__ in ('InteractionWorkflowDefinition', ): elif wf.__class__.__name__ in ('InteractionWorkflowDefinition', ):
for tr_id in wf.interactions.objectIds(): for tr_id in wf.interactions.objectIds():
tdef = wf.interactions.get(tr_id, None) tdef = wf.interactions.get(tr_id, None)
if tdef.trigger_type == TRIGGER_WORKFLOW_METHOD: if tdef.trigger_type == TRIGGER_WORKFLOW_METHOD:
for imethod_id in tdef.method_id: for imethod_id in tdef.method_id:
method_id = imethod_id method_id = imethod_id
if not hasattr(klass, method_id): if not hasattr(prop_holder, method_id):
method = WorkflowMethod(klass._doNothing, imethod_id) method = WorkflowMethod(klass._doNothing, imethod_id)
setattr(prop_holder, method_id, method) # Attach to portal_type setattr(prop_holder, method_id, method) # Attach to portal_type
prop_holder.security.declareProtected( Permissions.AccessContentsInformation, method_id ) prop_holder.security.declareProtected( Permissions.AccessContentsInformation, method_id )
#LOG('in aq_portal_type %s' % id, 0, "added interaction method %s" % method_id) #LOG('in aq_portal_type %s' % id, 0, "added interaction method %s" % method_id)
else: else:
# Wrap method into WorkflowMethod is needed # Wrap method into WorkflowMethod is needed
method = getattr(klass, method_id) method = getattr(prop_holder, method_id)
if callable(method): if callable(method):
if not isinstance(method, WorkflowMethod): if not isinstance(method, WorkflowMethod):
setattr(klass, method_id, WorkflowMethod(method, method_id)) method = WorkflowMethod(method, method_id)
setattr(prop_holder, method_id, method)
except: except:
LOG('Base', ERROR, LOG('Base', ERROR,
'Could not generate worklow transition methods for workflow %s on class %s.' % (wf_id, klass), 'Could not generate worklow transition methods for workflow %s on class %s.' % (wf_id, klass),
......
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