diff --git a/odoo/models.py b/odoo/models.py index 75e07d42357..d7705b1f898 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -4827,6 +4827,10 @@ Fields: """ stuff to do right after the registry is built """ pass + def _unregister_hook(self): + """ Clean up what `~._register_hook` has done. """ + pass + @classmethod def _patch_method(cls, name, method): """ Monkey-patch a method for all instances of this model. This replaces diff --git a/odoo/modules/loading.py b/odoo/modules/loading.py index 0b57aa83ab7..1f2c4df751d 100644 --- a/odoo/modules/loading.py +++ b/odoo/modules/loading.py @@ -567,6 +567,10 @@ def load_modules(db, force_demo=False, status=None, update_module=False): _logger.error('At least one test failed when loading the modules.') # STEP 8: call _register_hook on every model + # This is done *exactly once* when the registry is being loaded. See the + # management of those hooks in `Registry.setup_models`: all the calls to + # setup_models() done here do not mess up with hooks, as registry.ready + # is False. env = api.Environment(cr, SUPERUSER_ID, {}) for model in env.values(): model._register_hook() diff --git a/odoo/modules/registry.py b/odoo/modules/registry.py index 8ccb1615113..febae952129 100644 --- a/odoo/modules/registry.py +++ b/odoo/modules/registry.py @@ -236,10 +236,17 @@ class Registry(Mapping): """ Complete the setup of models. This must be called after loading modules and before using the ORM. """ + env = odoo.api.Environment(cr, SUPERUSER_ID, {}) + + # Uninstall registry hooks. Because of the condition, this only happens + # on a fully loaded registry, and not on a registry being loaded. + if self.ready: + for model in env.values(): + model._unregister_hook() + self.clear_caches() lazy_property.reset_all(self) self.registry_invalidated = True - env = odoo.api.Environment(cr, SUPERUSER_ID, {}) if env.all.tocompute: _logger.error( @@ -267,7 +274,12 @@ class Registry(Mapping): for model in models: model._setup_complete() - self.registry_invalidated = True + # Reinstall registry hooks. Because of the condition, this only happens + # on a fully loaded registry, and not on a registry being loaded. + if self.ready: + for model in env.values(): + model._register_hook() + env['base'].flush() @lazy_property def field_computed(self):