[Erp5-report] r17489 - /erp5/trunk/products/ERP5/Document/Inventory.py

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Nov 9 13:54:09 CET 2007


Author: aurel
Date: Fri Nov  9 13:54:09 2007
New Revision: 17489

URL: http://svn.erp5.org?rev=17489&view=rev
Log:
modify reindexation way so that we can defined the way we want to
reindex by a script specifying request parameter and properties used

Modified:
    erp5/trunk/products/ERP5/Document/Inventory.py

Modified: erp5/trunk/products/ERP5/Document/Inventory.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Inventory.py?rev=17489&r1=17488&r2=17489&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Inventory.py (original)
+++ erp5/trunk/products/ERP5/Document/Inventory.py Fri Nov  9 13:54:09 2007
@@ -69,6 +69,23 @@
     group of catalogged objects.
     """
     return self.immediateReindexObject(**kw)
+
+  # method used to build category list that willbe set on tmp line
+  def appendToCategoryListFromUid(self, category_list, uid, base_category):
+    object_list = [x.getObject() for x in self.portal_catalog(uid=uid)]
+    if len(object_list):
+      category_list.append("%s/%s" %(base_category, object_list[0].getRelativeUrl()))
+
+  def appendToCategoryList(self, category_list, value, base_category):
+    category_list.append("%s/%s" %(base_category, value))
+  
+  def splitAndExtendToCategoryList(self, category_list, value, *args, **kw):
+    if value is not None:
+      value_list = value.split('\n')
+    else:
+      value_list = []
+    category_list.extend(value_list)
+
 
   def immediateReindexObject(self, temp_constructor=None, **kw):
     """
@@ -92,145 +109,196 @@
                and 'transactionless' not in method.connection_id:
             connection_id = method.connection_id
             break
-                
-    resource_and_variation_dict = {}
-    stock_object_list = []
-    stock_append = stock_object_list.append
+
+    default_inventory_calculation_list = ({ "inventory_params" : {"node" : self.getDestination(),
+                                                                          "group_by_sub_variation" : 1,
+                                                                          "group_by_variation" : 1,
+                                                                          "group_by_resource" : 1,
+                                                                          },
+                                            "list_method" : "getMovementList",
+                                            "first_level" : ({'key' : 'resource_relative_url',
+                                                             'getter' : 'getResource',
+                                                              'setter' : ("appendToCategoryList", "resource")},
+                                                             {'key' : 'variation_text',
+                                                              'getter' : 'getVariationText',
+                                                              'setter' : "splitAndExtendToCategoryList"},
+                                                             ),
+                                            "second_level" : ({'key' : 'sub_variation_text',
+                                                               'getter' : 'getSubVariationText',
+                                                               'setter' : "splitAndExtendToCategoryList"},
+                                                              ),
+                                            },
+                                          )
+
+    method = self._getTypeBasedMethod('getDefaultInventoryCalculationList')    
+    if method is not None:
+      default_inventory_calculation_list = method()
+      
+
     if temp_constructor is None:
       from Products.ERP5Type.Document import newTempDeliveryLine
       temp_constructor = newTempDeliveryLine
-    start_date = self.getStartDate()
-    node = self.getDestination()
-    # build a dict containing all inventory for this node 
-    # group by resource/variation and then subvariation
-    current_inventory_list = \
-        self.getPortalObject().portal_simulation.getInventoryList(
-                to_date=start_date,
-                node=node,
-                simulation_state=self.getPortalCurrentInventoryStateList(),
-                group_by_sub_variation=1,
-                group_by_variation=1,
-                group_by_resource=1,
-                connection_id=connection_id,
-        )
-    current_inventory_dict = {}
-    current_inventory_key_id_list = ('resource_relative_url', 'variation_text')
-    for line in current_inventory_list:
-      current_inventory_key = [line[x] for x in current_inventory_key_id_list]
-      for x in xrange(len(current_inventory_key)):
-        if current_inventory_key[x] is None:
-          current_inventory_key[x] = ""
-      current_inventory_key = tuple(current_inventory_key)
-      try:
-        current_inventory_by_sub_variation = \
-            current_inventory_dict[current_inventory_key]
-      except KeyError:
-        current_inventory_by_sub_variation = \
-            current_inventory_dict[current_inventory_key] = {}
-      current_inventory_by_sub_variation[line['sub_variation_text']] = \
-            line['total_quantity']
-
-    def getCurrentInventoryBySubVariation(**criterion_dict):
-      current_inventory_key = tuple(
-          [criterion_dict[x] for x in current_inventory_key_id_list])
-      return current_inventory_dict.get(current_inventory_key, {})
-
-    # Browse all movements on inventory and create diff line when necessary
-    not_used_inventory_dict = {}
-    inventory_id = self.getId()
-    for movement in self.getMovementList():
-      if movement.getResourceValue() is not None and \
-          movement.getQuantity() not in (None, ''):
-        resource_path =  movement.getResource()
-        variation_text = movement.getVariationText()
-        movement_quantity = movement.getQuantity()
-        destination_payment_path = movement.getDestinationPayment()          
-        resource_and_variation_key = (resource_path, variation_text)
-        inventory_by_subvariation_dict = getCurrentInventoryBySubVariation(
-                          resource_relative_url=resource_path,
-                          variation_text=variation_text)
-        movement_sub_variation_text = movement.getSubVariationText()
-        # Check wath is the quantity difference
-        if movement_sub_variation_text in \
-                              inventory_by_subvariation_dict.keys():
-          total_quantity = inventory_by_subvariation_dict.pop(
-                          movement_sub_variation_text)
-          # Put remaining subvariation in a dict to know which one 
-          # to removed at end
-          not_used_inventory_dict[resource_and_variation_key] = \
-                            inventory_by_subvariation_dict
-          diff_quantity = movement_quantity - total_quantity
+    stop_date = self.getStopDate()
+
+    stock_object_list = []
+    stock_append = stock_object_list.append
+
+    for inventory_calculation_dict in default_inventory_calculation_list:
+
+      # build a dict containing all inventory for this node 
+      # group by resource/variation and then subvariation
+      current_inventory_list = \
+          self.getPortalObject().portal_simulation.getInventoryList(        
+                  to_date=stop_date,
+                  simulation_state=self.getPortalCurrentInventoryStateList(),
+                  connection_id=connection_id,
+                  **inventory_calculation_dict['inventory_params']
+          )
+      current_inventory_dict = {}
+      current_inventory_key_id_list = [x["key"] for x in inventory_calculation_dict['first_level']]
+      for line in current_inventory_list:
+        current_inventory_key = tuple(
+          [line[x] for x in current_inventory_key_id_list])
+        if current_inventory_key[1] is None:
+          # To be consistent
+          current_inventory_key = (current_inventory_key[0], "")
+
+        if inventory_calculation_dict.has_key("second_level"):
+          # two level of variation
+          try:
+            current_inventory_by_sub_variation = \
+                current_inventory_dict[current_inventory_key]
+          except KeyError:
+            current_inventory_by_sub_variation = \
+                current_inventory_dict[current_inventory_key] = {}
+          second_level_key_id_list = [x['key'] for x in inventory_calculation_dict['second_level']]
+          second_level_key = tuple([line[x] for x in second_level_key_id_list])
+          current_inventory_by_sub_variation[second_level_key] = line['total_quantity']
         else:
-          # Inventory for new resource/variation/sub_variation
-          diff_quantity = movement_quantity
-          # Put remaining subvariation in a dict to know which one 
-          # to removed at end
-          not_used_inventory_dict[resource_and_variation_key] = \
-                                        inventory_by_subvariation_dict
-
-        # Create tmp movement with only diff between inventory
-        # and previous stock values
-        if diff_quantity != 0:
-          kwd = {'uid': movement.getUid(),
-                 'start_date': start_date}
-          if variation_text is not None:
-            variation_list = variation_text.split('\n')
+          # only one level of variation
+          current_inventory_dict[current_inventory_key] = line['total_quantity']
+
+      # Browse all movements on inventory and create diff line when necessary
+      not_used_inventory_dict = {}
+      inventory_id = self.getId()
+      list_method = inventory_calculation_dict['list_method']      
+      method = getattr(self, list_method)      
+      for movement in method():
+        if movement.getResourceValue() is not None and \
+            movement.getQuantity() not in (None, ''):
+
+          movement_quantity = movement.getQuantity()
+          # construct key to retrieve inventory into dict
+          getter_list = [x['getter'] for x in inventory_calculation_dict['first_level']]
+          key_list = []
+          for getter in getter_list:
+            method = getattr(movement, getter, None)
+            if method is not None:
+              key_list.append(method())
+          inventory_value = current_inventory_dict.get(tuple(key_list), 0)
+          second_key_list = []
+          if inventory_calculation_dict.has_key('second_level'):
+            if inventory_value == 0:
+              inventory_value = {}
+            # two level
+            second_getter_list = [x['getter'] for x in inventory_calculation_dict['second_level']]
+            for getter in second_getter_list:
+              method = getattr(movement, getter, None)
+              if method is not None:
+                second_key_list.append(method())
+              second_key_list = tuple(second_key_list)
+              if inventory_value.has_key(second_key_list):
+                total_quantity = inventory_value.pop(second_key_list)
+                # Put remaining subvariation in a dict to know which one 
+                # to removed at end
+                not_used_inventory_dict[tuple(key_list)] = inventory_value
+                diff_quantity = movement_quantity - total_quantity
+              else:
+                # Inventory for new resource/variation/sub_variation
+                diff_quantity = movement_quantity
+                # Put remaining subvariation in a dict to know which one 
+                # to removed at end
+                not_used_inventory_dict[tuple(key_list)] = inventory_value
           else:
-            variation_list = []
-          category_list = self.getCategoryList()
-          sub_variation_list = []
-          if movement_sub_variation_text is not None:
-            sub_variation_list = movement_sub_variation_text.split('\n')
-          temp_delivery_line = temp_constructor(self,
-                                                inventory_id)
-          kwd['quantity'] = diff_quantity
-          category_list.append('resource/%s' % resource_path)
-          category_list.append(
-              'destination_payment/%s' % destination_payment_path)
-          category_list.extend(variation_list)
-          category_list.extend(sub_variation_list)
-          kwd['category_list'] = category_list
-          temp_delivery_line.edit(**kwd)
-          stock_append(temp_delivery_line)
-
-    # Now create line to remove some subvariation text not present 
-    # in new inventory
-    inventory_uid = self.getUid()
-    for resource_and_variation_key in not_used_inventory_dict.keys():
-      inventory_by_subvariation_dict = \
-          not_used_inventory_dict[resource_and_variation_key]
-      for sub_variation_text in inventory_by_subvariation_dict.keys():
-        category_list = self.getCategoryList()
-        quantity = inventory_by_subvariation_dict[sub_variation_text]
-        resource_path, variation_text = resource_and_variation_key
-        kwd = {'uid': inventory_uid,
-               'start_date': start_date}
-        if variation_text is not None:
-          variation_list = variation_text.split('\n')
-        else:
-          variation_list = []                
-        sub_variation_list = sub_variation_text.split('\n')
-        diff_quantity = - quantity                    
-        temp_delivery_line = temp_constructor(self, inventory_id)
-        kwd['quantity'] = diff_quantity
-        category_list.append('resource/%s' % resource_path)
-        category_list.extend(variation_list)
-        category_list.extend(sub_variation_list)
-        kwd['category_list'] = category_list
-        temp_delivery_line.edit(**kwd)
-        stock_append(temp_delivery_line)
+            # we got the quantity from first level key
+            diff_quantity = movement_quantity - inventory_value
+              
+          # Create tmp movement with only diff between inventory
+          # and previous stock values
+          if diff_quantity != 0:
+            kwd = {'uid': movement.getUid(),
+                   'start_date': stop_date}
+
+            # create the tmp line and set category on it
+            temp_delivery_line = temp_constructor(self,
+                                                  inventory_id)
+            kwd['quantity'] = diff_quantity
+            category_list = self.getCategoryList()            
+
+            setter_list = [x['setter'] for x in inventory_calculation_dict['first_level']]
+            if inventory_calculation_dict.has_key("second_level"):
+              setter_list.extend([x['setter'] for x in inventory_calculation_dict['second_level']])
+            value_list = list(key_list) + list(second_key_list)
+            for x in xrange(len(setter_list)):
+              value = value_list[x]
+              setter = setter_list[x]
+              base_category = ""
+              if isinstance(setter, (tuple, list)):
+                base_category = setter[1]
+                setter = setter[0]
+              method = getattr(self, setter, None)
+              if method is not None:
+                method(category_list, value, base_category)
+
+            kwd['category_list'] = category_list
+            temp_delivery_line.edit(**kwd)
+            stock_append(temp_delivery_line)
+
+      # Now create line to remove some subvariation text not present 
+      # in new inventory
+      if len(not_used_inventory_dict):
+        inventory_uid = self.getUid()
+        for first_level_key in not_used_inventory_dict.keys():
+          inventory_value = \
+              not_used_inventory_dict[tuple(first_level_key)]
+          for second_level_key in inventory_value.keys():
+            diff_quantity = - inventory_value[tuple(second_level_key)]
+
+            kwd = {'uid': inventory_uid,
+                   'start_date': stop_date}
+
+            # create the tmp line and set category on it
+            temp_delivery_line = temp_constructor(self,
+                                                  inventory_id)
+            kwd['quantity'] = diff_quantity
+            category_list = self.getCategoryList()            
+
+            setter_list = [x['setter'] for x in inventory_calculation_dict['first_level']]
+            if inventory_calculation_dict.has_key("second_level"):
+              setter_list.extend([x['setter'] for x in inventory_calculation_dict['second_level']])
+            value_list = list(first_level_key) + list(second_level_key)
+            for x in xrange(len(setter_list)):
+              value = value_list[x]
+              setter = setter_list[x]
+              base_category = ""
+              if isinstance(setter, (tuple, list)):
+                base_category = setter[1]
+                setter = setter[0]
+              method = getattr(self, setter, None)
+              if method is not None:
+                method(category_list, value, base_category)
+
+            kwd['category_list'] = category_list
+            temp_delivery_line.edit(**kwd)
+            stock_append(temp_delivery_line)
 
     # Reindex objects
     object_list = [self]
     self.portal_catalog.catalogObjectList(object_list,
                                           sql_catalog_id = sql_catalog_id,
                                           disable_archive=disable_archive)
-    if len(stock_object_list)==0:
-      # Make sure to remove all lines
-      from Products.ERP5Type.Document import newTempBase
-      stock_append(temp_constructor(self, inventory_id, uid=inventory_uid))
+
     self.portal_catalog.catalogObjectList(
            stock_object_list, method_id_list=('z_catalog_stock_list', ),
            sql_catalog_id = sql_catalog_id,
            disable_cache=1, check_uid=0, disable_archive=disable_archive)
-




More information about the Erp5-report mailing list