From c12e8712bcca367d7ea1efce244085bdcc8d20b5 Mon Sep 17 00:00:00 2001 From: Alvaro Fuentes Date: Mon, 6 Oct 2025 11:56:33 +0200 Subject: [PATCH] [FIX] util/modules: trigger autodiscovery outside major upgrade Outside a major upgrade `base` is already fully loaded. New modules are yet not known for the ORM. We thus need to trigger the discovery. During a major upgrade we also want to block force installing modules outside `base` pre/post. Co-Authored-By: maji@odoo.com Co-Authored-By: chs@odoo.com --- src/base/0.0.0/post-01-modules-auto-discovery.py | 1 + src/util/modules.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/base/0.0.0/post-01-modules-auto-discovery.py b/src/base/0.0.0/post-01-modules-auto-discovery.py index 7b5e56f1e..8607d4ad8 100644 --- a/src/base/0.0.0/post-01-modules-auto-discovery.py +++ b/src/base/0.0.0/post-01-modules-auto-discovery.py @@ -6,3 +6,4 @@ def migrate(cr, version): if util.version_gte("saas~14.5"): _trigger_auto_discovery(cr) + util.ENVIRON["AUTO_DISCOVERY_UPGRADE"] = True diff --git a/src/util/modules.py b/src/util/modules.py index b7b5ebeab..5ad964134 100644 --- a/src/util/modules.py +++ b/src/util/modules.py @@ -55,6 +55,8 @@ INSTALLED_MODULE_STATES = ("installed", "to install", "to upgrade") _logger = logging.getLogger(__name__) +ENVIRON.setdefault("AUTO_DISCOVERY_RAN", False) + if version_gte("15.0"): AUTO_INSTALL = os.getenv("UPG_AUTOINSTALL") _NO_AUTOINSTALL = os.getenv("UPG_NO_AUTOINSTALL") @@ -553,6 +555,14 @@ def force_install_module(cr, module, if_installed=None, reason="it has been expl if if_installed: _assert_modules_exists(cr, *if_installed) if not if_installed or modules_installed(cr, *if_installed): + cr.execute("SELECT 1 FROM ir_module_module WHERE name = 'base' AND state != 'to upgrade'") + if cr.rowcount: + if not ENVIRON.get("AUTO_DISCOVERY_RAN"): + # run the autodiscovery once to allow to force install _new_ modules + _trigger_auto_discovery(cr) + elif ENVIRON.get("AUTO_DISCOVERY_UPGRADE"): + raise MigrationError("`force_install_module` can only be called from pre/post of `base`") + return _force_install_module(cr, module, reason="{} (done outside of a major upgrade)".format(reason)) ENVIRON["__modules_auto_discovery_force_installs"].add(module) return None else: @@ -995,6 +1005,8 @@ def _trigger_auto_discovery(cr): # Called by `base/0.0.0/post-modules-auto-discovery.py` script. # Use accumulated values for the auto_install and force_upgrade modules. + ENVIRON["AUTO_DISCOVERY_RAN"] = True + force_installs = ENVIRON["__modules_auto_discovery_force_installs"] cr.execute(