[Erp5-report] r32473 kazuhiko - in /erp5/trunk/products/ERP5: Document/ TargetSolver/

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Feb 12 07:54:05 CET 2010


Author: kazuhiko
Date: Fri Feb 12 07:54:05 2010
New Revision: 32473

URL: http://svn.erp5.org?rev=32473&view=rev
Log:
make expand stable using recorded property.

Modified:
    erp5/trunk/products/ERP5/Document/Rule.py
    erp5/trunk/products/ERP5/TargetSolver/CopyAndPropagate.py
    erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py
    erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py

Modified: erp5/trunk/products/ERP5/Document/Rule.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Rule.py?rev=32473&r1=32472&r2=32473&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Rule.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/Rule.py [utf8] Fri Feb 12 07:54:05 2010
@@ -352,7 +352,11 @@
       p_matched_list = []
       for movement in non_matched_list:
         for prop in self.getMatchingPropertyList():
-          if prevision.get(prop) != movement.getProperty(prop):
+          if movement.isPropertyRecorded(prop):
+            movement_value = movement.getRecordedProperty(prop)
+          else:
+            movement_value = movement.getProperty(prop)
+          if prevision.get(prop) != movement_value:
             break
         else:
           p_matched_list.append(movement)
@@ -362,7 +366,10 @@
         # Check the quantity
         m_quantity = 0.0
         for movement in p_matched_list:
-          m_quantity += movement.getQuantity()
+          if movement.isPropertyRecorded('quantity'):
+            m_quantity += movement.getRecordedProperty('quantity')
+          else:
+            m_quantity += movement.getQuantity()
         if m_quantity != prevision.get('quantity'):
           # special case - quantity
           if movement.isPropertyForced('quantity'):
@@ -391,7 +398,11 @@
               + deletable_movement_list):
             prop_dict = modify_dict.setdefault(movement.getId(), {})
             for k, v in prevision.items():
-              if k not in ('quantity',) and v != movement.getProperty(k):
+              if movement.isPropertyRecorded(k):
+                movement_value = movement.getRecordedProperty(k)
+              else:
+                movement_value = movement.getProperty(k)
+              if k not in ('quantity',) and v != movement_value:
                 if movement.isPropertyForced(k):
                   # support compensation if not prevent_compensation
                   LOG('%s:%s' % (self.getRelativeUrl(), movement.getRelativeUrl()), WARNING,
@@ -460,7 +471,11 @@
       p_matched_list = []
       for movement in non_matched_list:
         for prop in matching_property_list:
-          if prevision.get(prop) != movement.getProperty(prop):
+          if movement.isPropertyRecorded(prop):
+            movement_value = movement.getRecordedProperty(prop)
+          else:
+            movement_value = movement.getProperty(prop)
+          if prevision.get(prop) != movement_value:
             break
         else:
           p_matched_list.append(movement)
@@ -473,7 +488,10 @@
         # Check the quantity
         m_quantity = 0.0
         for movement in p_matched_list:
-          m_quantity += movement.getQuantity()#getCorrectedQuantity()
+          if movement.isPropertyRecorded('quantity'):
+            m_quantity += movement.getRecordedProperty('quantity')
+          else:
+            m_quantity += movement.getQuantity()
         if m_quantity != prevision.get('quantity'):
           q_diff = prevision.get('quantity') - m_quantity
           # try to find a movement that can be edited
@@ -498,14 +516,22 @@
             prop_dict = modify_dict.setdefault(movement.getId(), {})
             for prop in ('start_date', 'stop_date'):
               #XXX should be >= 15
-              if prevision.get(prop) != movement.getProperty(prop):
+              if movement.isPropertyRecorded(prop):
+                movement_value = movement.getRecordedProperty(prop)
+              else:
+                movement_value = movement.getProperty(prop)
+              if prevision.get(prop) != movement_value:
                 prop_dict[prop] = prevision.get(prop)
                 break
 
             for k, v in prevision.items():
-              if k not in ('quantity', 'start_date', 'stop_date') and\
-                      v != movement.getProperty(k):
-                prop_dict.setdefault(k, v)
+              if k not in ('quantity', 'start_date', 'stop_date'):
+                if movement.isPropertyRecorded(k):
+                  movement_value = movement.getRecordedProperty(k)
+                else:
+                  movement_value = movement.getProperty(k)
+                if v != movement_value:
+                  prop_dict.setdefault(k, v)
 
         # update movement lists
         for movement in p_matched_list:

Modified: erp5/trunk/products/ERP5/TargetSolver/CopyAndPropagate.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/CopyAndPropagate.py?rev=32473&r1=32472&r2=32473&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/CopyAndPropagate.py [utf8] (original)
+++ erp5/trunk/products/ERP5/TargetSolver/CopyAndPropagate.py [utf8] Fri Feb 12 07:54:05 2010
@@ -51,6 +51,7 @@
     value_dict = {}
     quantity_ratio = None
     if scope == 'quantity':
+      property_id = 'quantity'
       new_quantity = simulation_movement.getDeliveryQuantity() * \
                      simulation_movement.getDeliveryRatio()
       old_quantity = simulation_movement.getQuantity()
@@ -70,10 +71,14 @@
       value_dict[property_id] = new_value
     self._solveRecursively(simulation_movement,
                            quantity_ratio=quantity_ratio,
-                           value_dict=value_dict)
+                           value_dict=value_dict,
+                           property_id=property_id)
+    # XXX can we use activity for further expand?
+    simulation_movement.expand()
 
   def _solveRecursively(self, simulation_movement, is_last_movement=1,
-                        quantity_ratio=None, value_dict=None):
+                        quantity_ratio=None, value_dict=None,
+                        property_id=None):
     """
       Update value of the current simulation movement, and update
       his parent movement.
@@ -88,8 +93,6 @@
       value_dict['delivery_error'] = quantity_error
       value_dict['quantity'] = quantity
 
-    simulation_movement.edit(**value_dict)
-
     applied_rule = simulation_movement.getParentValue()
     parent_movement = applied_rule.getParentValue()
     if parent_movement.getPortalType() == 'Simulation Movement' and \
@@ -97,4 +100,9 @@
       # backtrack to the parent movement while it is not frozen
       self._solveRecursively(parent_movement, is_last_movement=0,
                              quantity_ratio=quantity_ratio,
-                             value_dict=value_dict)
+                             value_dict=value_dict,
+                             property_id=property_id)
+    else:
+      if not simulation_movement.isPropertyRecorded(property_id):
+        simulation_movement.recordProperty(property_id)
+    simulation_movement.edit(**value_dict)

Modified: erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py?rev=32473&r1=32472&r2=32473&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py [utf8] (original)
+++ erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py [utf8] Fri Feb 12 07:54:05 2010
@@ -75,8 +75,6 @@
         movement_dict.update(
           portal_type="Simulation Movement",
           id=new_id,
-          start_date=self.start_date,
-          stop_date=self.stop_date,
           quantity=movement_quantity - new_movement_quantity,
           activate_kw=self.activate_kw,
           order=simulation_movement.getOrder(),
@@ -92,6 +90,10 @@
               # might be wrong
               forced_property_list.append(prop)
         new_movement = applied_rule.newContent(**movement_dict)
+        new_movement.recordProperty('start_date')
+        new_movement.recordProperty('stop_date')
+        new_movement.edit(start_date=self.start_date,
+                          stop_date=self.stop_date)
         new_movement.activate(**self.additional_parameters).expand()
         # XXX: start and stop date have to be forced on movement too
         forced_property_list.extend(['start_date', 'stop_date'])
@@ -106,8 +108,8 @@
                         portal_type="Simulation Movement",
                         id=new_id,
                         efficiency=simulation_movement.getEfficiency(),
-                        start_date=self.start_date,
-                        stop_date=self.stop_date,
+                        start_date=simulation_movement.getStartDate(),
+                        stop_date=simulation_movement.getStopDate(),
                         order=simulation_movement.getOrder(),
 
                         resource=simulation_movement.getResource(),
@@ -135,11 +137,16 @@
                         activate_kw=self.activate_kw,
                         **self.additional_parameters
       )
+      new_movement.recordProperty('start_date')
+      new_movement.recordProperty('stop_date')
+      new_movement.edit(start_date=self.start_date,
+                        stop_date=self.stop_date)
       new_movement.activate(**self.additional_parameters).expand()
       # adopt new quantity on original simulation movement
       simulation_movement.edit(quantity=new_movement_quantity)
     simulation_movement.setDefaultActivateParameters(**self.activate_kw)
     simulation_movement.activate(**self.additional_parameters).expand()
+    simulation_movement.aq_parent.expand()
 
     # SplitAndDefer solves the divergence at the current level, no need to
     # backtrack.

Modified: erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py?rev=32473&r1=32472&r2=32473&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py [utf8] (original)
+++ erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py [utf8] Fri Feb 12 07:54:05 2010
@@ -54,8 +54,8 @@
       portal_type = "Simulation Movement",
       id = new_id,
       efficiency = simulation_movement.getEfficiency(),
-      start_date = self.start_date,
-      stop_date = self.stop_date,
+      start_date=simulation_movement.getStartDate(),
+      stop_date=simulation_movement.getStopDate(),
       # XXX resource
       order = simulation_movement.getOrder(),
       quantity = self.quantity,
@@ -66,6 +66,10 @@
       activate_kw = self.activate_kw,
       **self.additional_parameters
     )
+    new_movement.recordProperty('start_date')
+    new_movement.recordProperty('stop_date')
+    new_movement.edit(start_date=self.start_date,
+                      stop_date=self.stop_date)
     simulation_movement.setDefaultActivateParameters(**self.activate_kw)
     simulation_movement.edit (
       quantity = (simulation_movement.getQuantity() - self.quantity)




More information about the Erp5-report mailing list