[Erp5-report] r34023 jm - /erp5/trunk/products/ERP5/Document/TradeCondition.py

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Mar 23 19:01:27 CET 2010


Author: jm
Date: Tue Mar 23 19:01:26 2010
New Revision: 34023

URL: http://svn.erp5.org?rev=34023&view=rev
Log:
TradeCondition: merge and simplify find{Effective,}SpecialiseValueList

Modified:
    erp5/trunk/products/ERP5/Document/TradeCondition.py

Modified: erp5/trunk/products/ERP5/Document/TradeCondition.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/TradeCondition.py?rev=34023&r1=34022&r2=34023&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/TradeCondition.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/TradeCondition.py [utf8] Tue Mar 23 19:01:26 2010
@@ -30,6 +30,7 @@
 #
 ##############################################################################
 
+from collections import deque
 from AccessControl import ClassSecurityInfo
 
 from Products.ERP5Type import Permissions, PropertySheet, interfaces
@@ -120,48 +121,47 @@
               'movement_to_add_list': movement_to_add_list}
 
     security.declareProtected(Permissions.AccessContentsInformation,
-        'findSpecialiseValueList')
+                              'findSpecialiseValueList')
     def findSpecialiseValueList(self, context, portal_type_list=None):
       """Returns a list of specialised objects representing inheritance tree.
-
-         Uses Breadth First Search.
       """
-      if portal_type_list is None:
-        portal_type_list = self.getPortalAmountGeneratorTypeList()
-      if context.getPortalType() in portal_type_list:
-        specialise_value_list = [context]
-        visited_trade_condition_list = [context]
-      else:
-        specialise_value_list = context.getSpecialiseValueList()
-        visited_trade_condition_list = context.getSpecialiseValueList(\
-            portal_type=portal_type_list)
-
-      while len(specialise_value_list) != 0:
-        specialise = specialise_value_list.pop(0)
+      return self.findEffectiveSpecialiseValueList(context,
+        portal_type_list=portal_type_list)
+
+
+    security.declareProtected(Permissions.AccessContentsInformation,
+                              'findEffectiveSpecialiseValueList')
+    def findEffectiveSpecialiseValueList(self, context, start_date=None,
+                                         stop_date=None, portal_type_list=None):
+      """Return a list of effective specialised objects that is the
+      inheritance tree.
+      An effective object is an object which have start_date and stop_date
+      included to the range of the given parameters start_date and stop_date.
+
+      This algorithm uses Breadth First Search.
+      """
+      portal_type_set = set(portal_type_list or
+                            self.getPortalAmountGeneratorTypeList())
+      def getEffectiveModel(model):
         try:
-          # all children
-          child_specialised_value_list = specialise.getSpecialiseValueList()
-          # only children that match the portal_type given
-          child_visited_trade_condition_set = set(specialise.\
-              getSpecialiseValueList(portal_type=portal_type_list))
+          getEffectiveModel = model.getEffectiveModel
         except AttributeError:
-          # it is possible, that specialised object cannot be specialised
-          # anymore
-          continue
-        # Use a set for faster lookups. We do not use sets everywhere
-        # because search order does matter
-        intersection = set(child_specialised_value_list).intersection(\
-            set(visited_trade_condition_list))
-        for model in child_specialised_value_list:
-          # don't add model that have already been visited. This permit to
-          # visit all the tree and to prevent having circular dependency
-          if model not in intersection:
-            specialise_value_list.append(model)
-            # only add those who matches the portal type given
-            if model in child_visited_trade_condition_set:
-              visited_trade_condition_list.append(model)
-
-      return visited_trade_condition_list
+          return model
+        return getEffectiveModel(start_date, stop_date)
+      filtered_list = []
+      specialise_value_list = deque((getEffectiveModel(context),))
+      specialise_value_set = set(specialise_value_list)
+      specialise_index = 0
+      while specialise_value_list:
+        context = specialise_value_list.popleft()
+        if context.getPortalType() in portal_type_set:
+          filtered_list.append(context)
+        for specialise_value in map(getEffectiveModel,
+                                    context.getSpecialiseValueList()):
+          if specialise_value not in specialise_value_set:
+            specialise_value_set.add(specialise_value)
+            specialise_value_list.append(specialise_value)
+      return filtered_list
 
     security.declareProtected(Permissions.AccessContentsInformation,
                               'getTradeModelLineComposedList')
@@ -337,66 +337,6 @@
         if keep:
           reference_dict[obj.getProperty('reference', obj.getId())] = obj.getId()
       return reference_dict
-
-    security.declareProtected(Permissions.AccessContentsInformation,
-        'findEffectiveSpecialiseValueList')
-    def findEffectiveSpecialiseValueList(self, context, start_date=None,
-        stop_date=None, portal_type_list=None, effective_model_list=None):
-      """Return a list of effective specialised objects that is the
-      inheritance tree.
-      An effective object is an object which have start_date and stop_date
-      included to the range of the given parameters start_date and stop_date.
-      If no start_date and stop_date are provided, findSpecialiseValueList
-      result is returned.
-
-      This algorithm uses Breadth First Search.
-      """
-      if start_date is None and stop_date is None:
-        # if dates are not defined, return findSpecialiseValueList result
-        return self.findSpecialiseValueList(context=context)
-      if effective_model_list is None:
-        effective_model_list = []
-      visited_trade_condition_list = []
-      if portal_type_list is None:
-        portal_type_list = self.getPortalAmountGeneratorTypeList()
-
-      if context.getPortalType() in portal_type_list:
-        effective_model = context.getEffectiveModel(
-            start_date=start_date, stop_date=stop_date)
-        if effective_model is not None:
-          effective_model_list = [effective_model]
-          visited_trade_condition_list = [effective_model]
-      else:
-        model_list = context.getSpecialiseValueList(\
-            portal_type=portal_type_list)
-        effective_model_list = [model.getEffectiveModel(\
-            start_date=start_date, stop_date=stop_date) for model in\
-            model_list]
-        visited_trade_condition_list = [model.getEffectiveModel(\
-            start_date=start_date, stop_date=stop_date) for model in\
-            model_list]
-      # remove None models
-      effective_model_list = [ob for ob in effective_model_list if ob is not None]
-      while len(effective_model_list) != 0:
-        specialise = effective_model_list.pop(0)
-        effective_specialise = specialise.getEffectiveModel(start_date=start_date,
-          stop_date=stop_date)
-        child_list = []
-        if effective_specialise is not None:
-          child_list = effective_specialise.getSpecialiseValueList(\
-              portal_type=portal_type_list)
-
-        intersection = set(child_list).intersection(\
-            set(visited_trade_condition_list))
-        for model in child_list:
-          effective_model = model.getEffectiveModel(start_date=start_date,
-              stop_date=stop_date)
-          if effective_model is not None and effective_model not in intersection:
-            # don't add model that are already been visited. This permit to
-            # visit all model tree, and to not have circular dependency
-            effective_model_list.append(effective_model)
-            visited_trade_condition_list.append(effective_model)
-      return visited_trade_condition_list
 
     security.declareProtected(Permissions.AccessContentsInformation,
         'getInheritanceReferenceDict')
@@ -463,9 +403,6 @@
     def getModelInheritanceEffectiveProperty(self, paysheet, property_name):
       """Get a property from an effective model
       """
-      v = self.getProperty(property_name)
-      if v:
-        return v
       model_list = self.findEffectiveSpecialiseValueList(context=self,
           start_date=paysheet.getStartDate(), stop_date=paysheet.getStopDate())
       for specialised_model in model_list:




More information about the Erp5-report mailing list