diff options
| author | Martin Geubelle <mge@odoo.com> | 2019-04-19 12:56:40 +0000 |
|---|---|---|
| committer | Vincent Schippefilt <vsc@odoo.com> | 2019-05-22 07:52:07 +0000 |
| commit | c54caca54df90da5ef6917b4d53c1e016064a820 (patch) | |
| tree | e67e772935e1b751bb049dd6ca6a597e59e282e3 | |
| parent | b11b6bc902daeb354a5afafd801a6835eff81982 (diff) | |
[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
| -rw-r--r-- | addons/http_routing/controllers/main.py | 6 | ||||
| -rw-r--r-- | addons/portal/models/ir_http.py | 26 | ||||
| -rw-r--r-- | addons/portal/views/portal_templates.xml | 9 | ||||
| -rw-r--r-- | addons/web/controllers/main.py | 2 | ||||
| -rw-r--r-- | addons/web/models/ir_http.py | 4 | ||||
| -rw-r--r-- | addons/website/models/ir_http.py | 28 | ||||
| -rw-r--r-- | addons/website/views/website_templates.xml | 9 | ||||
| -rw-r--r-- | 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/<string:unique>', 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 @@ <t t-call="web.layout"> <t t-set="head_website"> <script type="text/javascript"> - odoo.session_info = { - is_admin: <t t-esc="json.dumps(request.env.user._is_admin())"/>, - is_system: <t t-esc="json.dumps(request.env.user._is_system())"/>, - is_website_user: <t t-esc="json.dumps(request.env.user._is_public())"/>, - user_id: <t t-esc="json.dumps(request.env.user.id)" />, - is_frontend: true, - translationURL: '/website/translations', - }; + odoo.session_info = <t t-raw="json.dumps(request.env['ir.http'].get_portal_session_info())"/>; </script> <t t-call-assets="web.assets_common" t-js="false"/> 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 @@ </t> <script type="text/javascript"> - odoo.session_info = { - is_admin: <t t-esc="json.dumps(request.env.user._is_admin())"/>, - is_system: <t t-esc="json.dumps(request.env.user._is_system())"/>, - is_frontend: true, - translationURL: '/website/translations', - is_website_user: <t t-esc="json.dumps(request.env.user.id == request.website.user_id.id)" />, - user_id: <t t-esc="json.dumps(request.env.user.id)" /> - }; + odoo.session_info = <t t-raw="json.dumps(request.env['ir.http'].get_website_session_info())"/>; <t groups="website.group_website_publisher"> odoo.session_info.website_id = <t t-esc="json.dumps(request.website.id)" />; odoo.session_info.website_company_id = <t t-esc="json.dumps(request.website.company_id.id)" />; diff --git a/odoo/addons/base/models/ir_translation.py b/odoo/addons/base/models/ir_translation.py index 0f5b23ad22a..bb3918b70c3 100644 --- a/odoo/addons/base/models/ir_translation.py +++ b/odoo/addons/base/models/ir_translation.py @@ -855,12 +855,10 @@ class IrTranslation(models.Model): @api.model def get_translations_for_webclient(self, mods, lang): - if mods is None: + if not mods: mods = [x['name'] for x in self.env['ir.module.module'].sudo().search_read( [('state', '=', 'installed')], ['name'])] - else: - mods = mods.split(',') - if lang is None: + if not lang: lang = self._context["lang"] langs = self.env['res.lang'].sudo().search([("code", "=", lang)]) lang_params = None |
