From c54caca54df90da5ef6917b4d53c1e016064a820 Mon Sep 17 00:00:00 2001 From: Martin Geubelle Date: Fri, 19 Apr 2019 12:56:40 +0000 Subject: [PATCH] [IMP] website: Cache translations forever Generate a unique URL for translations and cache them forever in the browser. This reduces the number of requests, in exchange for computing the hash of the translations when the session object is added to the page --- addons/http_routing/controllers/main.py | 6 ++--- addons/portal/models/ir_http.py | 26 ++++++++++++++++++++ addons/portal/views/portal_templates.xml | 9 +------ addons/web/controllers/main.py | 2 ++ addons/web/models/ir_http.py | 4 ++-- addons/website/models/ir_http.py | 28 +++++++++++++++++++++- addons/website/views/website_templates.xml | 9 +------ odoo/addons/base/models/ir_translation.py | 6 ++--- 8 files changed, 64 insertions(+), 26 deletions(-) diff --git a/addons/http_routing/controllers/main.py b/addons/http_routing/controllers/main.py index 206aff1d639..2a8a149b17d 100644 --- a/addons/http_routing/controllers/main.py +++ b/addons/http_routing/controllers/main.py @@ -10,8 +10,8 @@ from odoo.addons.web.controllers.main import WebClient, Home class Routing(Home): - @http.route('/website/translations', type='json', auth="public", website=True) - def get_website_translations(self, lang, mods=None): + @http.route('/website/translations/', type='http', auth="public", website=True) + def get_website_translations(self, unique, lang, mods=None): Modules = request.env['ir.module.module'].sudo() IrHttp = request.env['ir.http'].sudo() domain = IrHttp._get_translation_frontend_modules_domain() @@ -20,4 +20,4 @@ class Routing(Home): ).mapped('name') if mods: modules += mods - return WebClient().translations(mods=modules, lang=lang) + return WebClient().translations(unique, mods=','.join(modules), lang=lang) diff --git a/addons/portal/models/ir_http.py b/addons/portal/models/ir_http.py index b1cf9f59a60..1345d51a655 100644 --- a/addons/portal/models/ir_http.py +++ b/addons/portal/models/ir_http.py @@ -1,8 +1,11 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +import hashlib +import json from odoo import api, fields, models from odoo.osv import expression +from odoo.http import request class IrHttp(models.AbstractModel): @@ -13,3 +16,26 @@ class IrHttp(models.AbstractModel): domain = super(IrHttp, cls)._get_translation_frontend_modules_domain() return expression.OR([domain, [('name', '=', 'portal')]]) + @api.model + def get_portal_session_info(self): + # see http_routing/main.py + Modules = request.env['ir.module.module'].sudo() + IrHttp = request.env['ir.http'].sudo() + domain = IrHttp._get_translation_frontend_modules_domain() + modules = Modules.search( + expression.AND([domain, [('state', '=', 'installed')]]) + ).mapped('name') + user_context = request.session.get_context() if request.session.uid else {} + lang = user_context.get('lang') + translations, _ = request.env['ir.translation'].get_translations_for_webclient(modules, lang) + return { + 'is_admin': self.env.user._is_admin(), + 'is_system': self.env.user._is_system(), + 'is_website_user': self.env.user._is_public(), + 'user_id': self.env.user.id, + 'is_frontend': True, + 'translationURL': '/website/translations', + 'cache_hashes': { + 'translations': hashlib.sha1(json.dumps(translations, sort_keys=True).encode()).hexdigest(), + }, + } diff --git a/addons/portal/views/portal_templates.xml b/addons/portal/views/portal_templates.xml index df903862d3f..8562d316272 100644 --- a/addons/portal/views/portal_templates.xml +++ b/addons/portal/views/portal_templates.xml @@ -4,14 +4,7 @@ diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 4d00f5114f8..00ac2048724 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -613,6 +613,8 @@ class WebClient(http.Controller): """ request.disable_db = False + if mods: + mods = mods.split(',') translations_per_module, lang_params = request.env["ir.translation"].get_translations_for_webclient(mods, lang) body = json.dumps({ diff --git a/addons/web/models/ir_http.py b/addons/web/models/ir_http.py index 0253599d508..872c330ea64 100644 --- a/addons/web/models/ir_http.py +++ b/addons/web/models/ir_http.py @@ -27,8 +27,8 @@ class Http(models.AbstractModel): user_context = request.session.get_context() if request.session.uid else {} - mods = ','.join(module_boot()) - files = [f[0] for f in manifest_glob('qweb', addons=mods)] + mods = module_boot() + files = [f[0] for f in manifest_glob('qweb', addons=','.join(mods))] _, qweb_checksum = concat_xml(files) lang = user_context.get("lang") diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index 50dc84a07c8..2faacdc14ad 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. - +import hashlib import logging from lxml import etree import traceback import os +import json import unittest import pytz @@ -18,6 +19,7 @@ from odoo import SUPERUSER_ID from odoo.http import request from odoo.tools import config from odoo.tools.safe_eval import safe_eval +from odoo.osv import expression from odoo.osv.expression import FALSE_DOMAIN, OR from odoo.addons.base.models.qweb import QWebException @@ -314,6 +316,30 @@ class Http(models.AbstractModel): return super(Http, cls)._xmlid_to_obj(env, xmlid) + @api.model + def get_website_session_info(self): + # see http_routing/main.py + Modules = request.env['ir.module.module'].sudo() + IrHttp = request.env['ir.http'].sudo() + domain = IrHttp._get_translation_frontend_modules_domain() + modules = Modules.search( + expression.AND([domain, [('state', '=', 'installed')]]) + ).mapped('name') + user_context = request.session.get_context() if request.session.uid else {} + lang = user_context.get('lang') + translations, _ = request.env['ir.translation'].get_translations_for_webclient(modules, lang) + return { + 'is_admin': request.env.user._is_admin(), + 'is_system': request.env.user._is_system(), + 'is_frontend': True, + 'translationURL': '/website/translations', + 'is_website_user': request.env.user.id == request.website.user_id.id, + 'user_id': request.env.user.id, + 'cache_hashes': { + 'translations': hashlib.sha1(json.dumps(translations, sort_keys=True).encode()).hexdigest(), + }, + } + class ModelConverter(ModelConverter): diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 1785a7c6f01..7c55f8c2947 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -225,14 +225,7 @@