diff --git a/product/ERP5/Document/TransformedResource.py b/product/ERP5/Document/TransformedResource.py index 252e4cd53bf683f6cd2d76e0d676adc8e32f8039..8fae4797175b79e45cf189d527f1bef9d391a1c6 100755 --- a/product/ERP5/Document/TransformedResource.py +++ b/product/ERP5/Document/TransformedResource.py @@ -40,10 +40,11 @@ from Products.ERP5.Document.Amount import Amount from Products.ERP5.Document.Transformation import AggregatedAmountList from Products.CMFCore.Expression import Expression +from Products.ERP5.Document.Predicate import Predicate from zLOG import LOG -class TransformedResource(XMLObject, XMLMatrix, Amount): +class TransformedResource(Predicate, XMLObject, XMLMatrix, Amount): """ TransformedResource defines which resource is being transformed @@ -81,27 +82,32 @@ class TransformedResource(XMLObject, XMLMatrix, Amount): ### Variation matrix definition # - security.declareProtected(Permissions.AccessContentsInformation, 'updateVariationCategoryList') + security.declareProtected(Permissions.AccessContentsInformation, + 'updateVariationCategoryList') def updateVariationCategoryList(self): """ - Check if variation category list of the resource changed and update transformed resource - by doing a set cell range + Check if variation category list of the resource changed and + update transformed resource by doing a set cell range """ - self.setQVariationBaseCategoryList( self.getQVariationBaseCategoryList() ) - self.setVVariationBaseCategoryList( self.getVVariationBaseCategoryList() ) + self.setQVariationBaseCategoryList(self.getQVariationBaseCategoryList()) + self.setVVariationBaseCategoryList(self.getVVariationBaseCategoryList()) - security.declareProtected(Permissions.ModifyPortalContent, '_updateQMatrixCellRange') + security.declareProtected(Permissions.ModifyPortalContent, + '_updateQMatrixCellRange') def _updateQMatrixCellRange(self): # XXX use base_id parameter instead cell_range = self.TransformedResource_asCellRange('quantity') -# XXX TransformedResource works only for a maximum of 3 variation base category... -# Matrixbox must be rewrite for a clean implementation of n base category + # XXX TransformedResource works only for a maximum of 3 variation + # base category... + # Matrixbox must be rewrite for a clean implementation of n base + # category if len(cell_range) <= 3: self.setCellRange(base_id='quantity', *cell_range) else: raise MoreThan3VariationBaseCategory - security.declareProtected(Permissions.ModifyPortalContent, '_setQVariationBaseCategoryList') + security.declareProtected(Permissions.ModifyPortalContent, + '_setQVariationBaseCategoryList') def _setQVariationBaseCategoryList(self, value): """ Defines the possible base categories which Quantity value (Q) @@ -111,7 +117,8 @@ class TransformedResource(XMLObject, XMLMatrix, Amount): # XXX calling updatecellRange is better self._updateQMatrixCellRange() - security.declareProtected(Permissions.ModifyPortalContent, 'setQVariationBaseCategoryList') + security.declareProtected(Permissions.ModifyPortalContent, + 'setQVariationBaseCategoryList') def setQVariationBaseCategoryList(self, value): """ Defines the possible base categories which Quantity value (Q) @@ -120,18 +127,22 @@ class TransformedResource(XMLObject, XMLMatrix, Amount): self._setQVariationBaseCategoryList(value) self.reindexObject() - security.declareProtected(Permissions.ModifyPortalContent, '_updateVMatrixCellRange') + security.declareProtected(Permissions.ModifyPortalContent, + '_updateVMatrixCellRange') def _updateVMatrixCellRange(self): # XXX use base_id parameter instead cell_range = self.TransformedResource_asCellRange('variation') -# XXX TransformedResource works only for a maximum of 3 variation base category... -# Matrixbox must be rewrite for a clean implementation of n base category + # XXX TransformedResource works only for a maximum of 3 variation + # base category... + # Matrixbox must be rewrite for a clean implementation of n base + # category if len(cell_range) <= 3: self.setCellRange(base_id='variation', *cell_range) else: raise MoreThan3VariationBaseCategory - security.declareProtected(Permissions.ModifyPortalContent, '_setVVariationBaseCategoryList') + security.declareProtected(Permissions.ModifyPortalContent, + '_setVVariationBaseCategoryList') def _setVVariationBaseCategoryList(self, value): """ Defines the possible base categories which Variation value (V) @@ -141,7 +152,8 @@ class TransformedResource(XMLObject, XMLMatrix, Amount): # XXX calling updatecellRange is better self._updateVMatrixCellRange() - security.declareProtected(Permissions.ModifyPortalContent, 'setVVariationBaseCategoryList') + security.declareProtected(Permissions.ModifyPortalContent, + 'setVVariationBaseCategoryList') def setVVariationBaseCategoryList(self, value): """ Defines the possible base categories which Variation value (V) @@ -151,7 +163,8 @@ class TransformedResource(XMLObject, XMLMatrix, Amount): self.reindexObject() - security.declareProtected(Permissions.AccessContentsInformation,'getVariationRangeCategoryItemList') + security.declareProtected(Permissions.AccessContentsInformation, + 'getVariationRangeCategoryItemList') def getVariationRangeCategoryItemList(self, base_category_list = (), omit_individual_variation=1, base=1, current_category=None, @@ -172,19 +185,18 @@ class TransformedResource(XMLObject, XMLMatrix, Amount): if resource != None: if base_category_list is (): base_category_list = resource.getVariationBaseCategoryList() - result = resource.getVariationCategoryItemList( - base_category_list=base_category_list, - omit_individual_variation=0, - base=base, - current_category=current_category, - display_base_category=display_base_category, - display_id=display_id, - **kw) - + base_category_list=base_category_list, + omit_individual_variation=0, + base=base, + current_category=current_category, + display_base_category=display_base_category, + display_id=display_id, + **kw) return result - security.declareProtected(Permissions.AccessContentsInformation,'getVariationRangeCategoryItemList') + security.declareProtected(Permissions.AccessContentsInformation, + 'getVariationRangeCategoryItemList') def getVariationRangeCategoryList(self, base_category_list=()): """ Returns possible variation category values for the @@ -195,7 +207,8 @@ class TransformedResource(XMLObject, XMLMatrix, Amount): base_category_list=base_category_list)) return result - security.declareProtected(Permissions.AccessContentsInformation, 'getAggregatedAmountList') + security.declareProtected(Permissions.AccessContentsInformation, + 'getAggregatedAmountList') def getAggregatedAmountList(self, context=None, REQUEST=None, **kw): """ Get all interesting amount value and return AggregatedAmountList @@ -203,170 +216,162 @@ class TransformedResource(XMLObject, XMLMatrix, Amount): context = self.asContext(context=context, REQUEST=REQUEST, **kw) # Create the result object aggregated_amount_list = AggregatedAmountList() - - # Create temporary object to store amount - from Products.ERP5Type.Document import newTempAmount - tmp_amount = newTempAmount(self.getPortalObject(), self.getId()) - - error_string = '' - - # add resource relation - resource = self.getDefaultResourceValue() - if resource != None: - tmp_amount.setResourceValue(resource) - else: - error_string += 'No resource defined on %s' % self.getRelativeUrl() - - # First, we set initial values for quantity and variation - # Currently, we only consider discrete variations - # Continuous variations will be implemented in a future version of ERP5 - - quantity_unit = self.getQuantityUnit() - if quantity_unit is not None: - tmp_amount.setQuantityUnitValue(quantity_unit) - - - efficiency = self.getEfficiency() - if efficiency is None or efficiency is '' or efficiency == 0.0: - efficiency = 1.0 - else: - efficiency = float(efficiency) - - ### current get quantity comportment exemple ### - # We define on transformation line: - # default_quantity = q - # quantity matrix - # | Child | Child/32 | Child/34 | Men | Women | - # | a | | b | c | | - # Result from getAggregatedAmountList: - # context | quantity - # _________________________ - # Child | a - # Child/32 | a => acquired from Child - # Child/34 | a or b => we do not know which cell will be choosed - # Child/36 | a => acquired from Child - # Men | c - # Women | Error => no cell found - # noContext | Error => cell exist, but no context given - - ### comportment that JPS want ?? ### - # We define on transformation line: - # default_quantity = q - # quantity matrix - # | Child | Child/32 | Child/34 | Men | Women | - # | a | | b | c | | - # Result from getAggregatedAmountList: - # context | quantity - # _________________________ - # Child | a - # Child/32 | a => acquired from Child - # Child/34 | a or b => we do not know which cell will be choosed - # Child/36 | Error => no such key in matrixbox cell range - # Men | c - # Women | Error => no cell found - # noContext | Error => cell exist, but no context given - - # futur cool get quantity comportment exemple - # We define on transformation line: - # default_quantity = q - # quantity matrix - # | Child | Child/32 | Child/34 | Men | Women | - # | a | | b | c | | - # Result from getAggregatedAmountList: - # context | quantity - # _________________________ - # Child | a - # Child/32 | a => acquired from Child - # Child/34 | b => test method must return a priority to choose between Child and Child/34 - # Child/36 | Error => no such key in matrixbox cell range - # Men | c - # Women | q => acquired from default quantity - # noContext | q => acquired from default quantity - - quantity_defined_by = None - - # get Quantity - quantity = None - - # We will browse the mapped values and determine which apply - cell_key_list = self.getCellKeyList( base_id = 'quantity') - if cell_key_list not in [(),[]]: - - if context == None: - raise KeyError, "No context defined on TransformedResource '%s'" % ( self.getRelativeUrl() , ) - - for key in cell_key_list: - if self.hasCell(base_id='quantity', *key): - mapped_value = self.getCell(base_id='quantity', *key) - if mapped_value.test(context): - if 'quantity' in mapped_value.getMappedValuePropertyList(): - quantity = mapped_value.getProperty('quantity') - quantity_defined_by = mapped_value.getRelativeUrl() - + test_result = self.test(context) + if test_result: + # The line must match the context + # If no predicate is defined on line, the result of the test + # must be true + # Create temporary object to store amount + from Products.ERP5Type.Document import newTempAmount + tmp_amount = newTempAmount(self.getPortalObject(), self.getId()) + # Create error string + error_string = '' + # Add resource relation + resource = self.getDefaultResourceValue() + if resource != None: + tmp_amount.setResourceValue(resource) + else: + error_string += 'No resource defined on %s' % self.getRelativeUrl() + # First, we set initial values for quantity and variation + # Currently, we only consider discrete variations + # Continuous variations will be implemented in a future version + # of ERP5 + # Set quantity unit + quantity_unit = self.getQuantityUnit() + if quantity_unit is not None: + tmp_amount.setQuantityUnitValue(quantity_unit) + # Set efficiency + efficiency = self.getEfficiency() + if efficiency is None or efficiency is '' or efficiency == 0.0: + efficiency = 1.0 + else: + efficiency = float(efficiency) +### current get quantity comportment exemple ### +# We define on transformation line: +# default_quantity = q +# quantity matrix +# | Child | Child/32 | Child/34 | Men | Women | +# | a | | b | c | | +# Result from getAggregatedAmountList: +# context | quantity +# _________________________ +# Child | a +# Child/32 | a => acquired from Child +# Child/34 | a or b => we do not know which cell will be choosed +# Child/36 | a => acquired from Child +# Men | c +# Women | Error => no cell found +# noContext | Error => cell exist, but no context given + +### comportment that JPS want ?? ### +# We define on transformation line: +# default_quantity = q +# quantity matrix +# | Child | Child/32 | Child/34 | Men | Women | +# | a | | b | c | | +# Result from getAggregatedAmountList: +# context | quantity +# _________________________ +# Child | a +# Child/32 | a => acquired from Child +# Child/34 | a or b => we do not know which cell will be choosed +# Child/36 | Error => no such key in matrixbox cell range +# Men | c +# Women | Error => no cell found +# noContext | Error => cell exist, but no context given + +# futur cool get quantity comportment exemple +# We define on transformation line: +# default_quantity = q +# quantity matrix +# | Child | Child/32 | Child/34 | Men | Women | +# | a | | b | c | | +# Result from getAggregatedAmountList: +# context | quantity +# _________________________ +# Child | a +# Child/32 | a => acquired from Child +# Child/34 | b => test method must return a priority to choose between Child and Child/34 +# Child/36 | Error => no such key in matrixbox cell range +# Men | c +# Women | q => acquired from default quantity +# noContext | q => acquired from default quantity + + # get Quantity + quantity_defined_by = None + quantity = None + # We will browse the mapped values and determine which apply + cell_key_list = self.getCellKeyList(base_id='quantity') + if cell_key_list not in [(),[]]: + if context == None: + raise KeyError, \ + "No context defined on TransformedResource '%s'" % \ + (self.getRelativeUrl(), ) + for key in cell_key_list: + if self.hasCell(base_id='quantity', *key): + mapped_value = self.getCell(base_id='quantity', *key) + if mapped_value.test(context): + if 'quantity' in mapped_value.getMappedValuePropertyList(): + quantity = mapped_value.getProperty('quantity') + quantity_defined_by = mapped_value.getRelativeUrl() + if quantity in [None,'']: + raise KeyError, \ + "No cell quantity matching on TransformedResource '%s' for \ + current context" % ( self.getRelativeUrl() , ) + else: + quantity = self.getQuantity() + quantity_defined_by = self.getRelativeUrl() if quantity in [None,'']: - raise KeyError, "No cell quantity matching on TransformedResource '%s' for current context" % ( self.getRelativeUrl() , ) - - else: - quantity = self.getQuantity() - quantity_defined_by = self.getRelativeUrl() - - if quantity in [None,'']: - raise KeyError, "No quantity defined on TransformedResource '%s' for current context" % ( self.getRelativeUrl() , ) - - # If we have to do this, then there is a problem.... - # We'd better have better API for this, like an update function in the mapped_value - try: - quantity = float(quantity) - except ValueError: - error_string += 'Quantity is not a float.' - - - variation_category_list_defined_by = None - - variation_category_list = None - # We will browse the mapped values and determine which apply - cell_key_list = self.getCellKeyList( base_id = 'variation') - if cell_key_list not in [(),[]]: - - if context == None: - raise KeyError, "No context defined on TransformedResource '%s'" % ( self.getRelativeUrl() , ) - - for key in cell_key_list: - if self.hasCell(base_id='variation', *key): - mapped_value = self.getCell(base_id='variation', *key) - if mapped_value.test(context): - - vcl = mapped_value.getCategoryList() - if vcl != []: - variation_category_list = vcl - variation_category_list_defined_by = mapped_value.getRelativeUrl() - - if variation_category_list in [None,'',[], ()]: - if quantity == 0: - return aggregated_amount_list - else: - raise KeyError, "No cell variation matching on TransformedResource '%s' for current context" % ( self.getRelativeUrl() , ) - - else: - variation_category_list = self._getVariationCategoryList() - variation_category_list_defined_by = self.getRelativeUrl() - - - tmp_amount._edit( - # Properties define on transformation line - description = self.getDescription(), - efficiency = efficiency, - quantity = quantity, - - # This fields only store some informations for debugging if necessary - quantity_defined_by = quantity_defined_by, - variation_category_list_defined_by = variation_category_list_defined_by, - error_string = error_string - ) - - tmp_amount.setVariationCategoryList(variation_category_list) - - aggregated_amount_list.append( tmp_amount ) - + raise KeyError, \ + "No quantity defined on TransformedResource '%s' for \ + current context" % (self.getRelativeUrl(), ) + # If we have to do this, then there is a problem.... + # We'd better have better API for this, + # like an update function in the mapped_value + try: + quantity = float(quantity) + except ValueError: + error_string += 'Quantity is not a float.' + # Get the variation category list + variation_category_list_defined_by = None + variation_category_list = None + # We will browse the mapped values and determine which apply + cell_key_list = self.getCellKeyList( base_id = 'variation') + if cell_key_list not in [(),[]]: + if context == None: + raise KeyError, \ + "No context defined on TransformedResource '%s'" % \ + (self.getRelativeUrl(), ) + for key in cell_key_list: + if self.hasCell(base_id='variation', *key): + mapped_value = self.getCell(base_id='variation', *key) + if mapped_value.test(context): + vcl = mapped_value.getCategoryList() + if vcl != []: + variation_category_list = vcl + variation_category_list_defined_by = \ + mapped_value.getRelativeUrl() + if variation_category_list in [None,'',[], ()]: + if quantity == 0: + return aggregated_amount_list + else: + raise KeyError, \ + "No cell variation matching on TransformedResource '%s' \ + for current context" % (self.getRelativeUrl(), ) + else: + variation_category_list = self._getVariationCategoryList() + variation_category_list_defined_by = self.getRelativeUrl() + # Store values in Amount + tmp_amount._edit( + # Properties define on transformation line + description = self.getDescription(), + efficiency = efficiency, + quantity = quantity, + # This fields only store some informations for debugging if necessary + quantity_defined_by = quantity_defined_by, + variation_category_list_defined_by = variation_category_list_defined_by, + error_string = error_string + ) + tmp_amount.setVariationCategoryList(variation_category_list) + aggregated_amount_list.append( tmp_amount ) return aggregated_amount_list -