From b78636ca31507ff7663f39cf4bf0b0e60c220d83 Mon Sep 17 00:00:00 2001
From: Nicolas Dumazet <nicolas.dumazet@nexedi.com>
Date: Wed, 29 Sep 2010 14:17:57 +0000
Subject: [PATCH] fill correctly document_class_registry and
 mixin_class_registry

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@38756 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Type/Utils.py | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/product/ERP5Type/Utils.py b/product/ERP5Type/Utils.py
index 3d4a25da4a..cdbad8416e 100644
--- a/product/ERP5Type/Utils.py
+++ b/product/ERP5Type/Utils.py
@@ -470,15 +470,21 @@ def updateGlobals(this_module, global_hook,
     for module_id in module_id_list:
       import_method(module_id, path=path, is_erp5_type=is_erp5_type)
 
+  from Products.ERP5Type import document_class_registry
+  module_name = this_module.__name__
   # Return core document_class list (for ERP5Type only)
   # this was introduced to permit overriding ERP5Type Document classes
   # which was not possible when they were define in the Document folder
   path, core_module_id_list = getModuleIdList(product_path, 'Core')
   for document in core_module_id_list:
+    module_path = '.'.join((module_name, 'Core', document, document))
+    document_class_registry[document] = module_path
     InitializeDocument(document, document_path=path)
   # Return document_class list
   path, module_id_list = getModuleIdList(product_path, 'Document')
   for document in module_id_list:
+    module_path = '.'.join((module_name, 'Document', document, document))
+    document_class_registry[document] = module_path
     InitializeDocument(document, document_path=path)
 
   # Return interactor_class list
@@ -895,6 +901,10 @@ def writeLocalDocument(class_id, text, create=1, instance_home=None):
   module = imp.load_source(class_id, path)
   getattr(module, class_id)
 
+  # and register correctly the new document
+  from Products.ERP5Type import document_class_registry
+  document_class_registry[class_id] = "%s.%s" % (module.__name__, class_id)
+
 def setDefaultClassProperties(property_holder):
   """Initialize default properties for ERP5Type Documents.
   """
@@ -1100,7 +1110,27 @@ def initializeProduct( context,
     This function does all the initialization steps required
     for a Zope / CMF Product
   """
-  product_name = this_module.__name__.split('.')[-1]
+  module_name = this_module.__name__
+
+  from Products.ERP5Type import document_class_registry
+  # Content classes are exceptions and should be registered here.
+  # other products were all already registered in updateGlobals()
+  # because getModuleIdList works fine for Document/ and Core/
+  for klass in content_classes:
+    n = klass.__name__
+    document_class_registry[n] = "%s.%s" % (klass.__module__, n)
+
+  mixin_module = getattr(this_module, 'mixin', None)
+  if mixin_module is not None:
+    from Products.ERP5Type import mixin_class_registry
+    for k, submodule in inspect.getmembers(mixin_module, inspect.ismodule):
+      for klassname, klass in inspect.getmembers(submodule, inspect.isclass):
+        # only classes defined here
+        if 'mixin' in klass.__module__ and not issubclass(klass, Exception):
+          classpath = '.'.join((module_name, 'mixin', k, klassname))
+          mixin_class_registry[klassname] = classpath
+
+  product_name = module_name.split('.')[-1]
 
   # Define content constructors for Document content classes (RAD)
   initializeDefaultConstructors(content_classes)
-- 
2.30.9