Commit 9e52de0c authored by Nicolas Dumazet's avatar Nicolas Dumazet

Take care of classes from different products sharing the same name.

For now, assume that any ERP5* class has priority over non-ERP5* classes.
And if conflicts can't be resolved simply, raise a loud error to force action.

(This happens, for instance, with Category Tool that is initialized twice:
once in CMFCategory, and a second time in ERP5 product)


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@42394 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 967f7652
...@@ -1051,6 +1051,39 @@ def initializeLocalInteractorRegistry(): ...@@ -1051,6 +1051,39 @@ def initializeLocalInteractorRegistry():
# Product initialization # Product initialization
##################################################### #####################################################
def registerDocumentClass(module_name, class_name):
"""
register a class in document_class_registry without overwriting
existing records
"""
old_value = document_class_registry.get(class_name)
new_value = "%s.%s" % (module_name, class_name)
if old_value is not None:
old_was_erp5 = old_value.startswith('Products.ERP5')
new_is_erp5 = module_name.startswith('Products.ERP5')
conflict = True
if not old_was_erp5:
if new_is_erp5:
# overwrite the non-erp5 class with the erp5 class
# likely to happen with e.g. CMF Category Tool and ERP5 Category Tool
LOG('Utils', INFO, 'Replacing non-ERP5 class %s by ERP5 class %s' %
(old_value, new_value))
conflict = False
elif not new_is_erp5:
# argh, trying to overwrite an existing erp5 class.
LOG('Utils', INFO,
'Ignoring replacement of ERP5 class %s by non-ERP5 class %s' %
(old_value, new_value))
return
if conflict:
raise TypeError("Class %s and %s from different products have the "
"same name" % (old_value, new_value))
document_class_registry[class_name] = new_value
def initializeProduct( context, def initializeProduct( context,
this_module, this_module,
global_hook, global_hook,
...@@ -1070,8 +1103,7 @@ def initializeProduct( context, ...@@ -1070,8 +1103,7 @@ def initializeProduct( context,
# other products were all already registered in updateGlobals() # other products were all already registered in updateGlobals()
# because getModuleIdList works fine for Document/ and Core/ # because getModuleIdList works fine for Document/ and Core/
for klass in content_classes: for klass in content_classes:
n = klass.__name__ registerDocumentClass(klass.__module__, klass.__name__)
document_class_registry[n] = "%s.%s" % (klass.__module__, n)
mixin_module = getattr(this_module, 'mixin', None) mixin_module = getattr(this_module, 'mixin', None)
if mixin_module is not None: if mixin_module is not None:
...@@ -1115,8 +1147,7 @@ def initializeProduct( context, ...@@ -1115,8 +1147,7 @@ def initializeProduct( context,
tools = portal_tools tools = portal_tools
if len(tools) > 0: if len(tools) > 0:
for tool in tools: for tool in tools:
n = tool.__name__ registerDocumentClass(tool.__module__, tool.__name__)
document_class_registry[n] = "%s.%s" % (tool.__module__, n)
try: try:
utils.ToolInit('%s Tool' % product_name, utils.ToolInit('%s Tool' % product_name,
tools=tools, tools=tools,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment