summaryrefslogtreecommitdiff
path: root/odoo/modules/module.py
diff options
context:
space:
mode:
Diffstat (limited to 'odoo/modules/module.py')
-rw-r--r--odoo/modules/module.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/odoo/modules/module.py b/odoo/modules/module.py
index 959019d56e8..f545a720109 100644
--- a/odoo/modules/module.py
+++ b/odoo/modules/module.py
@@ -8,10 +8,13 @@ import inspect
import itertools
import logging
import os
+import pkg_resources
+import re
import sys
import time
import unittest
import threading
+import warnings
from os.path import join as opj
import odoo
@@ -24,9 +27,76 @@ README = ['README.rst', 'README.md', 'README.txt']
_logger = logging.getLogger(__name__)
+# addons path as a list
+# ad_paths is a deprecated alias, please use odoo.addons.__path__
+@tools.lazy
+def ad_paths():
+ warnings.warn(
+ '"odoo.modules.module.ad_paths" is a deprecated proxy to '
+ '"odoo.addons.__path__".', DeprecationWarning, stacklevel=2)
+ return odoo.addons.__path__
+
# Modules already loaded
loaded = []
+class AddonsHook(object):
+ """ Makes modules accessible through openerp.addons.* """
+
+ def find_module(self, name, path=None):
+ if name.startswith('openerp.addons.') and name.count('.') == 2:
+ warnings.warn(
+ '"openerp.addons" is a deprecated alias to "odoo.addons".',
+ DeprecationWarning, stacklevel=2)
+ return self
+
+ def load_module(self, name):
+ assert name not in sys.modules
+
+ odoo_name = re.sub(r'^openerp.addons.(\w+)$', r'odoo.addons.\g<1>', name)
+
+ odoo_module = sys.modules.get(odoo_name)
+ if not odoo_module:
+ odoo_module = importlib.import_module(odoo_name)
+
+ sys.modules[name] = odoo_module
+
+ return odoo_module
+
+# need to register loader with setuptools as Jinja relies on it when using
+# PackageLoader
+pkg_resources.register_loader_type(AddonsHook, pkg_resources.DefaultProvider)
+
+class OdooHook(object):
+ """ Makes odoo package also available as openerp """
+
+ def find_module(self, name, path=None):
+ # openerp.addons.<identifier> should already be matched by AddonsHook,
+ # only framework and subdirectories of modules should match
+ if re.match(r'^openerp\b', name):
+ warnings.warn(
+ 'openerp is a deprecated alias to odoo.',
+ DeprecationWarning, stacklevel=2)
+ return self
+
+ def load_module(self, name):
+ assert name not in sys.modules
+
+ canonical = re.sub(r'^openerp(.*)', r'odoo\g<1>', name)
+
+ if canonical in sys.modules:
+ mod = sys.modules[canonical]
+ else:
+ # probable failure: canonical execution calling old naming -> corecursion
+ mod = importlib.import_module(canonical)
+
+ # just set the original module at the new location. Don't proxy,
+ # it breaks *-import (unless you can find how `from a import *` lists
+ # what's supposed to be imported by `*`, and manage to override it)
+ sys.modules[name] = mod
+
+ return sys.modules[name]
+
+
def initialize_sys_path():
"""
Setup the addons path ``odoo.addons.__path__`` with various defaults
@@ -67,6 +137,12 @@ def initialize_sys_path():
sys.modules["odoo.addons.base.maintenance"] = maintenance_pkg
sys.modules["odoo.addons.base.maintenance.migrations"] = upgrade
+ # hook deprecated module alias from openerp to odoo and "crm"-like to odoo.addons
+ if getattr(initialize_sys_path, 'called', False): # only initialize once
+ sys.meta_path.insert(0, OdooHook())
+ sys.meta_path.insert(0, AddonsHook())
+
+
def get_module_path(module, downloaded=False, display_warning=True):
"""Return the path of the given module.