[Erp5-report] r9275 - in /erp5/trunk/products/ERP5: Document/Resource.py Tool/DomainTool.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon Aug 21 12:57:07 CEST 2006
Author: alex
Date: Mon Aug 21 12:57:01 2006
New Revision: 9275
URL: http://svn.erp5.org?rev=9275&view=rev
Log:
ERP5/Tool/DomainTool.py:
* added method generateMultivaluedMappedValue that returns a list of mapped
value properties, instead of one single value
ERP5/Document/Resource.py:
* optimized price calculation with options
Modified:
erp5/trunk/products/ERP5/Document/Resource.py
erp5/trunk/products/ERP5/Tool/DomainTool.py
Modified: erp5/trunk/products/ERP5/Document/Resource.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Resource.py?rev=9275&r1=9274&r2=9275&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Resource.py (original)
+++ erp5/trunk/products/ERP5/Document/Resource.py Mon Aug 21 12:57:01 2006
@@ -544,10 +544,13 @@
return p
def _pricingSortMethod(self, a, b):
- # Simple method : the one that matches the highest number
- # of criterions wins
- return cmp(len(b.getAcquiredCategoryList()),
- len(a.getAcquiredCategoryList()))
+ # Simple method : the one that defines a destination wins
+ parent = a.getParentValue()
+ if parent.getPortalType().endswith(' Line'):
+ parent = parent.getParentValue()
+ if parent.getDestination():
+ return -1 # a has a destination and wins
+ return 1 # a has no destination ans loses
security.declareProtected(Permissions.AccessContentsInformation,
'_getPriceParameterDict')
@@ -567,43 +570,22 @@
resource_category = 'resource/' + self.getRelativeUrl()
if not resource_category in new_category_list:
new_category_list += (resource_category, )
- # 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.getPortalSupplyPathTypeList()
- 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)
- tmp_kw = kw.copy()
- if 'sort_method' not in tmp_kw:
- tmp_kw['sort_method'] = self._pricingSortMethod
- mapped_value = domain_tool.generateMappedValue(
- tmp_context,
- portal_type=portal_type_list,
- has_cell_content=0, **tmp_kw)
- if mapped_value is not None:
- mapped_value_list.append(mapped_value)
+ # Generate the fake context
+ tmp_context = self.asContext(context=context,
+ categories=new_category_list,
+ REQUEST=REQUEST, **kw)
+ tmp_kw = kw.copy()
+ if 'sort_method' not in tmp_kw:
+ tmp_kw['sort_method'] = self._pricingSortMethod
+ mapped_value = domain_tool.generateMultivaluedMappedValue(
+ tmp_context,
+ portal_type=portal_type_list,
+ has_cell_content=0, **tmp_kw)
# Get price parameters
price_parameter_dict = {
'base_price': None,
@@ -614,18 +596,23 @@
'variable_additional_price': [],
'non_discountable_additional_price': [],
}
- for mapped_value in mapped_value_list:
- for price_parameter_name in price_parameter_dict.keys():
- 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:
+ if mapped_value is None:
+ return price_parameter_dict
+ for price_parameter_name in price_parameter_dict.keys():
+ price_parameter_value = \
+ mapped_value.getProperty(price_parameter_name)
+ if price_parameter_value not in [None, '']:
+ try:
+ price_parameter_dict[price_parameter_name].extend(
+ price_parameter_value)
+ except AttributeError:
+ if price_parameter_dict[price_parameter_name] is None:
+ if price_parameter_name == 'exclusive_discount_ratio':
price_parameter_dict[price_parameter_name] = \
- price_parameter_value
+ max(price_parameter_value)
+ else:
+ price_parameter_dict[price_parameter_name] = \
+ price_parameter_value[0]
return price_parameter_dict
security.declareProtected(Permissions.AccessContentsInformation,
Modified: erp5/trunk/products/ERP5/Tool/DomainTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Tool/DomainTool.py?rev=9275&r1=9274&r2=9275&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Tool/DomainTool.py (original)
+++ erp5/trunk/products/ERP5/Tool/DomainTool.py Mon Aug 21 12:57:01 2006
@@ -189,12 +189,12 @@
def generateMappedValue(self, context, test=1, predicate_list=None, **kw):
"""
We will generate a mapped value with the list of all predicates
- founds.
+ found.
Let's say we have 3 predicates (in the order we want) like this:
Predicate 1 [ base_price1, , , , , , ]
Predicate 2 [ base_price2, quantity2 , , , , , ]
Predicate 3 [ base_price3, quantity3 , , , , , ]
- Our MappedValue generated will have the base_price of the
+ Our generated MappedValue will have the base_price of the
predicate1, and the quantity of the Predicate2, because Predicate
1 is the first one which defines a base_price and the Predicate2
is the first one wich defines a quantity.
@@ -223,6 +223,55 @@
mapped_value = mapped_value.asContext(**mapped_value_property_dict)
return mapped_value
+ # XXX FIXME method should not be public
+ # (some users are not able to see resource's price)
+ security.declarePublic('generateMultivaluedMappedValue')
+ def generateMultivaluedMappedValue(self, context, test=1, predicate_list=None, **kw):
+ """
+ We will generate a mapped value with the list of all predicates
+ found.
+ Let's say we have 3 predicates (in the order we want) like this:
+ Predicate 1 [ base_price1, , , , , , ]
+ Predicate 2 [ base_price2, additional_price2 , , , , , ]
+ Predicate 3 [ base_price3, additional_price3 , , , , , ]
+ Our generated MappedValue will take all values for each property and put
+ them in lists, unless predicates define the same list of criterion categories
+ """
+ # First get the list of predicates
+ if predicate_list is None:
+ predicate_list = self.searchPredicateList(context, test=test, **kw)
+ if len(predicate_list)==0:
+ # No predicate, return None
+ mapped_value = None
+ else:
+ # Generate tempDeliveryCell
+ from Products.ERP5Type.Document import newTempSupplyCell
+ mapped_value = newTempSupplyCell(self.getPortalObject(),
+ 'new_mapped_value')
+ mapped_value_property_dict = {}
+ processed_dict = {}
+ # Look for each property the first predicate with unique criterion
+ # categories which defines the property
+ for predicate in predicate_list:
+ predicate_category_list = \
+ tuple(predicate.getMembershipCriterionCategoryList())
+
+ for mapped_value_property in predicate.getMappedValuePropertyList():
+ prop_list = processed_dict.setdefault(predicate_category_list, [])
+ if mapped_value_property in prop_list:
+ # we already have one value for this (categories, property)
+ continue
+ prop_list.append(mapped_value_property)
+
+ value = predicate.getProperty(mapped_value_property)
+ if value is not None:
+ mv_prop_list = \
+ mapped_value_property_dict.setdefault(
+ mapped_value_property, [])
+ mv_prop_list.append(value)
+ # Update mapped value
+ mapped_value = mapped_value.asContext(**mapped_value_property_dict)
+ return mapped_value
def getChildDomainValueList(self, parent, **kw):
More information about the Erp5-report
mailing list