[Erp5-report] r33362 yusei - /erp5/trunk/products/ERP5Type/tests/utils.py

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Mar 4 07:31:53 CET 2010


Author: yusei
Date: Thu Mar  4 07:31:53 2010
New Revision: 33362

URL: http://svn.erp5.org?rev=33362&view=rev
Log:
Add updateCellList, A matrixbox-like helper function.

Modified:
    erp5/trunk/products/ERP5Type/tests/utils.py

Modified: erp5/trunk/products/ERP5Type/tests/utils.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/utils.py?rev=33362&r1=33361&r2=33362&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/utils.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/utils.py [utf8] Thu Mar  4 07:31:53 2010
@@ -351,3 +351,98 @@
   if isinstance(text, unicode):
     text = text.encode('utf-8')
   return text
+
+def updateCellList(portal, line, cell_type, cell_range_method, cell_dict_list):
+  """A matrixbox-like helper function to create cells at once.
+
+    dicts in cell_dict_list can have following keys:
+     - base_id
+     - cell_range_kw
+     - dimension
+     - mapped_value_argument_list
+     - table
+
+    Example:
+      updateCellList(sale_order_line_1_1,
+                     'Sale Order Cell',
+                     'DeliveryLine_asCellRange',
+                     ({'base_id':'movement',
+                       'mapped_value_argument_list':('quantity',),
+                       'dimension':1,
+                       'table':(('product_packing/package', 1),
+                                ('product_packing/case'   , 1),
+                               )
+                       },
+                      )
+                     )
+  """
+  def get_range_id_list(range_list):
+    if not range_list:
+      return []
+    if len(range_list[0])>1:
+      return [item[0] for item in range_list]
+    else:
+      return range_list
+
+  for cell_dict in cell_dict_list:
+    base_id = cell_dict['base_id']
+    if callable(cell_range_method):
+      cell_range_list = cell_range_method()
+    else:
+      cell_range_list = getattr(line, cell_range_method)(
+        matrixbox=True,
+        base_id=base_id,
+        **cell_dict.get('cell_range_kw', {}))
+    line.setCellRange(base_id=base_id,
+                      *[get_range_id_list(cell_range)
+                        for cell_range in cell_range_list]
+                      )
+
+    dimension = cell_dict['dimension']
+    mapped_value_argument_list = cell_dict['mapped_value_argument_list']
+    def getMappedValueDict(item):
+      if len(mapped_value_argument_list)==1:
+        return {mapped_value_argument_list[0]:item}
+      else:
+        result = {}
+        for index, argument_name in enumerate(mapped_value_argument_list):
+          result[argument_name] = item[index]
+        return result
+
+    table = cell_dict['table']
+    if dimension==1:
+      data_list = []
+      for table_line in table:
+        data_list.append(([table_line[0]], getMappedValueDict(table_line[1])))
+    elif dimension==2:
+      column = table[0]
+      data_list = []
+      for table_line in table[1:]:
+        row = table_line[0]
+        for index, item in enumerate(table_line[1:]):
+          data_list.append(([row, column[index]], getMappedValueDict(item)))
+    elif dimension==3:
+      raise NotImplementedError
+
+    for category_list, mapped_value_dict in data_list:
+      cell = line.newCell(portal_type=cell_type,
+                          base_id=base_id,
+                          *category_list)
+
+      cell.edit(**mapped_value_dict)
+      cell.setMappedValuePropertyList(mapped_value_dict.keys())
+
+      base_category_list = [category_path
+                            for category_path in category_list
+                            if (category_path.split('/')[0] in
+                                portal.portal_categories.objectIds())
+                            ]
+
+      cell.setMembershipCriterionBaseCategoryList(base_category_list)
+      membership_criterion_category_list = [
+        category_path
+        for category_path in category_list
+        if category_path.split('/')[0] in base_category_list]
+      cell.setMembershipCriterionCategoryList(membership_criterion_category_list)
+      cell.edit(predicate_category_list=category_list,
+                variation_category_list=category_list)




More information about the Erp5-report mailing list