[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
This commit is contained in:
Martin Geubelle
2019-05-22 07:52:07 +00:00
committed by Vincent Schippefilt
parent b11b6bc902
commit c54caca54d
8 changed files with 64 additions and 26 deletions
+3 -3
View File
@@ -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)
+26
View File
@@ -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(),
},
}
+1 -8
View File
@@ -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"/>
+2
View File
@@ -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({
+2 -2
View File
@@ -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")
+27 -1
View File
@@ -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):
+1 -8
View File
@@ -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)" />;
+2 -4
View File
@@ -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