summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Geubelle <mge@odoo.com>2019-04-19 12:56:40 +0000
committerVincent Schippefilt <vsc@odoo.com>2019-05-22 07:52:07 +0000
commitc54caca54df90da5ef6917b4d53c1e016064a820 (patch)
treee67e772935e1b751bb049dd6ca6a597e59e282e3
parentb11b6bc902daeb354a5afafd801a6835eff81982 (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.py6
-rw-r--r--addons/portal/models/ir_http.py26
-rw-r--r--addons/portal/views/portal_templates.xml9
-rw-r--r--addons/web/controllers/main.py2
-rw-r--r--addons/web/models/ir_http.py4
-rw-r--r--addons/website/models/ir_http.py28
-rw-r--r--addons/website/views/website_templates.xml9
-rw-r--r--odoo/addons/base/models/ir_translation.py6
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