[Erp5-report] r42273 jm - in /erp5/trunk: bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/...

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Jan 12 17:24:41 CET 2011


Author: jm
Date: Wed Jan 12 17:24:41 2011
New Revision: 42273

URL: http://svn.erp5.org?rev=42273&view=rev
Log:
MappedValue: remove xxxProperty/edit methods to revert to pre-39918 behaviour

Note that type class of Transformation {Optional,Transformed Resource} Resource
is changed to a document inheriting Amount because they are chained to
conversion_interaction_workflow. Otherwise, _setProperty (that is not redefined
anymore) is would point to _doNothing.
The choice of TransformedResource class is questionable. Alternative would be
AmountFilter, or a new class.

This reapplies r41691

Modified:
    erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%20Operation%20Cell.xml
    erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%20Transformed%20Resource%20Cell.xml
    erp5/trunk/bt5/erp5_pdm/bt/revision
    erp5/trunk/products/ERP5/Document/MappedValue.py
    erp5/trunk/products/ERP5/Document/TradeModelCell.py
    erp5/trunk/products/ERP5/Document/TradeModelLine.py
    erp5/trunk/products/ERP5/Document/TransformedResource.py
    erp5/trunk/products/ERP5/tests/testTransformation.py
    erp5/trunk/products/ERP5Type/Base.py

Modified: erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%20Operation%20Cell.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%2520Operation%2520Cell.xml?rev=42273&r1=42272&r2=42273&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%20Operation%20Cell.xml [utf8] (original)
+++ erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%20Operation%20Cell.xml [utf8] Wed Jan 12 17:24:41 2011
@@ -23,10 +23,6 @@
             <value> <string>Transformation Operation Cell</string> </value>
         </item>
         <item>
-            <key> <string>factory</string> </key>
-            <value> <string>addMappedValue</string> </value>
-        </item>
-        <item>
             <key> <string>filter_content_types</string> </key>
             <value> <int>1</int> </value>
         </item>
@@ -58,6 +54,10 @@
             <key> <string>title</string> </key>
             <value> <string></string> </value>
         </item>
+        <item>
+            <key> <string>type_class</string> </key>
+            <value> <string>TransformedResource</string> </value>
+        </item>
       </dictionary>
     </pickle>
   </record>

Modified: erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%20Transformed%20Resource%20Cell.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%2520Transformed%2520Resource%2520Cell.xml?rev=42273&r1=42272&r2=42273&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%20Transformed%20Resource%20Cell.xml [utf8] (original)
+++ erp5/trunk/bt5/erp5_pdm/PortalTypeTemplateItem/portal_types/Transformation%20Transformed%20Resource%20Cell.xml [utf8] Wed Jan 12 17:24:41 2011
@@ -23,10 +23,6 @@
             <value> <string>Transformation Transformed Resource Cell</string> </value>
         </item>
         <item>
-            <key> <string>factory</string> </key>
-            <value> <string>addMappedValue</string> </value>
-        </item>
-        <item>
             <key> <string>filter_content_types</string> </key>
             <value> <int>1</int> </value>
         </item>
@@ -58,6 +54,10 @@
             <key> <string>title</string> </key>
             <value> <string></string> </value>
         </item>
+        <item>
+            <key> <string>type_class</string> </key>
+            <value> <string>TransformedResource</string> </value>
+        </item>
       </dictionary>
     </pickle>
   </record>

Modified: erp5/trunk/bt5/erp5_pdm/bt/revision
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_pdm/bt/revision?rev=42273&r1=42272&r2=42273&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_pdm/bt/revision [utf8] (original)
+++ erp5/trunk/bt5/erp5_pdm/bt/revision [utf8] Wed Jan 12 17:24:41 2011
@@ -1 +1 @@
-548
\ No newline at end of file
+549
\ No newline at end of file

Modified: erp5/trunk/products/ERP5/Document/MappedValue.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/MappedValue.py?rev=42273&r1=42272&r2=42273&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/MappedValue.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/MappedValue.py [utf8] Wed Jan 12 17:24:41 2011
@@ -39,10 +39,6 @@ _MARKER = []
 class MappedValue(Predicate):
   """
     A MappedValue allows to associate a value to a predicate
-
-  XXX Why do we redefine xxxProperty methods ?
-      When a property is defined by a property sheet with a specific storage_id,
-      they break accessors of this property when a value is mapped to it.
   """
   meta_type = 'ERP5 Mapped Value'
   portal_type = 'Mapped Value'
@@ -62,89 +58,19 @@ class MappedValue(Predicate):
   # Declarative interfaces
   zope.interface.implements(interfaces.IMappedValue,
                            )
-  security.declareProtected(Permissions.AccessContentsInformation, 'getMappedValueBaseCategoryList')
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getMappedValueBaseCategoryList')
   def getMappedValueBaseCategoryList(self, d=_MARKER):
     if TRANSFORMATION_FIX:
       # Fix Mapped Value Objects which forgot to define their Mapped Base Categories
       if not self._baseGetMappedValueBaseCategoryList():
         if self.getParentValue().getParentValue().getPortalType() == 'Transformation':
-          base_category_dict = {}
+          base_category_set = set()
           for category in self.getCategoryList():
             # XXX-JPS additional test required to prevent taking too much ?
-            base_category_dict[category.split('/')[0]] = None
-          self._setMappedValueBaseCategoryList(base_category_dict.keys())
+            base_category_set.add(category.split('/')[0])
+          self._setMappedValueBaseCategoryList(list(base_category_set))
     if d is _MARKER:
       return self._baseGetMappedValueBaseCategoryList(d=d)
     return self._baseGetMappedValueBaseCategoryList()
-
-  security.declareProtected( Permissions.AccessContentsInformation, 'getProperty' )
-  def getProperty(self, key, d=_MARKER, **kw):
-    """
-    Use local property instead of calling (acquired) accessor
-    whenever key is provided by the mapped value.
-
-    TODO:
-    - handle list properties (key ends with _list)
-    - add unit tests
-    """
-    if key in self.getMappedValuePropertyList():
-      result = getattr(aq_base(self), key, _MARKER)
-      if result is not _MARKER:
-        return result
-    if d is _MARKER:
-      return Predicate.getProperty(self, key, **kw) # XXX-JPS I would prefer to use always getProperty
-                                                    # Is there any reason to overload ?
-    return Predicate.getProperty(self, key, d=d, **kw)
-
-  def getPropertyList(self, key, d=None):
-    """
-    Use local property instead of calling (acquired) accessor
-    whenever key is provided by the mapped value.
-
-    TODO:
-    - add unit tests
-    """
-    if key in self.getMappedValuePropertyList():
-      result = getattr(aq_base(self), key, _MARKER)
-      if result is not _MARKER:
-        return result
-    if d is None:
-      return Predicate.getPropertyList(self, key)
-    return Predicate.getPropertyList(self, key, d=d)
-
-  def _setProperty(self, key, value, type=None, **kw):
-    """
-    Use local property instead of calling (acquired) accessor
-    whenever key is provided by the mapped value.
-
-    TODO:
-    - handle type
-    - add unit tests
-    """
-    if key in self.getMappedValuePropertyList():
-      return setattr(self, key, value)
-    return Predicate._setProperty(self, key, value, type=type, **kw)
-
-  # Check is this method should also be overriden
-  #def _setPropValue(self, key, value, **kw):
-
-  def hasProperty(self, key):
-    """
-    Use local property instead of calling (acquired) accessor
-    whenever key is provided by the mapped value.
-    """
-    if key in self.getMappedValuePropertyList():
-      return getattr(self, key, _MARKER) is not _MARKER
-    return Predicate.hasProperty(self, key)
-
-  def _edit(self, **kw):
-    # We must first prepare the mapped value before we do the edit
-    edit_order = ['mapped_value_property_list',
-                  'default_mapped_value_property',
-                  'mapped_value_property',
-                  'mapped_value_property_set']
-    i = len(edit_order)
-    edit_order += [x for x in kw.pop('edit_order', ()) if x not in edit_order]
-    # Base._edit updates unordered properties first
-    edit_order[i:i] = [x for x in kw if x not in edit_order]
-    return Predicate._edit(self, edit_order=edit_order, **kw)

Modified: erp5/trunk/products/ERP5/Document/TradeModelCell.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/TradeModelCell.py?rev=42273&r1=42272&r2=42273&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/TradeModelCell.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/TradeModelCell.py [utf8] Wed Jan 12 17:24:41 2011
@@ -68,10 +68,9 @@ class TradeModelCell(TradeModelLine):
       """
       return 0
 
-    security.declareProtected(Permissions.AccessContentsInformation,
-                              'getPrice')
-    def getPrice(self):
-      return self._baseGetPrice()
+    def getQuantity(self):
+      """Overridden getter to return None instead 0 if undefined"""
+      return self._baseGetQuantity(None)
 
     security.declareProtected(Permissions.AccessContentsInformation,
                               'getTotalPrice')

Modified: erp5/trunk/products/ERP5/Document/TradeModelLine.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/TradeModelLine.py?rev=42273&r1=42272&r2=42273&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/TradeModelLine.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/TradeModelLine.py [utf8] Wed Jan 12 17:24:41 2011
@@ -67,11 +67,3 @@ class TradeModelLine(AmountGeneratorLine
 
   def getMappedValueBaseCategoryList(self):
     return self._baseGetMappedValueBaseCategoryList() or ('trade_phase', 'use',)
-
-  #
-  security.declareProtected(Permissions.AccessContentsInformation,
-                            'getPrice')
-  def getPrice(self):
-    """
-    """
-    return self._baseGetPrice()

Modified: erp5/trunk/products/ERP5/Document/TransformedResource.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/TransformedResource.py?rev=42273&r1=42272&r2=42273&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/TransformedResource.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/TransformedResource.py [utf8] Wed Jan 12 17:24:41 2011
@@ -65,15 +65,20 @@ class TransformedResource(AmountGenerato
     def getMappedValuePropertyList(self):
       result = self._baseGetMappedValuePropertyList()
       if not result:
+        # Since MappedValue does not inherit Amount, and type class of
+        # Transformation {Operation,Transformed Resource} Cell
+        # was changed to TransformedResource as a workaround,
+        # we also need to check if 'self' has a quantity.
+        # Otherwise, generated amounts could have 0 quantity
+        # (overridden by cells that only define variation).
         result = ['quantity']
         # Take into account variation_property_list for each variation
         # for which hasProperty is true...
         # FIXME: Why the resource and not the model line itself ? Or both ??
         resource = self.getDefaultResourceValue()
         if resource is not None:
-          # XXX Using getattr directly is a hack. See MappedValue.__doc__
-          result.extend(key for key in resource.getVariationPropertyList()
-                            if getattr(self, key, self) is not self)
+          result += resource.getVariationPropertyList()
+        result = filter(self.hasProperty, result)
       return result
 
     def getMappedValueBaseCategoryList(self):

Modified: erp5/trunk/products/ERP5/tests/testTransformation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testTransformation.py?rev=42273&r1=42272&r2=42273&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testTransformation.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testTransformation.py [utf8] Wed Jan 12 17:24:41 2011
@@ -132,29 +132,33 @@ class TestTransformation(TestTransformat
     have additionnals propertysheets on transformations lines and that used
     variation properties
     """
-    # Only for testing purpose, use a property sheet that has nothing to
-    # do with component. It would have been possible to create a new
-    # property sheet for this test.
+    ps_id = self._testMethodName
+    property_sheet = self.portal.portal_property_sheets.newContent(
+      ps_id, portal_type='Property Sheet')
+    property_sheet.newContent(portal_type='Standard Property',
+                              reference='foo',
+                              storage_id='bar',
+                              elementary_type='boolean')
     # When one do that, the property sheet should be added to many other types
     # like movements, order lines and so on.
-    self._addPropertySheet('Amount', 'Bug')
-    self._addPropertySheet(self.transformed_resource_portal_type, 'Bug')
-    # XXX 'tested' works here because 'storage_id' does not differ
-    #     (see also MappedValue.__doc__)
-    variation_property_list = ['tested']
+    self._addPropertySheet('Amount', ps_id)
+    self._addPropertySheet(self.transformed_resource_portal_type, ps_id)
 
     transformation = self.createTransformation()
     transformed_resource = self.createTransformedResource(transformation)
-    component = self.createComponent(
-        variation_property_list=variation_property_list)
+    component = self.createComponent(variation_property_list=['foo'])
     transformed_resource.edit(
         resource_value=component,
         quantity=1)
-    transformed_resource.setTested(True)
+    transformed_resource.setFoo(True)
     aggregated_amount, = transformation.getAggregatedAmountList()
-    # Make sure that the isTested method is working properly on the
-    # temp object
-    self.assertTrue(aggregated_amount.isTested())
+    # Make sure that the isFoo method is working properly on the temp object
+    self.assertTrue(aggregated_amount.isFoo())
+
+    # XXX aborting a transaction should reset classes
+    #     if they were reset during the transaction
+    transaction.abort()
+    self.getTypesTool().resetDynamicDocuments()
 
   def test_variationCategory(self):
     swimcap = self.createResource(

Modified: erp5/trunk/products/ERP5Type/Base.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Base.py?rev=42273&r1=42272&r2=42273&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Base.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Base.py [utf8] Wed Jan 12 17:24:41 2011
@@ -697,6 +697,8 @@ def initializePortalTypeDynamicWorkflowM
               method_id_list = filter(method_id_matcher.match, method_id_list)
             else:
               # Single method
+              # XXX What if the method does not exist ?
+              #     It's not consistent with regexp based filters.
               method_id_list = [imethod_id]
             for method_id in method_id_list:
               if getattr(klass, method_id, _MARKER) is not _MARKER:



More information about the Erp5-report mailing list