diff --git a/openerp-server b/openerp-server index d402f356038..4ff97ddc009 100755 --- a/openerp-server +++ b/openerp-server @@ -241,11 +241,7 @@ if __name__ == "__main__": 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': diff --git a/openerp/modules/__init__.py b/openerp/modules/__init__.py index 171d8418269..f28c397bb23 100644 --- a/openerp/modules/__init__.py +++ b/openerp/modules/__init__.py @@ -36,7 +36,7 @@ from openerp.modules.module import \ 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 diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 5092eaf4b2d..b3f831f9709 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -58,7 +58,7 @@ from openerp.modules.module import \ 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 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= _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'): diff --git a/openerp/modules/module.py b/openerp/modules/module.py index 58a4547ff07..6238aadaed0 100644 --- a/openerp/modules/module.py +++ b/openerp/modules/module.py @@ -389,40 +389,43 @@ def init_module_models(cr, module_name, obj_list): 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 diff --git a/openerp/wsgi.py b/openerp/wsgi.py index 25b7a560ea7..32fb59f8d91 100644 --- a/openerp/wsgi.py +++ b/openerp/wsgi.py @@ -464,11 +464,7 @@ def on_starting(server): 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':