From 148e8b2633d349323170690f5ef03178ba74653b Mon Sep 17 00:00:00 2001
From: Kazuhiko Shiozaki <kazuhiko@nexedi.com>
Date: Thu, 4 Feb 2010 15:11:09 +0000
Subject: [PATCH] get properties to be solved from divergence tester (target
 solver's causality's causality).

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@32268 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5/Document/AcceptSolver.py | 19 ++++++-----
 product/ERP5/Document/AdoptSolver.py  | 48 ++++++++++++++-------------
 product/ERP5/Document/UnifySolver.py  |  4 ++-
 3 files changed, 39 insertions(+), 32 deletions(-)

diff --git a/product/ERP5/Document/AcceptSolver.py b/product/ERP5/Document/AcceptSolver.py
index 8147c31003..a3c925f2b4 100644
--- a/product/ERP5/Document/AcceptSolver.py
+++ b/product/ERP5/Document/AcceptSolver.py
@@ -64,9 +64,9 @@ class AcceptSolver(SolverMixin, ConfigurableMixin, XMLObject):
     Adopt new property to simulation movements, with keeping the
     original one recorded.
     """
-    solved_property = self._getPortalTypeValue().getTestedProperty()
+    solved_property_list = self.getCausalityValue().getCausalityValue(). \
+                           getTestedPropertyList()
     for movement in self.getDeliveryValueList():
-      new_value = movement.getProperty(solved_property)
       simulation_movement_list = movement.getDeliveryRelatedValueList()
       # if movement here is a delivery, we need to find simulation
       # movements by its movements.
@@ -75,12 +75,15 @@ class AcceptSolver(SolverMixin, ConfigurableMixin, XMLObject):
           [x.getDeliveryRelatedValueList() \
            for x in self.getDeliveryValue().getMovementList()], [])
       for simulation_movement in simulation_movement_list:
-        # XXX hard coded
-        if solved_property == 'quantity':
-          new_quantity = new_value * simulation_movement.getDeliveryRatio()
-          value_dict = {'quantity':new_quantity}
-        else:
-          value_dict = {solved_property:new_value}
+        value_dict = {}
+        for solved_property in solved_property_list:
+          new_value = movement.getProperty(solved_property)
+          # XXX hard coded
+          if solved_property == 'quantity':
+            new_quantity = new_value * simulation_movement.getDeliveryRatio()
+            value_dict.update({'quantity':new_quantity})
+          else:
+            value_dict.update({solved_property:new_value})
         self._solveRecursively(simulation_movement, value_dict)
         simulation_movement.expand()
     # Finish solving
diff --git a/product/ERP5/Document/AdoptSolver.py b/product/ERP5/Document/AdoptSolver.py
index d022f0bbc9..7e57370c1e 100644
--- a/product/ERP5/Document/AdoptSolver.py
+++ b/product/ERP5/Document/AdoptSolver.py
@@ -65,30 +65,32 @@ class AdoptSolver(SolverMixin, ConfigurableMixin, XMLObject):
     """
     Adopt new property to movements or deliveries.
     """
-    solved_property = self._getPortalTypeValue().getTestedProperty()
+    solved_property_list = self.getCausalityValue().getCausalityValue(). \
+                           getTestedPropertyList()
     for movement in self.getDeliveryValueList():
-      # XXX hardcoded
-      if solved_property == 'quantity':
-        total_quantity = sum(
-          [x.getQuantity() for x in movement.getDeliveryRelatedValueList()])
-        movement.setQuantity(total_quantity)
-        for simulation_movement in movement.getDeliveryRelatedValueList():
-          quantity = simulation_movement.getQuantity()
-          delivery_ratio = quantity / total_quantity
-          delivery_error = total_quantity * delivery_ratio - quantity
-          simulation_movement.edit(delivery_ratio=delivery_ratio,
-                                   delivery_error=delivery_error)
-          self._clearRecordedPropertyRecursively(simulation_movement,
-                                                 solved_property)
-      else:
-        # XXX TODO we need to support multiple values for categories or
-        # list type property.
-        simulation_movement = movement.getDeliveryRelatedValue()
-        movement.setProperty(solved_property,
-                             simulation_movement.getProperty(solved_property))
-        for simulation_movement in movement.getDeliveryRelatedValueList():
-          self._clearRecordedPropertyRecursively(simulation_movement,
-                                                 solved_property)
+      for solved_property in solved_property_list:
+        # XXX hardcoded
+        if solved_property == 'quantity':
+          total_quantity = sum(
+            [x.getQuantity() for x in movement.getDeliveryRelatedValueList()])
+          movement.setQuantity(total_quantity)
+          for simulation_movement in movement.getDeliveryRelatedValueList():
+            quantity = simulation_movement.getQuantity()
+            delivery_ratio = quantity / total_quantity
+            delivery_error = total_quantity * delivery_ratio - quantity
+            simulation_movement.edit(delivery_ratio=delivery_ratio,
+                                     delivery_error=delivery_error)
+            self._clearRecordedPropertyRecursively(simulation_movement,
+                                                   solved_property)
+        else:
+          # XXX TODO we need to support multiple values for categories or
+          # list type property.
+          simulation_movement = movement.getDeliveryRelatedValue()
+          movement.setProperty(solved_property,
+                               simulation_movement.getProperty(solved_property))
+          for simulation_movement in movement.getDeliveryRelatedValueList():
+            self._clearRecordedPropertyRecursively(simulation_movement,
+                                                   solved_property)
     # Finish solving
     self.succeed()
 
diff --git a/product/ERP5/Document/UnifySolver.py b/product/ERP5/Document/UnifySolver.py
index e3d009500b..dc73759430 100644
--- a/product/ERP5/Document/UnifySolver.py
+++ b/product/ERP5/Document/UnifySolver.py
@@ -62,7 +62,9 @@ class UnifySolver(AcceptSolver, AdoptSolver):
     Adopt new property to simulation movements, with keeping the
     original one recorded.
     """
-    solved_property = self._getPortalTypeValue().getTestedProperty()
+    # XXX it does not support multiple tested properties.
+    solved_property = self.getCausalityValue().getCausalityValue(). \
+                      getTestedProperty()
     for movement in self.getDeliveryValueList():
       configuration_dict = self.getConfigurationPropertyDict()
       new_value = configuration_dict.get('value')
-- 
2.30.9