From 0ac1ffe2d6cec001086bba20e409bce438d00a7a Mon Sep 17 00:00:00 2001 From: Yusei Tahara <yusei@nexedi.com> Date: Thu, 4 Mar 2010 06:31:53 +0000 Subject: [PATCH] Add updateCellList, A matrixbox-like helper function. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@33362 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5Type/tests/utils.py | 95 +++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/product/ERP5Type/tests/utils.py b/product/ERP5Type/tests/utils.py index 8026daa706..5534aea601 100644 --- a/product/ERP5Type/tests/utils.py +++ b/product/ERP5Type/tests/utils.py @@ -351,3 +351,98 @@ def to_utf8(text): 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) -- 2.30.9