Vo Minh Thu (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-server/trunk-server-wide-module-vmt into 
lp:openobject-server.

Requested reviews:
  OpenERP Core Team (openerp)
Related bugs:
  Bug #929466 in OpenERP Server: "[6.1RC1] in some cases the module loader may 
allow conflicts with system modules"
  https://bugs.launchpad.net/openobject-server/+bug/929466

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-server-wide-module-vmt/+merge/92293
-- 
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-server-wide-module-vmt/+merge/92293
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-server/trunk-server-wide-module-vmt.
=== modified file 'openerp-server'
--- openerp-server	2012-02-06 20:31:51 +0000
+++ openerp-server	2012-02-09 15:36:22 +0000
@@ -241,11 +241,7 @@
 
     for m in openerp.conf.server_wide_modules:
         try:
-            __import__('openerp.addons.' + m)
-            # Call any post_load hook.
-            info = openerp.modules.module.load_information_from_description_file(m)
-            if info['post_load']:
-                getattr(sys.modules[m], info['post_load'])()
+            openerp.modules.module.load_openerp_module(m)
         except Exception:
             msg = ''
             if m == 'web':

=== modified file 'openerp/modules/__init__.py'
--- openerp/modules/__init__.py	2011-05-11 17:48:41 +0000
+++ openerp/modules/__init__.py	2012-02-09 15:36:22 +0000
@@ -36,7 +36,7 @@
     load_information_from_description_file, \
     get_module_resource, zip_directory, \
     get_module_path, initialize_sys_path, \
-    register_module_classes, init_module_models
+    load_openerp_module, init_module_models
 
 from openerp.modules.loading import load_modules
 

=== modified file 'openerp/modules/loading.py'
--- openerp/modules/loading.py	2012-01-24 12:42:52 +0000
+++ openerp/modules/loading.py	2012-02-09 15:36:22 +0000
@@ -58,7 +58,7 @@
     load_information_from_description_file, \
     get_module_resource, zip_directory, \
     get_module_path, initialize_sys_path, \
-    register_module_classes, init_module_models
+    load_openerp_module, init_module_models
 
 _logger = logging.getLogger(__name__)
 
@@ -162,7 +162,8 @@
 
         _logger.info('module %s: loading objects', package.name)
         migrations.migrate_module(package, 'pre')
-        register_module_classes(package.name)
+        load_openerp_module(package.name)
+
         models = pool.load(cr, package)
         loaded_modules.append(package.name)
         if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'):

=== modified file 'openerp/modules/module.py'
--- openerp/modules/module.py	2012-02-08 10:59:13 +0000
+++ openerp/modules/module.py	2012-02-09 15:36:22 +0000
@@ -389,40 +389,43 @@
         t[1](cr, *t[2])
     cr.commit()
 
-def register_module_classes(m):
-    """ Register module named m, if not already registered.
+def load_openerp_module(module_name):
+    """ Load an OpenERP module, if not already loaded.
 
     This loads the module and register all of its models, thanks to either
     the MetaModel metaclass, or the explicit instantiation of the model.
-
+    This is also used to load server-wide module (i.e. it is also used
+    when there is no model to register).
     """
-
-    def log(e):
-        mt = isinstance(e, zipimport.ZipImportError) and 'zip ' or ''
-        msg = "Couldn't load %smodule %s" % (mt, m)
-        _logger.critical(msg)
-        _logger.critical(e)
-
     global loaded
-    if m in loaded:
+    if module_name in loaded:
         return
-    _logger.info('module %s: registering objects', m)
-    mod_path = get_module_path(m)
 
     initialize_sys_path()
     try:
+        mod_path = get_module_path(module_name)
         zip_mod_path = mod_path + '.zip'
         if not os.path.isfile(zip_mod_path):
-            __import__('openerp.addons.' + m)
+            __import__('openerp.addons.' + module_name)
         else:
             zimp = zipimport.zipimporter(zip_mod_path)
-            zimp.load_module(m)
+            zimp.load_module(module_name)
+
+        # Call the module's post-load hook. This can done before any model or
+        # data has been initialized. This is ok as the post-load hook is for
+        # server-wide (instead of registry-specific) functionalities.
+        info = load_information_from_description_file(module_name)
+        if info['post_load']:
+            getattr(sys.modules['openerp.addons.' + module_name], info['post_load'])()
+
     except Exception, e:
-        log(e)
+        mt = isinstance(e, zipimport.ZipImportError) and 'zip ' or ''
+        msg = "Couldn't load %smodule %s" % (mt, module_name)
+        _logger.critical(msg)
+        _logger.critical(e)
         raise
     else:
-        loaded.append(m)
-
+        loaded.append(module_name)
 
 def get_modules():
     """Returns the list of module names

=== modified file 'openerp/wsgi.py'
--- openerp/wsgi.py	2012-01-24 15:14:51 +0000
+++ openerp/wsgi.py	2012-02-09 15:36:22 +0000
@@ -464,11 +464,7 @@
     openerp.modules.loading.open_openerp_namespace()
     for m in openerp.conf.server_wide_modules:
         try:
-            __import__(m)
-            # Call any post_load hook.
-            info = openerp.modules.module.load_information_from_description_file(m)
-            if info['post_load']:
-                getattr(sys.modules[m], info['post_load'])()
+            openerp.modules.module.load_openerp_module(m)
         except Exception:
             msg = ''
             if m == 'web':

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to