[Erp5-report] r27470 - in /erp5/trunk/products/ERP5: Document/ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Jun 9 14:50:58 CEST 2009


Author: luke
Date: Tue Jun  9 14:50:56 2009
New Revision: 27470

URL: http://svn.erp5.org?rev=27470&view=rev
Log:
 - implement sorting which allows to do easy traversal
 - test sorting order

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

Modified: erp5/trunk/products/ERP5/Document/TradeCondition.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/TradeCondition.py?rev=27470&r1=27469&r2=27470&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/TradeCondition.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/TradeCondition.py [utf8] Tue Jun  9 14:50:56 2009
@@ -175,12 +175,35 @@
             portal_type=portal_type_list):
           reference = trade_model_line.getReference()
           if reference not in reference_list or reference is None:
-            trade_model_line_composed_list.append(trade_model_line)
             reference_list.append(reference)
-
-      return sorted(trade_model_line_composed_list,
-          cmp=lambda x,y: set(x.getBaseContributionList()).
-          intersection(set(y.getBaseApplicationList())) and -1 or 1)
+            base_contribution_list = trade_model_line \
+              .getBaseContributionList()
+            if len(base_contribution_list) == 0:
+              # when movement will not generate anything which contributes
+              # it is safe to be last on list
+              trade_model_line_composed_list.append(trade_model_line)
+            else:
+              # if movements contributes to anything it have to be placed
+              # just before to what it contributes
+              index = 0
+              inserted = False
+              for old_trade_model_line in trade_model_line_composed_list:
+                for base_application in old_trade_model_line \
+                  .getBaseApplicationList():
+                  if base_application in base_contribution_list:
+                    trade_model_line_composed_list.insert(index,
+                        trade_model_line)
+                    inserted = True
+                    break
+                if inserted:
+                  break
+                index += 1
+              if not inserted:
+                # last resort - nothing was found, it is safe to put movement
+                # in beginning of list
+                trade_model_line_composed_list.insert(0, trade_model_line)
+
+      return trade_model_line_composed_list
 
     security.declareProtected(Permissions.AccessContentsInformation,
                               'getAggregatedAmountList')

Modified: erp5/trunk/products/ERP5/tests/testBPMCore.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testBPMCore.py?rev=27470&r1=27469&r2=27470&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testBPMCore.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testBPMCore.py [utf8] Tue Jun  9 14:50:56 2009
@@ -90,7 +90,7 @@
   def createCategories(self):
     category_tool = getToolByName(self.portal, 'portal_categories')
     self.createCategoriesInCategory(category_tool.base_amount, ['discount',
-      'tax', 'total_tax', 'total_discount'])
+      'tax', 'total_tax', 'total_discount', 'total'])
     self.createCategoriesInCategory(category_tool.use,
         self.normal_resource_use_category_list + \
             self.invoicing_resource_use_category_list)
@@ -1697,6 +1697,60 @@
       trade_condition_1.getTradeModelLineComposedList()
     )
 
+  def test_getTradeModelLineComposedList(self):
+    """Test that list of contribution/application relations is sorted to do easy traversal
+
+    Let assume such graph of contribution/application dependency:
+
+    D -----> B
+          /   \
+    E ---/     > A
+              /
+    F -----> C
+          /
+    G ---/
+
+    It shall return list which is sorted like:
+      * (DE) B (FG) C A
+        or
+      * (FG) C (DE) B A
+    where everything in parenthesis can be not sorted
+    """
+    trade_condition = self.createTradeCondition()
+
+    A = self.createTradeModelLine(trade_condition, reference='A',
+        base_application_list=['base_amount/total'])
+
+    B = self.createTradeModelLine(trade_condition, reference='B',
+        base_contribution_list=['base_amount/total'],
+        base_application_list=['base_amount/total_tax'])
+
+    C = self.createTradeModelLine(trade_condition, reference='C',
+        base_contribution_list=['base_amount/total'],
+        base_application_list=['base_amount/total_discount'])
+
+    D = self.createTradeModelLine(trade_condition, reference='D',
+        base_contribution_list=['base_amount/total_tax'],
+        base_application_list=['base_amount/tax'])
+
+    E = self.createTradeModelLine(trade_condition, reference='E',
+        base_contribution_list=['base_amount/total_tax'],
+        base_application_list=['base_amount/tax'])
+
+    F = self.createTradeModelLine(trade_condition, reference='F',
+        base_contribution_list=['base_amount/total_discount'],
+        base_application_list=['base_amount/discount'])
+
+    G = self.createTradeModelLine(trade_condition, reference='G',
+        base_contribution_list=['base_amount/total_discount'],
+        base_application_list=['base_amount/discount'])
+
+    trade_model_line_list = trade_condition.getTradeModelLineComposedList()
+
+    # XXX: This is only one good possible sorting
+    self.assertEquals(sorted([q.getRelativeUrl() for q in trade_model_line_list]),
+        sorted([q.getRelativeUrl() for q in [D, E, B, F, G, C, A]]))
+
   def test_getAggregatedAmountList(self):
     """
       Test for case, when discount contributes to tax, and order has mix of contributing lines




More information about the Erp5-report mailing list