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

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Aug 29 16:54:17 CEST 2007


Author: jp
Date: Wed Aug 29 16:54:17 2007
New Revision: 15914

URL: http://svn.erp5.org?rev=15914&view=rev
Log:
Temp fix for template objects + support of portal type in wf method registration.

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=15914&r1=15913&r2=15914&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Base.py (original)
+++ erp5/trunk/products/ERP5Type/Base.py Wed Aug 29 16:54:17 2007
@@ -140,10 +140,12 @@
       return apply(self.__dict__['_m'], (instance,) + args, kw)
 
     # Invoke transitions on appropriate workflow
+    portal_type = instance.portal_type # Access by attribute to prevent recursion
     if call_method:
-      candidate_transition_item_list = self._invoke_always.items()
+      candidate_transition_item_list = self._invoke_always.get(portal_type, {}).items()
     else:
-      candidate_transition_item_list = self._invoke_always.items() + self._invoke_once.items()
+      candidate_transition_item_list = self._invoke_always.get(portal_type, {}).items() + \
+                                       self._invoke_once.get(portal_type, {}).items()
 
     # New implementation does not use any longer wrapWorkflowMethod
     wf = getToolByName(instance, 'portal_workflow', None)
@@ -178,18 +180,18 @@
     # Return result finally
     return result
 
-  def registerTransitionAlways(self, workflow_id, transition_id):
+  def registerTransitionAlways(self, portal_type, workflow_id, transition_id):
     """
       Transitions registered as always will be invoked always
     """
-    self._invoke_always.setdefault(workflow_id, []).append(transition_id)
-
-  def registerTransitionOncePerTransaction(self, workflow_id, transition_id):
+    self._invoke_always.setdefault(portal_type, {}).setdefault(workflow_id, []).append(transition_id)
+
+  def registerTransitionOncePerTransaction(self, portal_type, workflow_id, transition_id):
     """
       Transitions registered as one per transactions will be invoked 
       only once per transaction
     """
-    self._invoke_once.setdefault(workflow_id, []).append(transition_id)
+    self._invoke_once.setdefault(portal_type, {}).setdefault(workflow_id, []).append(transition_id)
 
 class ActionMethod(Method):
 
@@ -391,7 +393,7 @@
     initializeDefaultProperties([prop_holder], object=self)
     #LOG('initializeDefaultProperties: %s' % ptype, 0, str(prop_holder.__dict__))
 #     initializePortalTypeDynamicWorkflowMethods(self,
-    initializePortalTypeDynamicWorkflowMethods(self, klass, prop_holder)
+    initializePortalTypeDynamicWorkflowMethods(self, klass, ptype, prop_holder)
     # We can now associate it after initialising security
     InitializeClass(prop_holder)
     prop_holder.__propholder__ = prop_holder
@@ -400,13 +402,14 @@
     #klass.__ac_permissions__ = prop_holder.__ac_permissions__
     Base.aq_portal_type[ptype] = prop_holder
 
-def initializePortalTypeDynamicWorkflowMethods(self, klass, prop_holder):
+def initializePortalTypeDynamicWorkflowMethods(self, klass, ptype, prop_holder):
   """We should now make sure workflow methods are defined
   and also make sure simulation state is defined."""
   # aq_inner is required to prevent extra name lookups from happening
   # infinitely. For instance, if a workflow is missing, and the acquisition
   # wrapper contains an object with _aq_dynamic defined, the workflow id
   # is looked up with _aq_dynamic, thus causes infinite recursions.
+
   portal_workflow = aq_inner(getToolByName(self, 'portal_workflow'))
   for wf in portal_workflow.getWorkflowsFor(self):
     if wf.__class__.__name__ in ('DCWorkflowDefinition', ):
@@ -466,7 +469,7 @@
           if (not hasattr(prop_holder, method_id)) and \
              (not hasattr(klass, method_id)):
             method = WorkflowMethod(klass._doNothing, tr_id)
-            method.registerTransitionAlways(wf_id, tr_id)
+            method.registerTransitionAlways(ptype, wf_id, tr_id)
             # Attach to portal_type
             setattr(prop_holder, method_id, method)
             prop_holder.security.declareProtected(
@@ -485,7 +488,7 @@
             if callable(method):
               if not isinstance(method, WorkflowMethod):
                 method = WorkflowMethod(method, method_id)
-                method.registerTransitionAlways(wf_id, tr_id)
+                method.registerTransitionAlways(ptype, wf_id, tr_id)
                 setattr(work_method_holder, method_id, method)
               else :
                 # some methods (eg. set_ready) don't have the same name
@@ -496,7 +499,7 @@
                 # a wrong transition name (setReady).
                 # Here we force it's id to be the transition name (set_ready).
                 method._setId(tr_id)
-                method.registerTransitionAlways(wf_id, tr_id)
+                method.registerTransitionAlways(ptype, wf_id, tr_id)
             else:
               LOG('initializePortalTypeDynamicWorkflowMethods', 100,
                   'WARNING! Can not initialize %s on %s' % \
@@ -526,9 +529,9 @@
                 (not hasattr(klass,method_id)):
                 method = WorkflowMethod(klass._doNothing, imethod_id)
                 if not tdef.once_per_transaction:
-                  method.registerTransitionAlways(wf_id, tr_id)
+                  method.registerTransitionAlways(ptype, wf_id, tr_id)
                 else:
-                  method.registerTransitionOncePerTransaction(wf_id, tr_id)
+                  method.registerTransitionOncePerTransaction(ptype, wf_id, tr_id)
                 # Attach to portal_type
                 setattr(prop_holder, method_id, method)
                 prop_holder.security.declareProtected(
@@ -542,33 +545,33 @@
                     if not isinstance(method, WorkflowMethod):
                       method = WorkflowMethod(method, method_id)
                       if not tdef.once_per_transaction:
-                        method.registerTransitionAlways(wf_id, tr_id)
+                        method.registerTransitionAlways(ptype, wf_id, tr_id)
                       else:
-                        method.registerTransitionOncePerTransaction(wf_id, tr_id)
+                        method.registerTransitionOncePerTransaction(ptype, wf_id, tr_id)
                       # We must set the method on the klass
                       # because klass has priority in lookup over
                       # _ac_dynamic
                       setattr(klass, method_id, method)
                     else:
                       if not tdef.once_per_transaction:
-                        method.registerTransitionAlways(wf_id, tr_id)
+                        method.registerTransitionAlways(ptype, wf_id, tr_id)
                       else:
-                        method.registerTransitionOncePerTransaction(wf_id, tr_id)
+                        method.registerTransitionOncePerTransaction(ptype, wf_id, tr_id)
                 else:
                   method = getattr(prop_holder, method_id)
                   if callable(method):
                     if not isinstance(method, WorkflowMethod):
                       method = WorkflowMethod(method, method_id)
                       if not tdef.once_per_transaction:
-                        method.registerTransitionAlways(wf_id, tr_id)
+                        method.registerTransitionAlways(ptype, wf_id, tr_id)
                       else:
-                        method.registerTransitionOncePerTransaction(wf_id, tr_id)
+                        method.registerTransitionOncePerTransaction(ptype, wf_id, tr_id)
                       setattr(prop_holder, method_id, method)
                     else:
                       if not tdef.once_per_transaction:
-                        method.registerTransitionAlways(wf_id, tr_id)
+                        method.registerTransitionAlways(ptype, wf_id, tr_id)
                       else:
-                        method.registerTransitionOncePerTransaction(wf_id, tr_id)
+                        method.registerTransitionOncePerTransaction(ptype, wf_id, tr_id)
 
 class Base( CopyContainer,
             PortalContent,
@@ -2894,7 +2897,8 @@
     # Make sure this object is not in the catalog
     catalog = getToolByName(self, 'portal_catalog', None)
     if catalog is not None:
-       catalog.unindexObject(self)
+       #catalog.unindexObject(self)
+       pass
     self.isIndexable = 0
     self.isTemplate = 1
 




More information about the Erp5-report mailing list