Commit 2f7e29b1 authored by wenjie.zheng's avatar wenjie.zheng

portal_type_class.py: add resetERP5WorkflowMethods.

parent ffff687e
...@@ -125,19 +125,6 @@ def resetRegisteredERP5WorkflowMethod(portal_type=None): ...@@ -125,19 +125,6 @@ def resetRegisteredERP5WorkflowMethod(portal_type=None):
class ERP5WorkflowMethod(Method): class ERP5WorkflowMethod(Method):
def __init__(self, method, id=None, reindex=1): def __init__(self, method, id=None, reindex=1):
"""
method - a callable object or a method
id - the workflow transition id. This is useful
to emulate "old" CMF behaviour but is
somehow inconsistent with the new registration based
approach implemented here.
We store id as _transition_id and use it
to register the transition for each portal
type and each workflow for which it is
applicable.
"""
self._m = method self._m = method
if id is None: if id is None:
self._transition_id = method.__name__ self._transition_id = method.__name__
...@@ -157,16 +144,7 @@ class ERP5WorkflowMethod(Method): ...@@ -157,16 +144,7 @@ class ERP5WorkflowMethod(Method):
return self._transition_id return self._transition_id
def __call__(self, instance, *args, **kw): def __call__(self, instance, *args, **kw):
"""
Invoke the wrapped method, and deal with the results.
"""
if getattr(self, '__name__', None) in ('getPhysicalPath', 'getId'): if getattr(self, '__name__', None) in ('getPhysicalPath', 'getId'):
# To prevent infinite recursion, 2 methods must have special treatment
# this is clearly not the best way to implement this but it is
# already better than what we had. I (JPS) would prefer to use
# critical sections in this part of the code and a
# thread variable which tells in which semantic context the code
# should be executed. - XXX
return self._m(instance, *args, **kw) return self._m(instance, *args, **kw)
# Build a list of transitions which may need to be invoked # Build a list of transitions which may need to be invoked
...@@ -193,30 +171,28 @@ class ERP5WorkflowMethod(Method): ...@@ -193,30 +171,28 @@ class ERP5WorkflowMethod(Method):
candidate_transition_item_list = valid_invoke_once_item_list + \ candidate_transition_item_list = valid_invoke_once_item_list + \
self._invoke_always.get(portal_type, {}).items() self._invoke_always.get(portal_type, {}).items()
#LOG('candidate_transition_item_list %s' % self.__name__, 0, str(candidate_transition_item_list))
# Try to return immediately if there are no transition to invoke # Try to return immediately if there are no transition to invoke
if not candidate_transition_item_list: if not candidate_transition_item_list:
return apply(self.__dict__['_m'], (instance,) + args, kw) return apply(self.__dict__['_m'], (instance,) + args, kw)
if instance.getTypeInfo().getTypeERP5WorkflowList(): if instance.getTypeInfo().getTypeERP5WorkflowList():
wf5_module = instance.getPortalObject().getDefaultModule(portal_type="Workflow") wf5_module = instance.getPortalObject().getDefaultModule(portal_type="Workflow")
### Build the list of method which is call and will be invoked. ### zwj: Build the list of method which is call and will be invoked.
valid_transition_item_list = [] valid_transition_item_list = []
for wf_id, transition_list in candidate_transition_item_list: for wf_id, transition_list in candidate_transition_item_list:
valid_list = [] valid_list = []
for transition_id in transition_list: for transition_id in transition_list:
LOG('Executing %s in %s' %(transition_id, wf_id), WARNING, "lol") LOG('zwj: Executing %s in %s' %(transition_id, wf_id), WARNING, "lol")
if wf5_module._getOb(wf_id).isERP5WorkflowMethodSupported(instance, wf5_module._getOb(wf_id)._getOb(transition_id)): if wf5_module._getOb(wf_id).isERP5WorkflowMethodSupported(instance, wf5_module._getOb(wf_id)._getOb(transition_id)):
valid_list.append(transition_id) valid_list.append(transition_id)
once_transition_key = once_transition_dict.get((wf_id, transition_id)) once_transition_key = once_transition_dict.get((wf_id, transition_id))
transactional_variable[once_transition_key] = 1 transactional_variable[once_transition_key] = 1
else: else:
raise NotImplementedError("The Transition is not supported by current state.") raise UnsupportedWorkflowMethod("The Transition is not supported by current state.")
if valid_list: if valid_list:
valid_transition_item_list.append((wf_id, valid_list)) valid_transition_item_list.append((wf_id, valid_list))
### Execute method ### zwj: Execute method
for wf_id, transition_list in valid_transition_item_list: for wf_id, transition_list in valid_transition_item_list:
for tr in transition_list: for tr in transition_list:
method5 = wf5_module._getOb(wf_id)._getOb(tr) method5 = wf5_module._getOb(wf_id)._getOb(tr)
...@@ -530,7 +506,6 @@ class PropertyHolder(object): ...@@ -530,7 +506,6 @@ class PropertyHolder(object):
ERP5workflow_method = getattr(self, id, None) ERP5workflow_method = getattr(self, id, None)
if ERP5workflow_method is None: if ERP5workflow_method is None:
# XXX: We should pass 'tr_id' as second parameter.
ERP5workflow_method = ERP5WorkflowMethod(Base._doNothing) ERP5workflow_method = ERP5WorkflowMethod(Base._doNothing)
setattr(self, id, ERP5workflow_method) setattr(self, id, ERP5workflow_method)
if once_per_transaction: if once_per_transaction:
...@@ -674,6 +649,7 @@ def intializePortalTypeERP5WorkflowMethod(ptype_klass, portal_ERP5Workflow): ...@@ -674,6 +649,7 @@ def intializePortalTypeERP5WorkflowMethod(ptype_klass, portal_ERP5Workflow):
method_id = convertToMixedCase(tr_id) method_id = convertToMixedCase(tr_id)
wf_id = ERP5Workflow wf_id = ERP5Workflow
ptype_klass.registerERP5WorkflowMethod(method_id, wf_id, tr_id, 0) ptype_klass.registerERP5WorkflowMethod(method_id, wf_id, tr_id, 0)
LOG("ERP5Workflow method %s is generated"%tr_id,WARNING," for %s"%wf_id)
def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow): def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow):
"""We should now make sure workflow methods are defined """We should now make sure workflow methods are defined
......
...@@ -286,6 +286,14 @@ class PortalTypeMetaClass(GhostBaseMetaClass, PropertyHolder): ...@@ -286,6 +286,14 @@ class PortalTypeMetaClass(GhostBaseMetaClass, PropertyHolder):
else: else:
initializePortalTypeDynamicWorkflowMethods(cls, portal_workflow) initializePortalTypeDynamicWorkflowMethods(cls, portal_workflow)
portal_types = site.getDefaultModule(portal_type="portal_types")
object_ptype = portal_types._getOb(cls.__name__, None)
if hasattr(object_ptype, 'erp5workflow_list'):
ERP5Workflow = site._getOb("workflow_module", None)
if ERP5Workflow is not None:
intializePortalTypeERP5WorkflowMethod(cls, ERP5Workflow)
"""
portal_types = site.getDefaultModule(portal_type="portal_types") portal_types = site.getDefaultModule(portal_type="portal_types")
object_ptype = portal_types._getOb(cls.__name__, None) object_ptype = portal_types._getOb(cls.__name__, None)
if object_ptype is not None: if object_ptype is not None:
...@@ -294,7 +302,7 @@ class PortalTypeMetaClass(GhostBaseMetaClass, PropertyHolder): ...@@ -294,7 +302,7 @@ class PortalTypeMetaClass(GhostBaseMetaClass, PropertyHolder):
ERP5Workflow = getattr(site, "workflow_module", None) ERP5Workflow = getattr(site, "workflow_module", None)
if ERP5Workflow is not None: if ERP5Workflow is not None:
intializePortalTypeERP5WorkflowMethod(cls, ERP5Workflow) intializePortalTypeERP5WorkflowMethod(cls, ERP5Workflow)
"""
# portal type group methods, isNodeType, isResourceType... # portal type group methods, isNodeType, isResourceType...
from Products.ERP5Type.ERP5Type import ERP5TypeInformation from Products.ERP5Type.ERP5Type import ERP5TypeInformation
# XXX possible optimization: # XXX possible optimization:
......
...@@ -33,7 +33,7 @@ import inspect ...@@ -33,7 +33,7 @@ import inspect
import transaction import transaction
from Products.ERP5Type.mixin.temporary import TemporaryDocumentMixin from Products.ERP5Type.mixin.temporary import TemporaryDocumentMixin
from Products.ERP5Type.Base import resetRegisteredWorkflowMethod from Products.ERP5Type.Base import resetRegisteredWorkflowMethod, resetRegisteredERP5WorkflowMethod
from . import aq_method_lock from . import aq_method_lock
from Products.ERP5Type.Globals import InitializeClass from Products.ERP5Type.Globals import InitializeClass
from Products.ERP5Type.Utils import setDefaultClassProperties from Products.ERP5Type.Utils import setDefaultClassProperties
...@@ -388,6 +388,7 @@ def synchronizeDynamicModules(context, force=False): ...@@ -388,6 +388,7 @@ def synchronizeDynamicModules(context, force=False):
# methods adds/registers/wraps existing methods, but does not # methods adds/registers/wraps existing methods, but does not
# remove old chains. Do it now. # remove old chains. Do it now.
resetRegisteredWorkflowMethod() resetRegisteredWorkflowMethod()
resetRegisteredERP5WorkflowMethod()
# Some method generations are based on portal methods, and portal # Some method generations are based on portal methods, and portal
# methods cache results. So it is safer to invalidate the cache. # methods cache results. So it is safer to invalidate the cache.
......
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