[Erp5-report] r28139 - /erp5/trunk/products/ERP5/Document/

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Jul 22 16:08:56 CEST 2009


Author: luke
Date: Wed Jul 22 16:08:56 2009
New Revision: 28139

URL: http://svn.erp5.org?rev=28139&view=rev
Log:
 - merge BPMDeliveryRule and BPMPOrderRule common parts
 - provide new experimental, private methods in order to minimize code duplication between rules
 - simplify and unhardcode

Modified:
    erp5/trunk/products/ERP5/Document/BPMDeliveryRule.py
    erp5/trunk/products/ERP5/Document/BPMInvoicingRule.py
    erp5/trunk/products/ERP5/Document/BPMOrderRule.py
    erp5/trunk/products/ERP5/Document/BPMRule.py

Modified: erp5/trunk/products/ERP5/Document/BPMDeliveryRule.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BPMDeliveryRule.py?rev=28139&r1=28138&r2=28139&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/BPMDeliveryRule.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/BPMDeliveryRule.py [utf8] Wed Jul 22 16:08:56 2009
@@ -48,110 +48,42 @@
   security = ClassSecurityInfo()
   security.declareObjectProtected(Permissions.AccessContentsInformation)
 
-  # Default Properties
-  property_sheets = ( PropertySheet.Base
-                    , PropertySheet.XMLObject
-                    , PropertySheet.CategoryCore
-                    , PropertySheet.DublinCore
-                    , PropertySheet.Task
-                    , PropertySheet.AppliedRule
-                    )
+  def _getInputMovementList(self, applied_rule):
+    """Returns list of input movements for applied rule"""
+    order = applied_rule.getDefaultCausalityValue()
+    if order is not None:
+      return order.getMovementList(
+                     portal_type=order.getPortalDeliveryMovementTypeList())
+    return []
 
-  # Simulation workflow
+  def _getExpandablePropertyUpdateDict(self, applied_rule, movement, business_path,
+      **kw):
+    return {
+      'order_value': movement,
+      'delivery_value': movement,
+      'order_ratio': 1,
+      'delivery_ratio': 1,
+      'deliverable': 1,
+    }
+
   security.declareProtected(Permissions.ModifyPortalContent, 'expand')
-  def expand(self, applied_rule, delivery_movement_type_list=None, **kw):
-    """
-    Expands the additional Delivery movements to a new simulation tree.
-    Expand is only allowed to create or modify simulation movements for
-    delivery lines which are not already linked to another simulation
-    movement.
+  def expand(self, applied_rule, force=0, **kw):
+    add_list, modify_dict, \
+      delete_list = self._getCompensatedMovementList(applied_rule, **kw)
 
-    If the movement is not in current state, has no delivered child, and not
-    in delivery movements, it can be deleted.
-    Else if the movement is not in current state, it can be modified.
-    Else, it cannot be modified.
-    """
-    existing_movement_list = []
-    immutable_movement_list = []
-    delivery = applied_rule.getDefaultCausalityValue()
-    if delivery_movement_type_list is None:
-      delivery_movement_type_list = self.getPortalDeliveryMovementTypeList()
-    if delivery is not None:
-      delivery_movement_list = delivery.getMovementList(
-                                 portal_type=delivery_movement_type_list)
-      # Check existing movements
-      for movement in applied_rule.contentValues(
-          portal_type=self.movement_type):
-        if not movement.isFrozen():
-          movement_delivery = movement.getDeliveryValue()
-          if not movement._isTreeDelivered(ignore_first=1) and \
-              movement_delivery not in delivery_movement_list:
-            applied_rule._delObject(movement.getId())
-          else:
-            existing_movement_list.append(movement)
-        else:
-          existing_movement_list.append(movement)
-          immutable_movement_list.append(movement)
+    # delete not needed movements
+    for movement_id in delete_list:
+      applied_rule._delObject(movement_id)
 
-      # Create or modify movements
-      for deliv_mvt in delivery_movement_list:
-        sim_mvt = deliv_mvt.getDeliveryRelatedValue()
-        if sim_mvt is None:
-          # create a new deliv_mvt
-          if deliv_mvt.getParentUid() == deliv_mvt.getExplanationUid():
-            # We are on a line
-            new_id = deliv_mvt.getId()
-          else:
-            # We are on a cell
-            new_id = "%s_%s" % (deliv_mvt.getParentId(), deliv_mvt.getId())
-          # Generate the simulation deliv_mvt
-          property_dict = self.self._getExpandablePropertyDict(applied_rule,
-              deliv_mvt)
-          new_sim_mvt = applied_rule.newContent(
-              portal_type=self.movement_type,
-              id=new_id,
-              order_value=deliv_mvt,
-              order_ratio=1,
-              delivery_value=deliv_mvt,
-              delivery_ratio=1,
-              deliverable=1,
+    # update existing
+    for movement, property_dict in modify_dict.items():
+      applied_rule[movement].edit(**property_dict)
 
-              **property_dict
-          )
-        elif sim_mvt in existing_movement_list:
-          if sim_mvt not in immutable_movement_list:
-            # modification allowed
-            # XXX Hardcoded value
-            sim_mvt.edit(
-                delivery_value=deliv_mvt,
-                delivery_ratio=1,
-                deliverable=1,
-                force_update=1,
-                **property_dict
-                )
-          else:
-            # modification disallowed, must compensate
-            raise NotImplementedError('BPM *have* to support')
+    # add new ones
+    for movement_dict in add_list:
+      movement_id = applied_rule._get_id(movement_dict.pop('id', None))
+      new_movement = applied_rule.newContent(id=movement_id,
+          portal_type=self.movement_type, **movement_dict)
 
-      # Now we can set the last expand simulation state to the current state
-      applied_rule.setLastExpandSimulationState(delivery.getSimulationState())
     # Pass to base class
-    BPMRule.expand(self, applied_rule, **kw)
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'isStable')
-  def isStable(self, applied_rule):
-    """
-    Checks that the applied_rule is stable
-    """
-    return 0
-
-  # Deliverability / orderability
-  def isOrderable(self, movement):
-    return 1
-
-  def isDeliverable(self, movement):
-    if movement.getSimulationState() in movement \
-        .getPortalDraftOrderStateList():
-      return 0
-    return 1
-
+    BPMRule.expand(self, applied_rule, force=force, **kw)  # Simulation workflow

Modified: erp5/trunk/products/ERP5/Document/BPMInvoicingRule.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BPMInvoicingRule.py?rev=28139&r1=28138&r2=28139&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/BPMInvoicingRule.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/BPMInvoicingRule.py [utf8] Wed Jul 22 16:08:56 2009
@@ -44,22 +44,10 @@
   # CMF Type Definition
   meta_type = 'ERP5 BPM Invoicing Rule'
   portal_type = 'BPM Invoicing Rule'
-  add_permission = Permissions.AddPortalContent
-  isPortalContent = 1
-  isRADContent = 1
 
   # Declarative security
   security = ClassSecurityInfo()
   security.declareObjectProtected(Permissions.AccessContentsInformation)
-
-  # Default Properties
-  property_sheets = ( PropertySheet.Base
-                    , PropertySheet.XMLObject
-                    , PropertySheet.CategoryCore
-                    , PropertySheet.DublinCore
-                    , PropertySheet.Task
-                    , PropertySheet.AppliedRule
-                    )
 
   security.declareProtected(Permissions.AccessContentsInformation,
                             'isAccountable')
@@ -73,13 +61,11 @@
     return 0
 
 #### Helper methods for expand
-  def _generatePrevisionList(self, applied_rule, **kw):
-    return_list = []
-    for prevision_dict in BPMRule._generatePrevisionList(self, applied_rule,
-        **kw):
-      prevision_dict['deliverable'] = 1
-      return_list.append(prevision_dict)
-    return return_list
+  def _getExpandablePropertyUpdateDict(self, applied_rule, movement, business_path,
+      **kw):
+    return {
+      'deliverable': 1
+    }
 
   security.declareProtected(Permissions.ModifyPortalContent, 'expand')
   def expand(self, applied_rule, force=0, **kw):
@@ -94,27 +80,30 @@
     """
     parent_movement = applied_rule.getParentValue()
     if parent_movement is not None:
-      if not parent_movement.isFrozen():
-        add_list, modify_dict, \
-          delete_list = self._getCompensatedMovementList(applied_rule, **kw)
-        for movement_id in delete_list:
-          applied_rule._delObject(movement_id)
+      add_list, modify_dict, \
+        delete_list = self._getCompensatedMovementList(applied_rule, **kw)
+      for movement_id in delete_list:
+        applied_rule._delObject(movement_id)
 
-        for movement, prop_dict in modify_dict.items():
-          applied_rule[movement].edit(**prop_dict)
+      for movement, prop_dict in modify_dict.items():
+        applied_rule[movement].edit(**prop_dict)
 
-        for movement_dict in add_list:
-          if 'id' in movement_dict.keys():
-            mvmt_id = applied_rule._get_id(movement_dict.pop('id'))
-            new_mvmt = applied_rule.newContent(id=mvmt_id,
-                portal_type=self.movement_type)
-          else:
-            new_mvmt = applied_rule.newContent(portal_type=self.movement_type)
-          new_mvmt.edit(**movement_dict)
+      for movement_dict in add_list:
+        if 'id' in movement_dict.keys():
+          mvmt_id = applied_rule._get_id(movement_dict.pop('id'))
+          new_mvmt = applied_rule.newContent(id=mvmt_id,
+              portal_type=self.movement_type)
+        else:
+          new_mvmt = applied_rule.newContent(portal_type=self.movement_type)
+        new_mvmt.edit(**movement_dict)
 
     # Pass to base class
     BPMRule.expand(self, applied_rule, force=force, **kw)
 
+  def _getInputMovementList(self, applied_rule):
+    """Returns list of input movements for applied rule"""
+    return [applied_rule.getParentValue()]
+
   def isDeliverable(self, movement):
     return movement.getResource() is not None
 

Modified: erp5/trunk/products/ERP5/Document/BPMOrderRule.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BPMOrderRule.py?rev=28139&r1=28138&r2=28139&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/BPMOrderRule.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/BPMOrderRule.py [utf8] Wed Jul 22 16:08:56 2009
@@ -30,10 +30,8 @@
 ##############################################################################
 
 from AccessControl import ClassSecurityInfo
-from Products.ERP5Type import Permissions, PropertySheet
-from Products.ERP5.Document.BPMRule import BPMRule
+from Products.ERP5Type import Permissions
 from Products.ERP5.Document.BPMDeliveryRule import BPMDeliveryRule
-from zLOG import LOG, WARNING
 
 class BPMOrderRule(BPMDeliveryRule):
   """
@@ -49,117 +47,19 @@
   security = ClassSecurityInfo()
   security.declareObjectProtected(Permissions.AccessContentsInformation)
 
-  # Default Properties
-  property_sheets = ( PropertySheet.Base
-                    , PropertySheet.XMLObject
-                    , PropertySheet.CategoryCore
-                    , PropertySheet.DublinCore
-                    , PropertySheet.Task
-                    , PropertySheet.AppliedRule
-                    )
+  def _getInputMovementList(self, applied_rule):
+    """Returns list of input movements for applied rule"""
+    order = applied_rule.getDefaultCausalityValue()
+    if order is not None:
+      return order.getMovementList(
+                     portal_type=order.getPortalOrderMovementTypeList())
+    return []
 
-  # Simulation workflow
-  security.declareProtected(Permissions.ModifyPortalContent, 'expand')
-  def expand(self, applied_rule, force=0, **kw):
-    """
-      Expands the Order to a new simulation tree.
-      expand is only allowed to modify a simulation movement if it doesn't
-      have a delivery relation yet.
-
-      If the movement is in ordered or planned state, has no delivered
-      child, and is not in order, it can be deleted.
-      Else, if the movement is in ordered or planned state, has no
-      delivered child, and is in order, it can be modified.
-      Else, it cannot be modified.
-    """
-
-    existing_movement_list = []
-    immutable_movement_list = []
-    order = applied_rule.getDefaultCausalityValue()
-    business_process = applied_rule.getBusinessProcessValue()
-    if order is not None:
-      order_movement_list = order.getMovementList(
-                     portal_type=order.getPortalOrderMovementTypeList())
-      # check existing movements
-      for simulation_movement in applied_rule.contentValues(
-          portal_type=self.movement_type):
-        if not simulation_movement.isFrozen():
-          movement_order = simulation_movement.getOrderValue()
-          if movement_order in order_movement_list:
-            existing_movement_list.append(simulation_movement)
-          else:
-            applied_rule._delObject(simulation_movement.getId())
-        else:
-          existing_movement_list.append(simulation_movement)
-          immutable_movement_list.append(simulation_movement)
-
-      # this dict simulates getOrderRelatedValue, but it will not work if an
-      # order was generated from multiple applied rules
-      order_movement_dict = {}
-      for s_m in applied_rule.objectValues():
-        order_movement = s_m.getOrderValue()
-        if order_movement is not None:
-          order_movement_dict[order_movement.getPath()] = s_m
-
-      # Create or modify movements
-      for order_movement in order_movement_list:
-        related_order = order_movement_dict.get(order_movement.getPath(),
-            None)
-        if related_order is None:
-          related_order = order_movement.getOrderRelatedValue()
-
-        movement_and_path_list = []
-        for business_path in business_process.getPathValueList(
-                            self.getProperty('trade_phase_list'),
-                            order_movement):
-          movement_and_path_list.append((order_movement, business_path))
-
-        if len(movement_and_path_list) > 1:
-          raise NotImplementedError
-
-        for movement, business_path in movement_and_path_list:
-          property_dict = self._getExpandablePropertyDict(
-                                         applied_rule, movement,
-                                         business_path)
-          property_dict.update(order_value=order_movement)
-        if related_order is None:
-          # Generate a simulation movement
-          # Do not try to create meaningfull IDs, as order movement can be
-          # hierarchical
-          applied_rule.newContent(
-              portal_type=self.movement_type,
-              order_ratio=1,
-              delivery_ratio=1,
-              deliverable=1,
-              **property_dict)
-        elif related_order in existing_movement_list:
-          if related_order not in immutable_movement_list:
-            # modification allowed
-            related_order.edit(
-                **property_dict)
-          else:
-            # modification disallowed, must compensate
-            raise NotImplementedError('BPM *have* to support compensation')
-
-          # Now we can set the last expand simulation state to the current
-          # state
-          applied_rule.setLastExpandSimulationState(
-              order.getSimulationState())
-    # Pass to base class
-    BPMRule.expand(self, applied_rule, force=force, **kw)
-
-  security.declareProtected(Permissions.AccessContentsInformation, 'isStable')
-  def isStable(self, applied_rule):
-    """
-    Checks that the applied_rule is stable
-    """
-    LOG('OrderRule.isStable', WARNING, 'Not Implemented')
-    return 1
-
-  security.declareProtected(Permissions.AccessContentsInformation,
-                            'isDivergent')
-  def isDivergent(self, movement):
-    """
-    Checks that the movement is divergent
-    """
-    return BPMRule.isDivergent(self, movement)
+  def _getExpandablePropertyUpdateDict(self, applied_rule, movement, business_path,
+      **kw):
+    return {
+      'order_value': movement,
+      'order_ratio': 1,
+      'delivery_ratio': 1,
+      'deliverable': 1,
+    }

Modified: erp5/trunk/products/ERP5/Document/BPMRule.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/BPMRule.py?rev=28139&r1=28138&r2=28139&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/BPMRule.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/BPMRule.py [utf8] Wed Jul 22 16:08:56 2009
@@ -69,6 +69,7 @@
                     , PropertySheet.Predicate
                     , PropertySheet.Reference
                     , PropertySheet.Version
+                    , PropertySheet.AppliedRule
                     )
 
 #### Helpers
@@ -198,8 +199,6 @@
                 movement.getRelativeUrl())
     return (add_list, modify_dict, delete_list)
 
-  security.declareProtected(Permissions.AccessContentsInformation,
-                            '_getExpandablePropertyDict')
   def _getExpandablePropertyDict(self, applied_rule, movement, business_path,
       **kw):
     """
@@ -238,33 +237,40 @@
       property_dict['start_date'] = movement.getStartDate()
       property_dict['stop_date'] = movement.getStopDate()
 
-    # save a relation to supply path for builders XXX which category
+    # save a relation to business path
     property_dict['causality_value'] = business_path
 
+    # rule specific
+    property_dict.update(**self._getExpandablePropertyUpdateDict(applied_rule,
+      movement, business_path, **kw))
     return property_dict
 
   def _generatePrevisionList(self, applied_rule, **kw):
     """
-    Generate a list of movements, that should be children of this rule,
+    Generate a list of dictionaries, that contain calculated content of
+    current Simulation Movements in applied rule.
     based on its context (parent movement, delivery, configuration ...)
 
     These previsions are returned as dictionaries.
     """
-    # XXX support list of movements
-    context_movement = applied_rule.getParentValue()
+    input_movement_list = self._getInputMovementList(applied_rule)
     business_process = applied_rule.getBusinessProcessValue()
 
-    movement_and_path_list = []
-    for business_path in business_process.getPathValueList(
-                        self.getProperty('trade_phase_list'),
-                        context_movement):
-      movement_and_path_list.append((context_movement, business_path))
-
-    if len(movement_and_path_list) > 1:
+    input_movement_and_path_list = []
+    business_path_list = []
+    for input_movement in input_movement_list:
+      for business_path in business_process.getPathValueList(
+                          self.getProperty('trade_phase_list'),
+                          input_movement):
+        input_movement_and_path_list.append((input_movement, business_path))
+        business_path not in business_path_list and business_path_list \
+            .append(business_path)
+
+    if len(business_path_list) > 1:
       raise NotImplementedError
 
-    for movement, business_path in movement_and_path_list:
-      property_dict = self._getExpandablePropertyDict(
-                                     applied_rule, movement, business_path)
-      property_dict['deliverable'] = 1
-    return [property_dict]
+    prevision_dict_list = []
+    for input_movement, business_path in input_movement_and_path_list:
+      prevision_dict_list.append(self._getExpandablePropertyDict(applied_rule,
+          input_movement, business_path))
+    return prevision_dict_list




More information about the Erp5-report mailing list