Skip to content

Commit 98befcc

Browse files
committed
[FIX] util/modules: keep reason for force install
Since we delay force installs, it is not OK to keep only their names. We are losing the actual reason why they are installed. Compare, before: ``` 2025-12-05 10:49:53,136 169875 INFO test_16_17 odoo.modules.migration: module base: Running migration [0.0.0>] post-01-modules-auto-discovery 2025-12-05 10:49:55,873 169875 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'onboarding' (and its dependencies) because it's a new dependency of account, payment 2025-12-05 10:49:55,876 169875 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'base_import_module' (and its dependencies) because it has been explicitly asked for 2025-12-05 10:49:55,880 169875 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'iap_extract' (and its dependencies) because it has been explicitly asked for 2025-12-05 10:49:55,885 169875 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'account_invoice_extract' (and its dependencies) because it is an auto install module that got all its auto install dependencies installed by the force install of 'iap_extract' 2025-12-05 10:49:55,890 169875 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'account_payment_term' (and its dependencies) because it has been explicitly asked for ``` With after: ``` 2025-12-05 10:44:54,837 164125 INFO test_16_17 odoo.modules.migration: module base: Running migration [0.0.0>] post-01-modules-auto-discovery 2025-12-05 10:44:56,712 164125 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'onboarding' (and its dependencies) because it's a new dependency of account, payment 2025-12-05 10:44:56,714 164125 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'base_import_module' (and its dependencies) because it has been explicitly asked for 2025-12-05 10:44:56,717 164125 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'iap_extract' (and its dependencies) because it's an auto install module and all its dependencies are installed 2025-12-05 10:44:56,720 164125 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'account_invoice_extract' (and its dependencies) because it is an auto install module that got all its auto install dependencies installed by the force install of 'iap_extract' 2025-12-05 10:44:56,724 164125 INFO test_16_17 odoo.upgrade.util.modules: force install of module 'account_payment_term' (and its dependencies) because it's an auto install module and all its dependencies are installed ``` closes #365 Signed-off-by: Christophe Simonis (chs) <chs@odoo.com>
1 parent 9a1be7d commit 98befcc

File tree

2 files changed

+11
-10
lines changed

2 files changed

+11
-10
lines changed

src/util/const.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# migration environ, used to share data between scripts
1212
ENVIRON = {
1313
"__renamed_fields": collections.defaultdict(dict),
14-
"__modules_auto_discovery_force_installs": set(),
14+
"__modules_auto_discovery_force_installs": {},
1515
"__modules_auto_discovery_force_upgrades": {},
1616
"__fix_fk_allowed_cascade": [],
1717
"__no_model_data_delete": {},

src/util/modules.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ def remove_module(cr, module):
340340
[mod_id] = cr.fetchone()
341341
cr.execute("DELETE FROM ir_model_data WHERE model='ir.module.module' AND res_id=%s", [mod_id])
342342

343-
ENVIRON["__modules_auto_discovery_force_installs"].discard(module)
343+
ENVIRON["__modules_auto_discovery_force_installs"].pop(module, None)
344344
ENVIRON["__modules_auto_discovery_force_upgrades"].pop(module, None)
345345

346346

@@ -360,7 +360,7 @@ def remove_theme(cr, theme, base_theme=None):
360360
[mod_id] = cr.fetchone()
361361
cr.execute("DELETE FROM ir_model_data WHERE model='ir.module.module' AND res_id=%s", [mod_id])
362362

363-
ENVIRON["__modules_auto_discovery_force_installs"].discard(theme)
363+
ENVIRON["__modules_auto_discovery_force_installs"].pop(theme, None)
364364
ENVIRON["__modules_auto_discovery_force_upgrades"].pop(theme, None)
365365

366366

@@ -411,8 +411,7 @@ def rename_module(cr, old, new):
411411

412412
fi = ENVIRON["__modules_auto_discovery_force_installs"]
413413
if old in fi:
414-
fi.remove(old)
415-
fi.add(new)
414+
fi[new] = fi.pop(old)
416415
fu = ENVIRON["__modules_auto_discovery_force_upgrades"]
417416
if old in fu:
418417
fu[new] = fu.pop(old)
@@ -440,8 +439,7 @@ def merge_module(cr, old, into, update_dependers=True):
440439

441440
fi = ENVIRON["__modules_auto_discovery_force_installs"]
442441
if old in fi:
443-
fi.remove(old)
444-
fi.add(into)
442+
fi[into] = fi.pop(old)
445443
fu = ENVIRON["__modules_auto_discovery_force_upgrades"]
446444
if old in fu:
447445
if into not in fu:
@@ -596,7 +594,7 @@ def force_install_module(cr, module, if_installed=None, reason="it has been expl
596594
elif ENVIRON.get("AUTO_DISCOVERY_UPGRADE"):
597595
raise MigrationError("`force_install_module` can only be called from pre/post of `base`")
598596
return _force_install_module(cr, module, reason="{} (done outside of a major upgrade)".format(reason))
599-
ENVIRON["__modules_auto_discovery_force_installs"].add(module)
597+
ENVIRON["__modules_auto_discovery_force_installs"][module] = reason
600598
return None
601599
else:
602600
return _force_install_module(cr, module, if_installed, reason)
@@ -1100,8 +1098,9 @@ def _trigger_auto_discovery(cr):
11001098
for new_dep, modules in cr.fetchall():
11011099
_force_install_module(cr, new_dep, reason="it's a new dependency of {}".format(modules))
11021100

1103-
for module in force_installs:
1104-
_force_install_module(cr, module)
1101+
for module, reason in force_installs.items():
1102+
kwargs = {"reason": reason} if reason else {}
1103+
_force_install_module(cr, module, **kwargs)
11051104

11061105
for module, (init, version) in ENVIRON["__modules_auto_discovery_force_upgrades"].items():
11071106
_force_upgrade_of_fresh_module(cr, module, init, version)
@@ -1115,6 +1114,8 @@ def modules_auto_discovery(cr, force_installs=None, force_upgrades=None):
11151114
# The actual auto discovery is delayed in `base/0.0.0/post-modules-auto-discovery.py`
11161115

11171116
if force_installs:
1117+
if not isinstance(force_installs, dict):
1118+
force_installs = dict.fromkeys(force_installs, None)
11181119
ENVIRON["__modules_auto_discovery_force_installs"].update(force_installs)
11191120
if force_upgrades:
11201121
version = _caller_version()

0 commit comments

Comments
 (0)