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 @@