From e1cfc1f74000e55473f7a26f0df5a13c4d5094c0 Mon Sep 17 00:00:00 2001
From: Raphael Collet <rco@odoo.com>
Date: Thu, 17 Nov 2022 13:48:12 +0000
Subject: [PATCH] [FIX] core: ignore imported modules when loading registry

The existing code was generating misleading errors for imported Odoo
modules that could not be loaded.  Although there was a specific hack
for module 'studio_customization', imported modules were not handled
properly.  This patch adds the right condition in the SQL query in the
module that introduces imported modules.

closes odoo/odoo#105955

Signed-off-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
---
 addons/base_import_module/models/ir_module.py |  4 ++++
 odoo/addons/base/models/ir_module.py          |  5 ++++-
 odoo/modules/loading.py                       | 14 ++++++++------
 3 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/addons/base_import_module/models/ir_module.py b/addons/base_import_module/models/ir_module.py
index f245ead654cc..f943f0f0787f 100644
--- a/addons/base_import_module/models/ir_module.py
+++ b/addons/base_import_module/models/ir_module.py
@@ -25,6 +25,10 @@ class IrModule(models.Model):
 
     imported = fields.Boolean(string="Imported Module")
 
+    def _get_modules_to_load_domain(self):
+        # imported modules are not expected to be loaded as regular modules
+        return super()._get_modules_to_load_domain() + [('imported', '=', False)]
+
     @api.depends('name')
     def _get_latest_version(self):
         imported_modules = self.filtered(lambda m: m.imported and m.latest_version)
diff --git a/odoo/addons/base/models/ir_module.py b/odoo/addons/base/models/ir_module.py
index 699eaa169e74..51b3206f1d10 100644
--- a/odoo/addons/base/models/ir_module.py
+++ b/odoo/addons/base/models/ir_module.py
@@ -320,6 +320,10 @@ class Module(models.Model):
         self.clear_caches()
         return super(Module, self).unlink()
 
+    def _get_modules_to_load_domain(self):
+        """ Domain to retrieve the modules that should be loaded by the registry. """
+        return [('state', '=', 'installed')]
+
     @staticmethod
     def _check_python_external_dependency(pydep):
         try:
@@ -339,7 +343,6 @@ class Module(models.Model):
             _logger.warning("get_distribution(%s) failed: %s", pydep, e)
             raise Exception('Error finding python library %s' % (pydep,))
 
-
     @staticmethod
     def _check_external_dependencies(terp):
         depends = terp.get('external_dependencies')
diff --git a/odoo/modules/loading.py b/odoo/modules/loading.py
index 8093f14b1b0f..2cdd39ba9cf5 100644
--- a/odoo/modules/loading.py
+++ b/odoo/modules/loading.py
@@ -460,15 +460,17 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
                     ['to install'], force, status, report,
                     loaded_modules, update_module, models_to_check)
 
-        # check that all installed modules have been loaded by the registry after a migration/upgrade
-        cr.execute("SELECT name from ir_module_module WHERE state = 'installed' and name != 'studio_customization'")
-        module_list = [name for (name,) in cr.fetchall() if name not in graph]
-        if module_list:
-            _logger.error("Some modules are not loaded, some dependencies or manifest may be missing: %s", sorted(module_list))
-
         registry.loaded = True
         registry.setup_models(cr)
 
+        # check that all installed modules have been loaded by the registry
+        env = api.Environment(cr, SUPERUSER_ID, {})
+        Module = env['ir.module.module']
+        modules = Module.search(Module._get_modules_to_load_domain(), order='name')
+        missing = [name for name in modules.mapped('name') if name not in graph]
+        if missing:
+            _logger.error("Some modules are not loaded, some dependencies or manifest may be missing: %s", missing)
+
         # STEP 3.5: execute migration end-scripts
         migrations = odoo.modules.migration.MigrationManager(cr, graph)
         for package in graph:
-- 
GitLab