[Erp5-report] r15993 - /erp5/trunk/products/ERP5Type/Base.py

nobody at svn.erp5.org nobody at svn.erp5.org
Sat Sep 1 16:02:20 CEST 2007


Author: jp
Date: Sat Sep  1 16:02:17 2007
New Revision: 15993

URL: http://svn.erp5.org?rev=15993&view=rev
Log:
Added a workflow method global registry so that it is  possible to reset the registrations of transitions and interactions of each workflow method whenever _aq_reset is invoked.

Modified:
    erp5/trunk/products/ERP5Type/Base.py

Modified: erp5/trunk/products/ERP5Type/Base.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Base.py?rev=15993&r1=15992&r2=15993&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Base.py (original)
+++ erp5/trunk/products/ERP5Type/Base.py Sat Sep  1 16:02:17 2007
@@ -84,7 +84,16 @@
 
 _MARKER=[]
 
+global registered_workflow_method_set
 wildcard_interaction_method_id_matcher = re.compile(".*[\+\*].*")
+workflow_method_registry = [] # XXX A set() would be better but would require a hash in WorkflowMethod class
+
+def resetRegisteredWorkflowMethod(portal_type=None):
+  """
+    TODO: unwrap workflow methos which were standard methods initially
+  """
+  for method in workflow_method_registry:
+    method.reset(portal_type=portal_type)
 
 class WorkflowMethod(Method):
 
@@ -208,6 +217,7 @@
     """
     transition_list = self._invoke_always.setdefault(portal_type, {}).setdefault(workflow_id, [])
     if transition_id not in transition_list: transition_list.append(transition_id)
+    self.register()
 
   def registerTransitionOncePerTransaction(self, portal_type, workflow_id, transition_id):
     """
@@ -216,6 +226,25 @@
     """
     transition_list = self._invoke_once.setdefault(portal_type, {}).setdefault(workflow_id, [])
     if transition_id not in transition_list: transition_list.append(transition_id)
+    self.register()
+
+  def register(self):
+    """
+      Registers the method so that _aq_reset may later reset it
+    """
+    global registered_workflow_method_set
+    workflow_method_registry.append(self)
+
+  def reset(self, portal_type=None):
+    """
+      Reset the list of registered interactions or transitions
+    """
+    if portal_type:
+      self._invoke_once[portal_type] = {}
+      self._invoke_always[portal_type] = {}
+    else:
+      self._invoke_once = {}
+      self._invoke_always = {}
 
 class ActionMethod(Method):
 
@@ -239,6 +268,9 @@
   # Some method generations are based on portal methods, and portal methods cache results.
   # So it is safer to invalidate the cache.
   clearCache()
+
+  # Reset workflow methods so that they no longer invoke workflows
+  resetRegisteredWorkflowMethod()
 
 class PropertyHolder:
   isRADContent = 1




More information about the Erp5-report mailing list