From f7ff02b0fbb865937fb19c3f8fb317f60528eddf Mon Sep 17 00:00:00 2001 From: qsm-odoo Date: Fri, 26 Jun 2020 09:20:58 +0000 Subject: [PATCH] [FIX] website_theme_install: properly reset config on theme change Before this commit, some code was resetting some default website config on theme change. Problem 1: This was not done when *removing* a theme. Thus when you wanted to go back to a default website theme, you were not properly reset to the default theme config. This could actually crash: some themes define more fonts than others; so if you selected font 13 in one theme then removed the theme, the default one would crash if not properly reset as font 13 would not exist. Problem 2: It was done for every theme dependency, making theme change slower for no reason. Problem 3 (theorically, not tested): The current code worked by chance as it called the website 'make_scss_customization' method without giving any website to it. It actually worked by fallback on the right website in normal user cases (user in the context of installing a theme on a specific website) but may not be working when trying to install a theme on a different website calling those functions from custom code. Now, a dedicated method is there for config reset and is called at the correct place with the right website in the context. closes odoo/odoo#53743 X-original-commit: 7307d696449ea2b7a231b0b9087e64f6bbf65d26 Signed-off-by: Quentin Smetz (qsm) --- addons/website/models/ir_module_module.py | 5 +++++ addons/website/models/theme_models.py | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/addons/website/models/ir_module_module.py b/addons/website/models/ir_module_module.py index 8307022dd4d..2ad142a8ffb 100644 --- a/addons/website/models/ir_module_module.py +++ b/addons/website/models/ir_module_module.py @@ -325,6 +325,11 @@ class IrModuleModule(models.Model): :param website: ``website`` model for which the themes have to be removed """ + # _theme_remove is the entry point of any change of theme for a website + # (either removal or installation of a theme and its dependencies). In + # either case, we need to reset some default configuration before. + self.env['theme.utils'].with_context(website_id=website.id)._reset_default_config() + if not website.theme_id: return diff --git a/addons/website/models/theme_models.py b/addons/website/models/theme_models.py index f10dafcbe2c..181280e8616 100644 --- a/addons/website/models/theme_models.py +++ b/addons/website/models/theme_models.py @@ -153,6 +153,16 @@ class Theme(models.AbstractModel): _auto = False def _post_copy(self, mod): + # Call specific theme post copy + theme_post_copy = '_%s_post_copy' % mod.name + if hasattr(self, theme_post_copy): + _logger.info('Executing method %s' % theme_post_copy) + method = getattr(self, theme_post_copy) + return method(mod) + return False + + @api.model + def _reset_default_config(self): # Reinitialize some css customizations self.env['web_editor.assets'].make_scss_customization( '/website/static/src/scss/options/user_values.scss', @@ -179,14 +189,6 @@ class Theme(models.AbstractModel): self.disable_view('website.template_footer_logo_only') self.disable_view('website.template_footer_address_logo') - # Call specific theme post copy - theme_post_copy = '_%s_post_copy' % mod.name - if hasattr(self, theme_post_copy): - _logger.info('Executing method %s' % theme_post_copy) - method = getattr(self, theme_post_copy) - return method(mod) - return False - @api.model def _toggle_view(self, xml_id, active): obj = self.env.ref(xml_id)