[Erp5-report] r30159 - in /erp5/trunk/products: CMFCategory/tests/ ERP5/tests/ ERP5Form/ ER...

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Oct 30 16:03:18 CET 2009


Author: jm
Date: Fri Oct 30 16:03:17 2009
New Revision: 30159

URL: http://svn.erp5.org?rev=30159&view=rev
Log:
Allow portal types to customize dynamically initialization of property holders

* Replace direct access to some ERP5TypeInformation attributes by use of
  accessors:
  - base_category_list -> getTypeBaseCategoryList
  - property_sheet_list -> getTypePropertySheetList
* Split Base.initializePortalTypeDynamicProperties to delegate some work to
  portal types (new 'updatePropertySheetDefinitionDict' method).

Modified:
    erp5/trunk/products/CMFCategory/tests/testCMFCategory.py
    erp5/trunk/products/ERP5/tests/testERP5Category.py
    erp5/trunk/products/ERP5/tests/testERP5Core.py
    erp5/trunk/products/ERP5/tests/testInteractionWorkflow.py
    erp5/trunk/products/ERP5/tests/testInventoryAPI.py
    erp5/trunk/products/ERP5/tests/testResourceVariation.py
    erp5/trunk/products/ERP5/tests/testWorklist.py
    erp5/trunk/products/ERP5Form/PreferenceTool.py
    erp5/trunk/products/ERP5Type/Base.py
    erp5/trunk/products/ERP5Type/ERP5Type.py
    erp5/trunk/products/ERP5Type/TranslationProviderBase.py
    erp5/trunk/products/ERP5Type/tests/ERP5TypeTestCase.py
    erp5/trunk/products/ERP5Type/tests/testERP5Type.py

Modified: erp5/trunk/products/CMFCategory/tests/testCMFCategory.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFCategory/tests/testCMFCategory.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/CMFCategory/tests/testCMFCategory.py [utf8] (original)
+++ erp5/trunk/products/CMFCategory/tests/testCMFCategory.py [utf8] Fri Oct 30 16:03:17 2009
@@ -98,8 +98,9 @@
     organisation_ti = self.getTypesTool().getTypeInfo('Organisation')
     organisation_ti.filter_content_types = 0
     # we also enable 'destination' category on organisations
-    self._organisation_categories = cat = organisation_ti.base_category_list
-    organisation_ti.base_category_list = tuple(list(cat) + ['destination'])
+    self._organisation_categories = organisation_ti.getTypeBaseCategoryList()
+    organisation_ti._setTypeBaseCategoryList(self._organisation_categories
+                                             + ['destination'])
 
     # Make persons.
     person_module = self.getPersonModule()

Modified: erp5/trunk/products/ERP5/tests/testERP5Category.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testERP5Category.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testERP5Category.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testERP5Category.py [utf8] Fri Oct 30 16:03:17 2009
@@ -89,7 +89,7 @@
 
     # associate base categories on Organisation portal type
     portal_type = self.getTypeTool()[self.portal_type]
-    portal_type.base_category_list = [self.base_cat, self.base_cat2]
+    portal_type._setTypeBaseCategoryList([self.base_cat, self.base_cat2])
 
     # Reset aq dynamic
     _aq_reset()
@@ -322,8 +322,8 @@
     
     # associate the base category with our portal types
     ttool = self.getTypesTool()
-    ttool['Organisation'].base_category_list = ['test_aq_category']
-    ttool['Telephone'].base_category_list = ['test_aq_category']
+    ttool['Organisation']._setTypeBaseCategoryList(['test_aq_category'])
+    ttool['Telephone']._setTypeBaseCategoryList(['test_aq_category'])
 
     doc = self.organisation
     subdoc = doc['1']

Modified: erp5/trunk/products/ERP5/tests/testERP5Core.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testERP5Core.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testERP5Core.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testERP5Core.py [utf8] Fri Oct 30 16:03:17 2009
@@ -145,9 +145,9 @@
         self.portal.unittest_module.getShortTitleTranslationDomain())
 
     type_information = self.portal.portal_types[module_portal_type]
-    self.assertTrue('business_application' in type_information.base_category_list)
-    
-  
+    self.assertTrue('business_application'
+                    in type_information.getTypeBaseCategoryList())
+
   def test_02_FavouritesMenu(self, quiet=quiet, run=run_all_test):
     """
       Test that Manage members is not an entry in the My Favourites menu.

Modified: erp5/trunk/products/ERP5/tests/testInteractionWorkflow.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testInteractionWorkflow.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testInteractionWorkflow.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testInteractionWorkflow.py [utf8] Fri Oct 30 16:03:17 2009
@@ -75,7 +75,7 @@
     Organisation = Products.ERP5Type.Document.Organisation.Organisation
     Organisation.doSomethingStupid = doSomethingStupid
     portal_type = self.getTypeTool()['Organisation']
-    portal_type.base_category_list = ['size']
+    portal_type._setTypeBaseCategoryList(['size'])
     organisation_module = self.getOrganisationModule()
     self.organisation = organisation_module.newContent(
                           portal_type = self.portal_type)

Modified: erp5/trunk/products/ERP5/tests/testInventoryAPI.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testInventoryAPI.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testInventoryAPI.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testInventoryAPI.py [utf8] Fri Oct 30 16:03:17 2009
@@ -2161,16 +2161,7 @@
     does not allow such things
     """
     portal = self.getPortal()
-
-    portal_type_name = 'Inventory'
-    property_sheet_name = 'InventoryConstraint'
-    # We set the property sheet on the portal type
-    ti = self.getTypesTool().getTypeInfo(portal_type_name)
-    ti.property_sheet_list = list(ti.property_sheet_list) +\
-                                [property_sheet_name]
-    # reset aq_dynamic cache
-    _aq_reset()
-
+    self._addPropertySheet('Inventory', 'InventoryConstraint')
     try:
       inventory_module = portal.getDefaultModule(portal_type='Inventory')
       inventory = inventory_module.newContent(portal_type='Inventory')
@@ -2222,17 +2213,16 @@
       self.assertTrue(len([x for x in workflow_error_message \
           if x.find('There is already an inventory')]))
     finally:
-      # remove all property sheet we added to type informations
+      # remove all property sheets we added to type informations
       ttool = self.getTypesTool()
-      ti = ttool.getTypeInfo(portal_type_name)
-      ps_list = ti.property_sheet_list
-      psheet_list = [property_sheet_name]
-      for psheet in psheet_list:
-        if psheet in ps_list:
-          ps_list.remove(psheet)
-      ti.property_sheet_list = ps_list
+      for ti_name, psheet_list in self._added_property_sheets.iteritems():
+        ti = ttool.getTypeInfo(ti_name)
+        property_sheet_set = set(ti.getTypePropertySheetList())
+        property_sheet_set.difference_update(psheet_list)
+        ti._setTypePropertySheetList(list(property_sheet_set))
       transaction.commit()
       _aq_reset()
+
   def test_15_InventoryAfterModificationInFuture(self):
     """
     Test inventory after adding a new movement in future 

Modified: erp5/trunk/products/ERP5/tests/testResourceVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testResourceVariation.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testResourceVariation.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testResourceVariation.py [utf8] Fri Oct 30 16:03:17 2009
@@ -197,19 +197,18 @@
 
     #adding to base categories of resources
     #for use setRequiredSizeList and setOptionColourList methods
-    self.portal.portal_types['Product'].base_category_list = [
+    self.portal.portal_types['Product']._setTypeBaseCategoryList([
                                             'required_size',
                                             'option_colour',
-                                            'individual_aspect']
-    self.portal.portal_types['Service'].base_category_list = [
+                                            'individual_aspect'])
+    self.portal.portal_types['Service']._setTypeBaseCategoryList([
                                             'required_size',
                                             'option_colour',
-                                            'individual_aspect']
-    self.portal.portal_types['Component'].base_category_list = [
+                                            'individual_aspect'])
+    self.portal.portal_types['Component']._setTypeBaseCategoryList([
                                             'required_size',
                                             'option_colour',
-                                            'individual_aspect']
-                                            
+                                            'individual_aspect'])
     transaction.commit()
     self.tic()
 

Modified: erp5/trunk/products/ERP5/tests/testWorklist.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testWorklist.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testWorklist.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testWorklist.py [utf8] Fri Oct 30 16:03:17 2009
@@ -150,12 +150,7 @@
     return int(action_name[left_parenthesis_offset + 1:-1])
 
   def associatePropertySheet(self):
-    from Products.ERP5Type.Base import _aq_reset
-    ti = self.getTypesTool().getTypeInfo(self.checked_portal_type)
-    ti.property_sheet_list = list(ti.property_sheet_list) + \
-                                ['SortIndex']
-    # reset aq_dynamic cache
-    _aq_reset()
+    self._addPropertySheet(self.checked_portal_type, 'SortIndex')
 
   def addWorkflowCataloguedVariable(self, workflow_id, variable_id):
     variables = self.getWorkflowTool()[workflow_id].variables

Modified: erp5/trunk/products/ERP5Form/PreferenceTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/PreferenceTool.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/PreferenceTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Form/PreferenceTool.py [utf8] Fri Oct 30 16:03:17 2009
@@ -68,37 +68,28 @@
     property sheets by looking at all registered property sheets
     and considering those which name ends with 'Preference'
   """
-  attr_list = []
-  typestool = getToolByName(portal, 'portal_types')
-  pref_portal_type = typestool.getTypeInfo('Preference')
-
-  # 'Dynamic' property sheets added through ZMI
-  zmi_property_sheet_list = []
+  property_list = []
+
+  # 'Dynamic' property sheets added by portal_type
+  pref_portal_type = portal.portal_types.getTypeInfo('Preference')
   if pref_portal_type is None:
     LOG('ERP5Form.PreferenceTool', PROBLEM,
-           'Preference type information is not installed.')
+        'Preference type information is not installed.')
   else:
-    for property_sheet in pref_portal_type.property_sheet_list :
-      try:
-        zmi_property_sheet_list.append(
-                    getattr(__import__(property_sheet), property_sheet))
-      except ImportError, e :
-        LOG('ERP5Form.PreferenceTool', PROBLEM,
-             'unable to import Property Sheet %s' % property_sheet, e)
+    pref_portal_type.updatePropertySheetDefinitionDict(
+      {'_properties': property_list})
 
   # 'Static' property sheets defined on the class
   # The Preference class should be imported from the common location
   # in ERP5Type since it could be overloaded in another product
   from Products.ERP5Type.Document.Preference import Preference
-  class_property_sheet_list = Preference.property_sheets
-  # We can now merge
-  for property_sheet in ( tuple(zmi_property_sheet_list) +
-                                class_property_sheet_list ) :
-    # then generate common method names
-    for prop in property_sheet._properties :
-      if not prop.get('preference', 0) :
-        # only properties marked as preference are used
-        continue
+  for property_sheet in Preference.property_sheets:
+    property_list += property_sheet._properties
+
+  # Generate common method names
+  for prop in property_list:
+    if prop.get('preference'):
+      # only properties marked as preference are used
       attribute = prop['id']
       attr_list = [ 'get%s' % convertToUpperCase(attribute)]
       if prop['type'] in list_types :

Modified: erp5/trunk/products/ERP5Type/Base.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Base.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Base.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Base.py [utf8] Fri Oct 30 16:03:17 2009
@@ -549,41 +549,29 @@
       initializePortalTypeDynamicProperties(parent_object, parent_klass,
                                             parent_type, 
                                             parent_object._aq_key(), portal)
-    # Initiatise portal_type properties (XXX)
-    ptype_object = getattr(aq_base(portal.portal_types), ptype, None)
+
     prop_list = list(getattr(klass, '_properties', []))
     cat_list = list(getattr(klass, '_categories', []))
     constraint_list = list(getattr(klass, '_constraints', []))
+    ps_definition_dict = {'_properties': prop_list,
+                          '_categories': cat_list,
+                          '_constraints': constraint_list}
+
+    # Initialize portal_type properties (XXX)
+    # Always do it before processing klass.property_sheets (for compatibility).
+    # Because of the order we generate accessors, it is still possible
+    # to overload data access for some accessors.
+    ptype_object = portal.portal_types._getOb(ptype, None)
     if ptype_object is not None:
-      # Make sure this is an ERP5Type object
-      ps_list = [getattr(PropertySheet, p, None) for p in
-          ptype_object.property_sheet_list]
-      ps_list = [p for p in ps_list if p is not None]
-      # Always append the klass.property_sheets to this list (for compatibility)
-      # Because of the order we generate accessors, it is still possible
-      # to overload data access for some accessors
-      ps_list = tuple(ps_list) + getClassPropertyList(klass)
-      #LOG('ps_list',0, str(ps_list))
-    else:
-      ps_list = getClassPropertyList(klass)
-    for base in ps_list:
-      property_sheet_definition_dict = {
-        '_properties': prop_list,
-        '_categories': cat_list,
-        '_constraints': constraint_list
-      }
-      for ps_property_name, current_list in \
-                                    property_sheet_definition_dict.items():
-        if hasattr(base, ps_property_name):
-          ps_property = getattr(base, ps_property_name)
-          if isinstance(ps_property, (tuple, list)):
-            current_list += ps_property
-          else :
-            raise ValueError, "%s is not a list for %s" % (ps_property_name,
-                                                           base)
-
-    if ptype_object is not None:
-      cat_list += ptype_object.base_category_list
+      ptype_object.updatePropertySheetDefinitionDict(ps_definition_dict)
+
+    for base in getClassPropertyList(klass):
+      for list_name, current_list in ps_definition_dict.items():
+        try:
+          current_list += getattr(base, list_name, ())
+        except TypeError:
+          raise ValueError("%s is not a list for %s" % (list_name, base))
+
     prop_holder._portal_type = ptype
     prop_holder._properties = prop_list
     prop_holder._categories = cat_list

Modified: erp5/trunk/products/ERP5Type/ERP5Type.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/ERP5Type.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/ERP5Type.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/ERP5Type.py [utf8] Fri Oct 30 16:03:17 2009
@@ -420,6 +420,33 @@
 
         return ob
 
+    security.declarePrivate('updatePropertySheetDefinitionDict')
+    def updatePropertySheetDefinitionDict(self, definition_dict):
+      for property_sheet_name in self.getTypePropertySheetList():
+        base = getattr(PropertySheet, property_sheet_name, None)
+        if base is not None:
+          for list_name, property_list in definition_dict.items():
+            try:
+              property_list += getattr(base, list_name, ())
+            except TypeError:
+              raise ValueError("%s is not a list for %s" % (list_name, base))
+      if '_categories' in definition_dict:
+        definition_dict['_categories'] += self.getTypeBaseCategoryList()
+
+    # The following 2 methods are needed before there are generated.
+
+    security.declareProtected(Permissions.AccessContentsInformation,
+                              'getTypePropertySheetList')
+    def getTypePropertySheetList(self):
+      """Getter for 'type_property_sheet' property"""
+      return list(self.property_sheet_list)
+
+    security.declareProtected(Permissions.AccessContentsInformation,
+                              'getTypeBaseCategoryList')
+    def getTypeBaseCategoryList(self):
+      """Getter for 'type_base_category' property"""
+      return list(self.base_category_list)
+
     security.declareProtected(Permissions.AccessContentsInformation,
                               'getInstanceBaseCategoryList')
     def getInstanceBaseCategoryList(self):
@@ -534,8 +561,8 @@
                             self.getTypeFactoryMethodId(),
                             self.getTypeAddPermission(),
                             self.getTypeInitScriptId()]
-      search_source_list += self.getTypePropertySheetList(())
-      search_source_list += self.getTypeBaseCategoryList(())
+      search_source_list += self.getTypePropertySheetList()
+      search_source_list += self.getTypeBaseCategoryList()
       return ' '.join(filter(None, search_source_list))
 
     security.declarePrivate('getDefaultViewFor')

Modified: erp5/trunk/products/ERP5Type/TranslationProviderBase.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/TranslationProviderBase.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/TranslationProviderBase.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/TranslationProviderBase.py [utf8] Fri Oct 30 16:03:17 2009
@@ -57,40 +57,24 @@
     Create the initial list of association between property and domain name
     """
     property_domain_dict = {}
-    ptype_object = self
-    # get the klass of the object based on the constructor document
+
+    # get the property sheet list for the portal type
+    ps_list = [getattr(PropertySheet, p, None)
+                for p in self.getTypePropertySheetList()]
     m = Products.ERP5Type._m
-    ptype_name = ''.join(ptype_object.id.split(' '))
-    constructor = self.factory # This is safer than: 'add%s' %(ptype_name)
-    klass = None
-    for method, doc in m.items():
-      if method == constructor:
-        klass = doc.klass
-        break
-    # get the property sheet list for the portal type
-    # from the list of property sheet defined on the portal type
-    ps_list = map(lambda p: getattr(PropertySheet, p, None),
-                  ptype_object.property_sheet_list)
-    ps_list = filter(lambda p: p is not None, ps_list)
-    # from the property sheets defined on the class
-    if klass is not None:
-      from Products.ERP5Type.Base import getClassPropertyList
-      ps_list = tuple(ps_list) + getClassPropertyList(klass)
-    # get all properties from the property sheet list
-    current_list = []
+    if m.has_key(self.factory):
+      klass = m[self.factory].klass
+      if klass is not None:
+        from Products.ERP5Type.Base import getClassPropertyList
+        ps_list += getClassPropertyList(klass)
+    # create TranslationInformation object for each property
     for base in ps_list:
-      if hasattr(base, '_properties'):
-        # XXX must check that property is translatable
-        ps_property = getattr(base, '_properties')
-        if type(ps_property) in (type(()), type([])):
-          current_list += ps_property
-    # create TranslationInformation object for each property
-    for prop in current_list:
-      if prop.get('translatable', 0):
+      for prop in getattr(base, '_properties', ()):
         prop_id = prop['id']
-        if not property_domain_dict.has_key(prop_id):
-          domain_name = prop.get('translation_domain', None)
-          property_domain_dict[prop_id] = TranslationInformation(prop_id, domain_name)
+        if prop.get('translatable') and prop_id not in property_domain_dict:
+          domain_name = prop.get('translation_domain')
+          property_domain_dict[prop_id] = TranslationInformation(prop_id,
+                                                                 domain_name)
 
     original_property_domain_dict = getattr(aq_base(self),
                                             '_property_domain_dict', _MARKER)

Modified: erp5/trunk/products/ERP5Type/tests/ERP5TypeTestCase.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/ERP5TypeTestCase.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/ERP5TypeTestCase.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/ERP5TypeTestCase.py [utf8] Fri Oct 30 16:03:17 2009
@@ -422,6 +422,9 @@
       global current_app
       current_app = self.app
       self._updateConnectionStrings()
+      # keep a mapping type info name -> property sheet list, to remove them in
+      # tear down.
+      self._added_property_sheets = {}
 
     def afterSetUp(self):
       '''Called after setUp() has completed. This is
@@ -563,16 +566,15 @@
         class_tool.editPropertySheet(property_sheet_name, property_sheet_code)
         transaction.commit()
         class_tool.importPropertySheet(property_sheet_name)
-      
+
       # We set the property sheet on the portal type
       ti = self.getTypesTool().getTypeInfo(portal_type_name)
-      if property_sheet_name not in ti.property_sheet_list:
-        ti.property_sheet_list = list(ti.property_sheet_list) +\
-                                    [property_sheet_name]
+      property_sheet_set = set(ti.getTypePropertySheetList())
+      property_sheet_set.add(property_sheet_name)
+      ti._setTypePropertySheetList(list(property_sheet_set))
 
       # remember that we added a property sheet for tear down
-      if getattr(self, '_added_property_sheets', None) is not None:
-        self._added_property_sheets.setdefault(
+      self._added_property_sheets.setdefault(
                     portal_type_name, []).append(property_sheet_name)
       # reset aq_dynamic cache
       _aq_reset()

Modified: erp5/trunk/products/ERP5Type/tests/testERP5Type.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testERP5Type.py?rev=30159&r1=30158&r2=30159&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testERP5Type.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/testERP5Type.py [utf8] Fri Oct 30 16:03:17 2009
@@ -63,9 +63,6 @@
     """Set up the fixture. """
     ERP5TypeTestCase.setUp(self)
     installRealClassTool(self.getPortal())
-    # keep a mapping type info name -> property sheet list, to remove them in
-    # tear down.
-    self._added_property_sheets = {}
 
   def tearDown(self):
     """Clean up """
@@ -75,14 +72,14 @@
     # remove all property sheet we added to type informations
     for ti_name, psheet_list in self._added_property_sheets.items():
       ti = ttool.getTypeInfo(ti_name)
-      ps_list = ti.property_sheet_list
+      property_sheet_set = set(ti.getTypePropertySheetList())
       for psheet in psheet_list:
-        if psheet in ps_list:
-          ps_list.remove(psheet)
+        if psheet in property_sheet_set:
+          property_sheet_set.remove(psheet)
           # physically remove property sheet, otherwise invalid property sheet
           # could break next tests.
           removeLocalPropertySheet(psheet)
-      ti.property_sheet_list = ps_list
+      ti._setTypePropertySheetList(list(property_sheet_set))
     transaction.commit()
     _aq_reset()
     ERP5TypeTestCase.tearDown(self)
@@ -1232,10 +1229,9 @@
       self._addProperty('Person', self.DEFAULT_ORGANISATION_TITLE_ACQUIRED_PROP)
       # add destination base category to Person TI
       person_ti = self.getTypesTool().getTypeInfo('Person')
-      if 'destination' not in person_ti.base_category_list:
-        person_ti.base_category_list = tuple(list(
-                self.getTypesTool().getTypeInfo('Person').base_category_list) +
-                ['destination', ])
+      base_category_list = person_ti.getTypeBaseCategoryList()
+      if 'destination' not in base_category_list:
+        person_ti._setTypeBaseCategoryList(base_category_list + ['destination'])
         _aq_reset()
 
       person = self.getPersonModule().newContent(id='1', portal_type='Person')
@@ -1265,11 +1261,11 @@
       self._addProperty('Person', self.DEFAULT_ORGANISATION_TITLE_ACQUIRED_PROP)
       # add destination base category to Person TI
       person_ti = self.getTypesTool().getTypeInfo('Person')
-      if 'destination' not in person_ti.base_category_list:
-          person_ti.base_category_list = tuple(list(
-                self.getTypesTool().getTypeInfo('Person').base_category_list) +
-                ['destination', ])
-      
+      base_category_list = person_ti.getTypeBaseCategoryList()
+      if 'destination' not in base_category_list:
+        person_ti._setTypeBaseCategoryList(base_category_list + ['destination'])
+        _aq_reset()
+
       person = self.getPersonModule().newContent(id='1', portal_type='Person')
       another_person = self.getPersonModule().newContent(
                                         id='default_organisation',
@@ -2179,7 +2175,7 @@
       ti = self.getTypesTool()['Person']
       self.assertFalse(hasattr(doc, 'getDestination'))
       ti.edit(type_base_category_list=
-        ti.getTypeBaseCategoryList(()) + ['destination'])
+        ti.getTypeBaseCategoryList() + ['destination'])
       self.assertTrue(hasattr(doc, 'getDestination'))
 
     def test_aq_reset_on_workflow_chain_change(self):




More information about the Erp5-report mailing list