From 4c403934903b68afb08e87ac571b6777042e5a7f Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Fri, 13 Mar 2020 15:16:40 +0000 Subject: [PATCH] [FIX] website: perf - translation - avoid query to find what we know Before this commit, each module override _get_translation_frontend_modules_domain from ir.http to add its own translation in website if needed and that module is not starting by website_. Updating the domain from the super() call. Since we know in most of the case the name, it is useless to do a: select name from module where name = 'name1' or name = 'name2'... Now we support a new override of _get_translation_frontend_modules_name that will allow to add the known module name directly in the list instead to make a search. In case nobody override _get_translation_frontend_modules_domain, we don't need to make an extra rpc to find the module. Related to #47257 task-2211013 X-original-commit: 0dc54814161ab55c34dd2242f65dea23d19fdfca --- addons/http_routing/models/ir_http.py | 21 ++++++++++++++++----- addons/payment/models/ir_http.py | 7 +++---- addons/portal/models/ir_http.py | 7 +++---- addons/web_editor/models/ir_http.py | 7 +++---- addons/website/models/ir_http.py | 9 +++++---- addons/website_livechat/models/ir_http.py | 9 ++++----- 6 files changed, 34 insertions(+), 26 deletions(-) diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py index 4f441b2079a..ae3ca509b73 100644 --- a/addons/http_routing/models/ir_http.py +++ b/addons/http_routing/models/ir_http.py @@ -313,17 +313,28 @@ class IrHttp(models.AbstractModel): @api.model def get_translation_frontend_modules(self): Modules = request.env['ir.module.module'].sudo() - domain = self._get_translation_frontend_modules_domain() - return Modules.search( - expression.AND([domain, [('state', '=', 'installed')]]) - ).mapped('name') + extra_modules_domain = self._get_translation_frontend_modules_domain() + extra_modules_name = self._get_translation_frontend_modules_name() + if extra_modules_domain: + new = Modules.search( + expression.AND([extra_modules_domain, [('state', '=', 'installed')]]) + ).mapped('name') + extra_modules_name += new + return extra_modules_name @classmethod def _get_translation_frontend_modules_domain(cls): """ Return a domain to list the domain adding web-translations and dynamic resources that may be used frontend views """ - return [('name', '=', 'web')] + return [] + + @classmethod + def _get_translation_frontend_modules_name(cls): + """ Return a list of module name where web-translations and + dynamic resources may be used in frontend views + """ + return ['web'] bots = "bot|crawl|slurp|spider|curl|wget|facebookexternalhit".split("|") diff --git a/addons/payment/models/ir_http.py b/addons/payment/models/ir_http.py index 0d9c9c8de32..ad6bddf87cc 100644 --- a/addons/payment/models/ir_http.py +++ b/addons/payment/models/ir_http.py @@ -2,13 +2,12 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import models -from odoo.osv import expression class IrHttp(models.AbstractModel): _inherit = 'ir.http' @classmethod - def _get_translation_frontend_modules_domain(cls): - domain = super(IrHttp, cls)._get_translation_frontend_modules_domain() - return expression.OR([domain, [('name', '=', 'payment')]]) + def _get_translation_frontend_modules_name(cls): + mods = super(IrHttp, cls)._get_translation_frontend_modules_name() + return mods + ['payment'] diff --git a/addons/portal/models/ir_http.py b/addons/portal/models/ir_http.py index 2c654c73986..3fad96ff9f1 100644 --- a/addons/portal/models/ir_http.py +++ b/addons/portal/models/ir_http.py @@ -2,13 +2,12 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import models -from odoo.osv import expression class IrHttp(models.AbstractModel): _inherit = 'ir.http' @classmethod - def _get_translation_frontend_modules_domain(cls): - domain = super(IrHttp, cls)._get_translation_frontend_modules_domain() - return expression.OR([domain, [('name', '=', 'portal')]]) + def _get_translation_frontend_modules_name(cls): + mods = super(IrHttp, cls)._get_translation_frontend_modules_name() + return mods + ['portal'] diff --git a/addons/web_editor/models/ir_http.py b/addons/web_editor/models/ir_http.py index aaf0f67cefb..d9690f5ecfd 100644 --- a/addons/web_editor/models/ir_http.py +++ b/addons/web_editor/models/ir_http.py @@ -3,7 +3,6 @@ from odoo import models from odoo.http import request -from odoo.osv import expression class IrHttp(models.AbstractModel): @@ -22,6 +21,6 @@ class IrHttp(models.AbstractModel): return super(IrHttp, cls)._dispatch() @classmethod - def _get_translation_frontend_modules_domain(cls): - domain = super(IrHttp, cls)._get_translation_frontend_modules_domain() - return expression.OR([domain, [('name', '=', 'web_editor')]]) + def _get_translation_frontend_modules_name(cls): + mods = super(IrHttp, cls)._get_translation_frontend_modules_name() + return mods + ['web_editor'] diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index ca734f1afe7..c3f298eddf3 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -17,7 +17,7 @@ from odoo import api, models from odoo import registry, SUPERUSER_ID from odoo.http import request from odoo.tools.safe_eval import safe_eval -from odoo.osv.expression import FALSE_DOMAIN, OR +from odoo.osv.expression import FALSE_DOMAIN from odoo.addons.http_routing.models.ir_http import ModelConverter, _guess_mimetype from odoo.addons.portal.controllers.portal import _build_url_w_params @@ -226,9 +226,10 @@ class Http(models.AbstractModel): return super(Http, cls)._get_default_lang() @classmethod - def _get_translation_frontend_modules_domain(cls): - domain = super(Http, cls)._get_translation_frontend_modules_domain() - return OR([domain, [('name', 'ilike', 'website')]]) + def _get_translation_frontend_modules_name(cls): + mods = super(Http, cls)._get_translation_frontend_modules_name() + installed = request.registry._init_modules | set(odoo.conf.server_wide_modules) + return mods + [mod for mod in installed if mod.startswith('website')] @classmethod def _serve_page(cls): diff --git a/addons/website_livechat/models/ir_http.py b/addons/website_livechat/models/ir_http.py index 3ab3566502a..20f54548c96 100644 --- a/addons/website_livechat/models/ir_http.py +++ b/addons/website_livechat/models/ir_http.py @@ -1,14 +1,13 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import api, fields, models -from odoo.osv import expression +from odoo import models class IrHttp(models.AbstractModel): _inherit = 'ir.http' @classmethod - def _get_translation_frontend_modules_domain(cls): - domain = super(IrHttp, cls)._get_translation_frontend_modules_domain() - return expression.OR([domain, [('name', '=', 'im_livechat')]]) + def _get_translation_frontend_modules_name(cls): + mods = super(IrHttp, cls)._get_translation_frontend_modules_name() + return mods + ['im_livechat']