[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:
committed by
Vincent Schippefilt
parent
b11b6bc902
commit
c54caca54d
@@ -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)
|
||||
|
||||
@@ -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(),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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):
|
||||
|
||||
|
||||
@@ -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)" />;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user