From c5bb52059ce8fe1174b5248c51d22f1b1482d08a Mon Sep 17 00:00:00 2001
From: Jean-Paul Smets <jp@nexedi.com>
Date: Sun, 31 Dec 2006 16:07:22 +0000
Subject: [PATCH] Fixed dynamic preference generation system.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@11814 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Form/PreferenceTool.py | 35 +++++++++++++++++++-----------
 product/ERP5Type/Base.py           | 14 +++++++-----
 product/ERP5Type/ERP5Type.py       |  2 +-
 3 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/product/ERP5Form/PreferenceTool.py b/product/ERP5Form/PreferenceTool.py
index 092848100f..ba2ba7afc3 100644
--- a/product/ERP5Form/PreferenceTool.py
+++ b/product/ERP5Form/PreferenceTool.py
@@ -38,14 +38,29 @@ from Products.ERP5Type.Cache import CachingMethod
 from Products.ERP5Type.Base import Base
 from Products.ERP5Type.Utils import convertToUpperCase
 from Products.ERP5Type.Accessor.TypeDefinition import list_types
-from Products.ERP5Form.Document.Preference import Preference
 from Products.ERP5Form import _dtmldir
 from Products.ERP5Form.Document.Preference import Priority
 
 
 class func_code: pass
 
-def createPreferenceMethods(portal) :
+def updatePreferenceClassPropertySheetList():
+  # 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
+  # 'Static' property sheets defined on the class
+  class_property_sheet_list = Preference.property_sheets
+  # Time to lookup for preferences defined on other modules
+  property_sheets = list(class_property_sheet_list)
+  for id in dir(PropertySheet):
+    if id.endswith('Preference'):
+      ps = getattr(PropertySheet, id)
+      if ps not in property_sheets:
+        property_sheets.append(ps)
+  class_property_sheet_list = tuple(property_sheets)
+  Preference.property_sheets = class_property_sheet_list
+
+def createPreferenceToolAccessorList(portal) :
   """
     Initialize all Preference methods on the preference tool.
     This method must be called on startup.
@@ -58,7 +73,7 @@ def createPreferenceMethods(portal) :
   typestool = getToolByName(portal, 'portal_types')
   pref_portal_type = typestool.getTypeInfo('Preference')
   if pref_portal_type is None:
-    LOG('createPreferenceMethods', PROBLEM,
+    LOG('createPreferenceToolAccessor', PROBLEM,
            'Preference type information is not installed.')
   # 'Dynamic' property sheets added through ZMI
   zmi_property_sheet_list = []
@@ -67,19 +82,13 @@ def createPreferenceMethods(portal) :
       zmi_property_sheet_list.append(
                   getattr(__import__(property_sheet), property_sheet))
     except ImportError, e :
-      LOG('createPreferenceMethods', PROBLEM,
+      LOG('createPreferenceToolAccessor', PROBLEM,
            'unable to import Property Sheet %s' % property_sheet, e)
   # '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
-  # Time to lookup for preferences defined on other modules
-  property_sheets = list(class_property_sheet_list)
-  for id in dir(PropertySheet):
-    if id.endswith('Preference'):
-      ps = getattr(PropertySheet, id)
-      if ps not in property_sheets:
-        property_sheets.append(ps)
-  class_property_sheet_list = tuple(property_sheets)
-  Preference.property_sheets = class_property_sheet_list
   # We can now merge
   for property_sheet in ( tuple(zmi_property_sheet_list) +
                                 class_property_sheet_list ) :
diff --git a/product/ERP5Type/Base.py b/product/ERP5Type/Base.py
index 6d3fee8da3..d3591c5f19 100644
--- a/product/ERP5Type/Base.py
+++ b/product/ERP5Type/Base.py
@@ -466,6 +466,10 @@ class Base( CopyContainer,
 
     # Generate portal_type methods
     if not Base.aq_portal_type.has_key(ptype):
+      if ptype == 'Preference':
+        # XXX-JPS this should be moved to Preference class
+        from Products.ERP5Form.PreferenceTool import updatePreferenceClassPropertySheetList
+        updatePreferenceClassPropertySheetList()
       initializePortalTypeDynamicProperties(self, klass, ptype)
       generated = 1
 
@@ -502,13 +506,13 @@ class Base( CopyContainer,
       Base.aq_related_generated = 1
 
     # Generate preference methods (since side effect is to reset Preference accessors)
+    # XXX-JPS - This should be moved to PreferenceTool
     if not Base.aq_preference_generated:
       try :
-        from Products.ERP5Form.PreferenceTool import createPreferenceMethods
-        from Products.ERP5Form.Document.Preference import Preference
-        createPreferenceMethods(self.getPortalObject())
-        # Force update of Preference accessors
-        initializePortalTypeDynamicProperties(self, Preference, Preference.portal_type)
+        from Products.ERP5Form.PreferenceTool import createPreferenceToolAccessorList
+        from Products.ERP5Form.PreferenceTool import updatePreferenceClassPropertySheetList
+        updatePreferenceClassPropertySheetList()
+        createPreferenceToolAccessorList(self.getPortalObject())
       except ImportError, e :
         LOG('Base._aq_dynamic', WARNING,
             'unable to create methods for PreferenceTool', e)
diff --git a/product/ERP5Type/ERP5Type.py b/product/ERP5Type/ERP5Type.py
index 1e3b0b6618..b3cdd6368f 100644
--- a/product/ERP5Type/ERP5Type.py
+++ b/product/ERP5Type/ERP5Type.py
@@ -149,7 +149,7 @@ class ERP5TypeInformation( FactoryTypeInformation,
       'delivery_movement', 'discount', 'invoice', 'invoice_movement', 'item',
       'order', 'order_movement', 'node', 'payment_node', 'payment_condition',
       'resource', 'supply', 'supply_path', 'transformation', 'variation',
-      'sub_variation', 'web_document', 'event', 'ticket', 'dms_document',
+      'sub_variation', 'event', 'ticket', 'document', 'web_document',
       'divergence_tester'
     )
     group_list = ()
-- 
2.30.9