[Erp5-report] r6867 - /erp5/trunk/products/ERP5/TargetSolver/

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Apr 24 10:41:12 CEST 2006


Author: vincent
Date: Mon Apr 24 10:41:09 2006
New Revision: 6867

URL: http://svn.erp5.org?rev=6867&view=rev
Log:
Use a more explicit variable naming where the action is taken on a simulation movement.
Remove LOG mesage.
Improve docstrings.
Improve coding style.
Add a warning about a strange behaviour in SplitQuantity.


Modified:
    erp5/trunk/products/ERP5/TargetSolver/CopyToTarget.py
    erp5/trunk/products/ERP5/TargetSolver/ProfitAndLoss.py
    erp5/trunk/products/ERP5/TargetSolver/Redirect.py
    erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py
    erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py
    erp5/trunk/products/ERP5/TargetSolver/TargetSolver.py
    erp5/trunk/products/ERP5/TargetSolver/TransformationSourcingCopyToTarget.py

Modified: erp5/trunk/products/ERP5/TargetSolver/CopyToTarget.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/CopyToTarget.py?rev=6867&r1=6866&r2=6867&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/CopyToTarget.py (original)
+++ erp5/trunk/products/ERP5/TargetSolver/CopyToTarget.py Mon Apr 24 10:41:09 2006
@@ -31,25 +31,26 @@
 
 class CopyToTarget(TargetSolver):
   """
-  Copy values simulation movement as target. This is
-  only acceptable for root movements. The meaning of
-  this solver of other movements is far from certain.
+    Copy values simulation movement as target. This is
+    only acceptable for root movements. The meaning of
+    this solver of other movements is far from certain.
   """
-  def _generateValueDeltaDict(self, movement):
+  def _generateValueDeltaDict(self, simulation_movement):
     """
-    Get interesting value
+      Get interesting values
+      XXX: better description is possible. But is it needed ?
     """
     # Get interesting value
-    old_quantity = movement.getQuantity()
-    old_start_date = movement.getStartDate()
-    old_stop_date = movement.getStopDate()
-    new_quantity = movement.getDeliveryQuantity() * \
-                   movement.getDeliveryRatio()
-    new_start_date = movement.getDeliveryStartDateList()[0]
-    new_stop_date = movement.getDeliveryStopDateList()[0]
+    old_quantity = simulation_movement.getQuantity()
+    old_start_date = simulation_movement.getStartDate()
+    old_stop_date = simulation_movement.getStopDate()
+    new_quantity = simulation_movement.getDeliveryQuantity() * \
+                   simulation_movement.getDeliveryRatio()
+    new_start_date = simulation_movement.getDeliveryStartDateList()[0]
+    new_stop_date = simulation_movement.getDeliveryStopDateList()[0]
     # Calculate delta
     quantity_ratio = 0
-    if old_quantity not in (None,0.0):
+    if old_quantity not in (None,0.0): # XXX: What if quantity happens to be an integer ?
       quantity_ratio = new_quantity / old_quantity
     start_date_delta = 0
     stop_date_delta = 0
@@ -63,51 +64,51 @@
       'stop_date_delta': stop_date_delta,
     }
 
-  def solve(self, movement):
+  def solve(self, simulation_movement):
     """
-    Adopt values as new target
+      Adopt values as new target
     """
-    value_dict = self._generateValueDeltaDict(movement)
+    value_dict = self._generateValueDeltaDict(simulation_movement)
     # Modify recursively simulation movement
-    self._recursivelySolve(movement, **value_dict)
+    self._recursivelySolve(simulation_movement, **value_dict)
 
-  def _generateValueDict(self, movement, quantity_ratio=1, 
+  def _generateValueDict(self, simulation_movement, quantity_ratio=1, 
                          start_date_delta=0, stop_date_delta=0,
                          **value_delta_dict):
     """
-    Generate values to save on movement.
+      Generate values to save on simulation movement.
     """
     value_dict = {}
     # Modify quantity, start_date, stop_date
-    start_date = movement.getStartDate()
+    start_date = simulation_movement.getStartDate()
     if start_date is not None:
       value_dict['start_date'] = start_date + start_date_delta
-    stop_date = movement.getStopDate()
+    stop_date = simulation_movement.getStopDate()
     if stop_date is not None:
       value_dict['stop_date'] = stop_date + stop_date_delta
-    value_dict['quantity'] = movement.getQuantity() * quantity_ratio
+    value_dict['quantity'] = simulation_movement.getQuantity() * quantity_ratio
     return value_dict
 
-  def _getParentParameters(self, movement, 
+  def _getParentParameters(self, simulation_movement, 
                            **value_delta_dict):
     """
-    Get parent movement, and its value delta dict.
+      Get parent movement, and its value delta dict.
     """
-    applied_rule = movement.getParentValue()
+    applied_rule = simulation_movement.getParentValue()
     parent_movement = applied_rule.getParentValue()
     if parent_movement.getPortalType() != "Simulation Movement":
       parent_movement = None
     return parent_movement, value_delta_dict
 
-  def _recursivelySolve(self, movement, **value_delta_dict):
+  def _recursivelySolve(self, simulation_movement, **value_delta_dict):
     """
-    Update value of the current simulation movement, and update his parent
-    movement.
+      Update value of the current simulation movement, and update
+      his parent movement.
     """
-    value_dict = self._generateValueDict(movement, **value_delta_dict)
-    movement.edit(**value_dict)
+    value_dict = self._generateValueDict(simulation_movement, **value_delta_dict)
+    simulation_movement.edit(**value_dict)
     parent_movement, parent_value_delta_dict = \
-                self._getParentParameters(movement, **value_delta_dict)
+                self._getParentParameters(simulation_movement, **value_delta_dict)
     if parent_movement is not None:
       # Modify the parent movement
       self._recursivelySolve(parent_movement, **parent_value_delta_dict)

Modified: erp5/trunk/products/ERP5/TargetSolver/ProfitAndLoss.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/ProfitAndLoss.py?rev=6867&r1=6866&r2=6867&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/ProfitAndLoss.py (original)
+++ erp5/trunk/products/ERP5/TargetSolver/ProfitAndLoss.py Mon Apr 24 10:41:09 2006
@@ -29,7 +29,6 @@
 
 # from Products.ERP5.Tool.SimulationTool import registerTargetSolver
 from CopyToTarget import CopyToTarget
-from zLOG import LOG
 
 class ProfitAndLoss(CopyToTarget):
   """
@@ -45,13 +44,17 @@
       Movement difference as a profit (ie. a quantity coming from nowhere)
       Accumulate into delivered movement
     """
-    LOG('profit and loss called on movement', 0, repr(movement))
     delivery_line = movement.getDeliveryValue()
     delivery_line_quantity = delivery_line.getQuantity()
     if delivery_line_quantity is not None:
       target_quantity = delivery_line_quantity * movement.getDeliveryRatio()
       added_quantity = movement.getQuantity() - target_quantity
-      movement.edit(profit_quantity=added_quantity)
+      movement.edit(profit_quantity = added_quantity)
     delivery = movement.getDeliveryValue()
     if delivery is not None:
-      delivery.activate(after_path_and_method_id=(movement.getPath(), ['immediateReindexObject', 'recursiveImmediateReindexObject'])).edit()
+      delivery.activate(
+        after_path_and_method_id = (
+          movement.getPath(),
+          ['immediateReindexObject', 'recursiveImmediateReindexObject']
+        )
+      ).edit()

Modified: erp5/trunk/products/ERP5/TargetSolver/Redirect.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/Redirect.py?rev=6867&r1=6866&r2=6867&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/Redirect.py (original)
+++ erp5/trunk/products/ERP5/TargetSolver/Redirect.py Mon Apr 24 10:41:09 2006
@@ -35,7 +35,7 @@
     Redirects all simulation movements to new target
   """
 
-  def solve(self, movement, new_target):
+  def solve(self, simulation_movement, new_target):
     """
       Updates all sources and destinations to new values defined 
       in self by mapping 
@@ -46,15 +46,15 @@
     """
     for p in ('source', 'destination'):
       for q in ('source', 'destination'):
-        if movement.getProperty(p) == getattr(self, q):
+        if simulation_movement.getProperty(p) == getattr(self, q):
           self.setProperty(p, getattr(self, 'target_%s' % q))
           break
     for p in ('source_section', 'destination_section'):
       for q in ('source_section', 'destination_section'):
-        if movement.getProperty(p) == getattr(self, q):
+        if simulation_movement.getProperty(p) == getattr(self, q):
           self.setProperty(p, getattr(self, 'target_%s' % q))
           break
-    delivery_value = movement.getDeliveryValue() # Get delivery movement
+    delivery_value = simulation_movement.getDeliveryValue() # Get delivery movement
     if delivery_value is not None:
       delivery_value = delivery_value.getDeliveryValue() # Get root delivery
       if delivery_value is not None:

Modified: erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py?rev=6867&r1=6866&r2=6867&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py (original)
+++ erp5/trunk/products/ERP5/TargetSolver/SplitAndDefer.py Mon Apr 24 10:41:09 2006
@@ -42,39 +42,39 @@
     (excessive qty is not covered)
   """
 
-  def solve(self, movement):
+  def solve(self, simulation_movement):
     """
-      Split a movement and accumulate
+      Split a simulation movement and accumulate
     """
-    movement_quantity = movement.getQuantity()
-    delivery_quantity = movement.getDeliveryQuantity()
-    new_movement_quantity = delivery_quantity * movement.getDeliveryRatio()
+    movement_quantity = simulation_movement.getQuantity()
+    delivery_quantity = simulation_movement.getDeliveryQuantity()
+    new_movement_quantity = delivery_quantity * simulation_movement.getDeliveryRatio()
 
     if movement_quantity > new_movement_quantity:
       split_index = 0
-      new_id = "%s_split_%s" % (movement.getId(), split_index)
-      while getattr(movement.aq_parent, new_id, None) is not None:
+      new_id = "%s_split_%s" % (simulation_movement.getId(), split_index)
+      while getattr(simulation_movement.aq_parent, new_id, None) is not None:
         split_index += 1
-        new_id = "%s_split_%s" % (movement.getId(), split_index)
+        new_id = "%s_split_%s" % (simulation_movement.getId(), split_index)
       # Adopt different dates for defferred movements
-      new_movement = movement.aq_parent.newContent(
+      new_movement = simulation_movement.aq_parent.newContent(
                         portal_type="Simulation Movement",
                         id=new_id,
-                        efficiency=movement.getEfficiency(),
+                        efficiency=simulation_movement.getEfficiency(),
                         start_date=self.start_date,
                         stop_date=self.stop_date,
-                        order=movement.getOrder(),
-                        deliverable=movement.isDeliverable(),
+                        order=simulation_movement.getOrder(),
+                        deliverable=simulation_movement.isDeliverable(),
                         quantity=movement_quantity-new_movement_quantity,
-                        source = movement.getSource(),
-                        destination = movement.getDestination(),
-                        source_section = movement.getSourceSection(),
-                        resource = movement.getResource(),
-                        destination_section = movement.getDestinationSection(),
+                        source = simulation_movement.getSource(),
+                        destination = simulation_movement.getDestination(),
+                        source_section = simulation_movement.getSourceSection(),
+                        resource = simulation_movement.getResource(),
+                        destination_section = simulation_movement.getDestinationSection(),
                         activate_kw=self.activate_kw,
                         **self.additional_parameters
       )
       new_movement.activate(**self.additional_parameters).expand()
-    movement._v_activate_kw = self.activate_kw
-    movement.activate(**self.additional_parameters).expand()
-    CopyToTarget.solve(self, movement)
+    simulation_movement._v_activate_kw = self.activate_kw
+    simulation_movement.activate(**self.additional_parameters).expand()
+    CopyToTarget.solve(self, simulation_movement)

Modified: erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py?rev=6867&r1=6866&r2=6867&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py (original)
+++ erp5/trunk/products/ERP5/TargetSolver/SplitQuantity.py Mon Apr 24 10:41:09 2006
@@ -31,34 +31,46 @@
 from zLOG import LOG
 
 class SplitQuantity(CopyToTarget):
+  """
+    Split a simulation movement based on a resource quantity.
+  """
 
-  def solve(self, movement):
+  def solve(self, simulation_movement):
     """
-      Split a movement based on a given quantity
+      From simulation_movement, generate new_movement containing self.quantity
+      resources, of start_date self.start_date and stop_date self.stop_date.
+      
+      movement.quantity is updated
+      
+      XXX incomplete docstring
     """
     split_index = 0
-    new_id = "%s_split_%s" % (movement.getId(), split_index)
-    while getattr(movement.aq_parent, new_id, None) is not None:
+    new_id = "%s_split_%s" % (simulation_movement.getId(), split_index)
+    while getattr(simulation_movement.aq_parent, new_id, None) is not None:
       split_index += 1
-      new_id = "%s_split_%s" % (movement.getId(), split_index)
+      new_id = "%s_split_%s" % (simulation_movement.getId(), split_index)
     # Adopt different dates for defferred movements
-    new_movement = movement.aq_parent.newContent(
-                      portal_type="Simulation Movement",
-                      id=new_id,
-                      efficiency=movement.getEfficiency(),
-                      start_date=self.start_date,
-                      stop_date=self.stop_date,
-                      # XXX resource
-                      order=movement.getOrder(),
-                      deliverable=movement.isDeliverable(),
-                      quantity=self.quantity,
-                      source = movement.getSource(),
-                      destination = movement.getDestination(),
-                      source_section = movement.getSourceSection(),
-                      destination_section = movement.getDestinationSection(),
-                      activate_kw=self.activate_kw,
-                      **self.additional_parameters
+    new_movement = simulation_movement.aq_parent.newContent(
+      portal_type = "Simulation Movement",
+      id = new_id,
+      efficiency = simulation_movement.getEfficiency(),
+      start_date = self.start_date,
+      stop_date = self.stop_date,
+      # XXX resource
+      order = simulation_movement.getOrder(),
+      deliverable = simulation_movement.isDeliverable(),
+      quantity = self.quantity,
+      source = simulation_movement.getSource(),
+      destination = simulation_movement.getDestination(),
+      source_section = simulation_movement.getSourceSection(),
+      destination_section = simulation_movement.getDestinationSection(),
+      activate_kw = self.activate_kw,
+      **self.additional_parameters
     )
-    movement._v_activate_kw = self.activate_kw
-    movement.edit(quantity=(movement.getQuantity() - self.quantity) * movement.getDeliveryRatio())
+    simulation_movement._v_activate_kw = self.activate_kw
+    simulation_movement.edit (
+      quantity = (simulation_movement.getQuantity() - self.quantity)
+                 * simulation_movement.getDeliveryRatio()
+    )
+    #XXX: vincent: I don't understand why it's multiplicated.
     return new_movement

Modified: erp5/trunk/products/ERP5/TargetSolver/TargetSolver.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/TargetSolver.py?rev=6867&r1=6866&r2=6867&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/TargetSolver.py (original)
+++ erp5/trunk/products/ERP5/TargetSolver/TargetSolver.py Mon Apr 24 10:41:09 2006
@@ -44,9 +44,12 @@
 
     - call 'updateNewTarget' on Applied rule
       to update parent target
+
+    This class is the base class for all target solvers.
+    It's virtual due to "solve", which needs to be overloaded.
   """
 
-  def __init__(self, additional_parameters=None,activate_kw=None,**kw):
+  def __init__(self, additional_parameters=None, activate_kw=None, **kw):
     """
       Creates an instance of TargetSolver with parameters
     """
@@ -69,11 +72,14 @@
 
       XXX: maybe we do not need to pass previous_target as parameter
       (since we accumulate it)
+
+      This function must be implemented by the actual solver which derivates
+      from this class.
     """
 
   def solveDelivery(self, delivery):
     """
-      Called in case it is needed for the solving process
+      Solves the whole delivery.
     """
     # Then apply to all movements
     for movement in delivery.getMovementList():
@@ -81,9 +87,9 @@
 
   def solveMovement(self, movement):
     """
-      Called in case it is needed for the solving process
+      Solves a movement.
     """
-    # apply to all movements
+    # Apply to all simulation movements
     simulation_movement_list = movement.getDeliveryRelatedValueList(
                                              portal_type="Simulation Movement")
     solved_movement_list = []
@@ -100,4 +106,3 @@
     # XXX this is not the job of TargetSolver to create new Delivery !
     pass
 
-

Modified: erp5/trunk/products/ERP5/TargetSolver/TransformationSourcingCopyToTarget.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/TargetSolver/TransformationSourcingCopyToTarget.py?rev=6867&r1=6866&r2=6867&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/TargetSolver/TransformationSourcingCopyToTarget.py (original)
+++ erp5/trunk/products/ERP5/TargetSolver/TransformationSourcingCopyToTarget.py Mon Apr 24 10:41:09 2006
@@ -30,40 +30,41 @@
 
 class TransformationSourcingCopyToTarget(CopyToTarget):
   """
-  Copy values simulation movement as target, and
+    Copy values simulation movement as target, and
     recursively solve the sourcing tree.
   """
-  def _generateValueDeltaDict(self, movement):
+  def _generateValueDeltaDict(self, simulation_movement):
     """
-    Get interesting value
+      Get interesting value
     """
-    value_dict = CopyToTarget._generateValueDict(self, movement)
+    value_dict = CopyToTarget._generateValueDict(self, simulation_movement)
     value_dict.update({
-      'aggregate_list': movement.getDeliveryValue().getAggregateList(),
+      'aggregate_list':
+        simulation_movement.getDeliveryValue().getAggregateList(),
     })
     return value_dict
 
-  def _generateValueDict(self, movement, aggregate_list=None,
+  def _generateValueDict(self, simulation_movement, aggregate_list = None,
                          **value_delta_dict):
     """
-    Generate values to save on movement.
+      Generate values to save on movement.
     """
-    value_dict = CopyToTarget._generateValueDict(self, movement,
+    value_dict = CopyToTarget._generateValueDict(self, simulation_movement,
                                                  **value_delta_dict)
     # Modify aggregate_list
     if aggregate_list is not None:
       value_dict['aggregate_list'] = aggregate_list
     return value_dict
 
-  def _getParentParameters(self, movement, 
+  def _getParentParameters(self, simulation_movement, 
                            **value_delta_dict):
     """
-    Get parent movement, and its value delta dict.
+      Get parent movement, and its value delta dict.
     """
-    applied_rule = movement.getParentValue()
+    applied_rule = simulation_movement.getParentValue()
     rule = applied_rule.getSpecialiseValue()
     if rule.getPortalType() != "Transformation Sourcing Rule":
       value_delta_dict.pop('aggregate_list', None)
-    return CopyToTarget._getParentParameters(self, movement, 
+    return CopyToTarget._getParentParameters(self, simulation_movement, 
                                              **value_delta_dict)
 




More information about the Erp5-report mailing list