diff --git a/addons/base_import_module/models/ir_module.py b/addons/base_import_module/models/ir_module.py index a9589810b0f..c372c997eee 100644 --- a/addons/base_import_module/models/ir_module.py +++ b/addons/base_import_module/models/ir_module.py @@ -58,6 +58,10 @@ class IrModule(models.Model): terp.update(ast.literal_eval(f.read().decode())) if not terp: return False + if not terp.get('icon'): + icon_path = 'static/description/icon.png' + module_icon = module if os.path.exists(opj(path, icon_path)) else 'base' + terp['icon'] = opj('/', module_icon, icon_path) values = self.get_values_from_terp(terp) if 'version' in terp: values['latest_version'] = terp['version'] diff --git a/addons/base_import_module/tests/test_import_module.py b/addons/base_import_module/tests/test_import_module.py index b5eaf28d1a5..9b86d2254d5 100644 --- a/addons/base_import_module/tests/test_import_module.py +++ b/addons/base_import_module/tests/test_import_module.py @@ -281,3 +281,20 @@ class TestImportModule(odoo.tests.TransactionCase): asset_data = self.env['ir.model.data'].search([('model', '=', 'ir.asset'), ('res_id', '=', asset.id)]) self.assertEqual(asset_data.module, 'test_module') self.assertEqual(asset_data.name, f'{bundle}_/{path}'.replace(".", "_")) + + +class TestImportModuleHttp(TestImportModule, odoo.tests.HttpCase): + def test_import_module_icon(self): + """Assert import a module with an icon result in the module displaying the icon in the apps menu, + and with the base module icon if module without icon""" + files = [ + ('foo/__manifest__.py', b"{'name': 'foo'}"), + ('foo/static/description/icon.png', b"foo_icon"), + ('bar/__manifest__.py', b"{'name': 'bar'}"), + ] + self.import_zipfile(files) + foo_icon_path, foo_icon_data = files[1] + # Assert icon of module foo, which must be the icon provided in the zip + self.assertEqual(self.url_open('/' + foo_icon_path).content, foo_icon_data) + # Assert icon of module bar, which must be the icon of the base module as none was provided + self.assertEqual(self.env.ref('base.module_bar').icon_image, self.env.ref('base.module_base').icon_image)