From 2dc2d7ee551fc1f9f20b0b2dfc72d69dcb18d4cf Mon Sep 17 00:00:00 2001 From: Romain Courteaud <romain@nexedi.com> Date: Thu, 24 Nov 2005 12:57:15 +0000 Subject: [PATCH] Modify getPrice in order to be compatible with options. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@4399 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5/Document/Resource.py | 103 +++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 31 deletions(-) diff --git a/product/ERP5/Document/Resource.py b/product/ERP5/Document/Resource.py index 1c0b053008..1f8c517ab6 100755 --- a/product/ERP5/Document/Resource.py +++ b/product/ERP5/Document/Resource.py @@ -482,7 +482,8 @@ class Resource(XMLMatrix, CoreResource, Variated): # pass # Predicate handling - security.declareProtected(Permissions.AccessContentsInformation, 'asPredicate') + security.declareProtected(Permissions.AccessContentsInformation, + 'asPredicate') def asPredicate(self): """ Returns a temporary Predicate based on the Resource properties @@ -494,10 +495,10 @@ class Resource(XMLMatrix, CoreResource, Variated): return p security.declareProtected(Permissions.AccessContentsInformation, - 'getPrice') - def getPrice(self, context=None, REQUEST=None, **kw): + '_getPriceParameterDict') + def _getPriceParameterDict(self, context=None, REQUEST=None, **kw): """ - Return the unit price of a resource in a specific context. + Get all pricing parameters from Predicate. """ # Search all categories context new_category_list = [] @@ -509,36 +510,76 @@ class Resource(XMLMatrix, CoreResource, Variated): resource_category = 'resource/' + self.getRelativeUrl() if not resource_category in new_category_list: new_category_list += (resource_category, ) - # Generate the fake context - tmp_context = self.asContext(context=context, - categories=new_category_list, - REQUEST=REQUEST, **kw) + # Generate a mapped value without option, and one for each option + # Separate option from new_category_list + option_base_category_list = self.getPortalOptionBaseCategoryList() + option_category_list = [] + no_option_category_list = [] + for new_category in new_category_list: + is_option = 0 + for option_base_category in option_base_category_list: + if new_category.startswith(option_base_category): + is_option = 1 + break + if is_option: + option_category_list.append(new_category) + else: + no_option_category_list.append(new_category) # Generate the predicate mapped value # to get some price values. + mapped_value_list = [] domain_tool = getToolByName(self,'portal_domains') portal_type_list = self.getPortalSupplyTypeList() - mapped_value = domain_tool.generateMappedValue( - tmp_context, - portal_type=portal_type_list, - has_cell_content=0, **kw) - # Calculate the unit price - unit_base_price = None -# (base_price + SUM(addtional_price)) * -# (1 + SUM(surcharge_ratio)) * -# (1 - MIN(1, MAX(SUM(discount_ratio) , exclusive_discount_ratio )))) + + category_list_list = [no_option_category_list] + \ + [no_option_category_list+[x] for x in option_category_list] + for category_list in category_list_list: + # Generate the fake context + tmp_context = self.asContext(context=context, + categories=category_list, + REQUEST=REQUEST, **kw) + mapped_value = domain_tool.generateMappedValue( + tmp_context, + portal_type=portal_type_list, + has_cell_content=0, **kw) + if mapped_value is not None: + mapped_value_list.append(mapped_value) # Get price parameters price_parameter_dict = { 'base_price': None, - 'additional_price': None, - 'surcharge_ratio': None, - 'discount_ratio': None, + 'additional_price': [], + 'surcharge_ratio': [], + 'discount_ratio': [], 'exclusive_discount_ratio': None, } - if mapped_value is not None: + for mapped_value in mapped_value_list: for price_parameter_name in price_parameter_dict.keys(): - price_parameter_dict[price_parameter_name] = \ + price_parameter_value = \ mapped_value.getProperty(price_parameter_name) + if price_parameter_value not in [None, '']: + try: + price_parameter_dict[price_parameter_name].append( + price_parameter_value) + except AttributeError: + if price_parameter_dict[price_parameter_name] is None: + price_parameter_dict[price_parameter_name] = \ + price_parameter_value + return price_parameter_dict + + security.declareProtected(Permissions.AccessContentsInformation, + 'getPrice') + def getPrice(self, context=None, REQUEST=None, **kw): + """ + Return the unit price of a resource in a specific context. + """ + price_parameter_dict = self._getPriceParameterDict( + context=context, REQUEST=REQUEST, **kw) + # Calculate the unit price + unit_base_price = None # Calculate +# (base_price + SUM(addtional_price)) * +# (1 + SUM(surcharge_ratio)) * +# (1 - MIN(1, MAX(SUM(discount_ratio) , exclusive_discount_ratio )))) base_price = price_parameter_dict['base_price'] if base_price in [None, '']: # XXX Compatibility @@ -547,21 +588,21 @@ class Resource(XMLMatrix, CoreResource, Variated): if base_price not in [None, '']: unit_base_price = base_price # Sum additional price - additional_price = price_parameter_dict['additional_price'] - if additional_price not in [None, '']: + for additional_price in price_parameter_dict['additional_price']: unit_base_price += additional_price # Surcharge ratio - surcharge_ratio = price_parameter_dict['surcharge_ratio'] - if surcharge_ratio not in [None, '']: - unit_base_price = unit_base_price * \ - (1 + surcharge_ratio) + sum_surcharge_ratio = 1 + for surcharge_ratio in price_parameter_dict['surcharge_ratio']: + sum_surcharge_ratio += surcharge_ratio + unit_base_price = unit_base_price * sum_surcharge_ratio # Discount - discount_ratio = price_parameter_dict['discount_ratio'] + sum_discount_ratio = 0 + for discount_ratio in price_parameter_dict['discount_ratio']: + sum_discount_ratio += discount_ratio exclusive_discount_ratio = \ price_parameter_dict['exclusive_discount_ratio'] d_ratio = 0 - if discount_ratio not in [None, '']: - d_ratio = max(d_ratio, discount_ratio) + d_ratio = max(d_ratio, sum_discount_ratio) if exclusive_discount_ratio not in [None, '']: d_ratio = max(d_ratio, exclusive_discount_ratio) if d_ratio != 0: -- 2.30.9