From 704bcc552709f3b1e024f4a7aa83743f982fd5df Mon Sep 17 00:00:00 2001 From: fja-odoo Date: Wed, 12 Aug 2020 15:07:13 +0000 Subject: [PATCH] [IMP] portal, *: move language switcher to portal *: base, http_routing, website Make the language switcher available on portal without website installed. Part of https://github.com/odoo/odoo/pull/55300 task-2203383 Co-authored-by: Jeremy Kersten Co-authored-by: qsm-odoo --- addons/http_routing/models/ir_http.py | 7 ++-- addons/portal/models/__init__.py | 1 + addons/portal/models/ir_http.py | 7 ++++ addons/portal/models/ir_ui_view.py | 26 +++++++++++++++ addons/portal/static/src/scss/portal.scss | 16 ++++++++++ addons/portal/views/portal_templates.xml | 26 +++++++++++++++ addons/website/models/ir_http.py | 2 +- addons/website/models/ir_ui_view.py | 4 --- addons/website/models/res_lang.py | 8 ++--- addons/website/static/src/scss/website.scss | 16 ---------- addons/website/views/website_templates.xml | 32 ++++++------------- odoo/addons/base/models/res_lang.py | 11 +++++-- .../base/wizard/base_language_install.py | 2 +- 13 files changed, 102 insertions(+), 56 deletions(-) create mode 100644 addons/portal/models/ir_ui_view.py diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py index aa072912b31..6da75e3ef61 100644 --- a/addons/http_routing/models/ir_http.py +++ b/addons/http_routing/models/ir_http.py @@ -147,7 +147,7 @@ def url_lang(path_or_uri, lang_code=None): # relative URL with either a path or a force_lang if not url.netloc and not url.scheme and (url.path or force_lang): location = werkzeug.urls.url_join(request.httprequest.path, location) - lang_url_codes = [url_code for _, url_code, _ in Lang.get_available()] + lang_url_codes = [url_code for _, url_code, *_ in Lang.get_available()] lang_code = pycompat.to_text(lang_code or request.context['lang']) lang_url_code = Lang._lang_code_to_urlcode(lang_code) lang_url_code = lang_url_code if lang_url_code in lang_url_codes else lang_code @@ -208,7 +208,7 @@ def is_multilang_url(local_url, lang_url_codes=None): 2. If not matching 1., everything not under /static/ will be translatable ''' if not lang_url_codes: - lang_url_codes = [url_code for _, url_code, _ in request.env['res.lang'].get_available()] + lang_url_codes = [url_code for _, url_code, *_ in request.env['res.lang'].get_available()] spath = local_url.split('/') # if a language is already in the path, remove it if spath[1] in lang_url_codes: @@ -388,8 +388,7 @@ class IrHttp(models.AbstractModel): path = request.httprequest.path.split('/') is_a_bot = cls.is_a_bot() - available_langs = Lang.get_available() - lang_codes = [code for code, _, _ in available_langs] + lang_codes = [code for code, *_ in Lang.get_available()] nearest_lang = not func and cls.get_nearest_lang(Lang._lang_get_code(path[1])) cook_lang = request.httprequest.cookies.get('frontend_lang') cook_lang = cook_lang in lang_codes and cook_lang diff --git a/addons/portal/models/__init__.py b/addons/portal/models/__init__.py index c9f2b8d412c..1c70d12386a 100644 --- a/addons/portal/models/__init__.py +++ b/addons/portal/models/__init__.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import ir_http +from . import ir_ui_view from . import mail_thread from . import mail_message from . import portal_mixin diff --git a/addons/portal/models/ir_http.py b/addons/portal/models/ir_http.py index 3fad96ff9f1..9320f6d4f82 100644 --- a/addons/portal/models/ir_http.py +++ b/addons/portal/models/ir_http.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import models +from odoo.http import request class IrHttp(models.AbstractModel): @@ -11,3 +12,9 @@ class IrHttp(models.AbstractModel): def _get_translation_frontend_modules_name(cls): mods = super(IrHttp, cls)._get_translation_frontend_modules_name() return mods + ['portal'] + + @classmethod + def _get_frontend_langs(cls): + if request and request.is_frontend: + return [lang[0] for lang in filter(lambda l: l[3], request.env['res.lang'].get_available())] + return super()._get_frontend_langs() diff --git a/addons/portal/models/ir_ui_view.py b/addons/portal/models/ir_ui_view.py new file mode 100644 index 00000000000..e51261170aa --- /dev/null +++ b/addons/portal/models/ir_ui_view.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, models +from odoo.http import request +from odoo.addons.http_routing.models.ir_http import url_for + + +class View(models.Model): + _inherit = "ir.ui.view" + + @api.model + def _prepare_qcontext(self): + """ Returns the qcontext : rendering context with portal specific value (required + to render portal layout template) + """ + qcontext = super(View, self)._prepare_qcontext() + if request and getattr(request, 'is_frontend', False): + Lang = request.env['res.lang'] + portal_lang_code = request.env['ir.http']._get_frontend_langs() + qcontext.update(dict( + self._context.copy(), + languages=[lang for lang in Lang.get_available() if lang[0] in portal_lang_code], + url_for=url_for, + )) + return qcontext diff --git a/addons/portal/static/src/scss/portal.scss b/addons/portal/static/src/scss/portal.scss index cdaccb9117c..604c0a70a25 100644 --- a/addons/portal/static/src/scss/portal.scss +++ b/addons/portal/static/src/scss/portal.scss @@ -535,3 +535,19 @@ form label { } } } + +// Copyright +.o_footer_copyright { + + .js_language_selector { + display: inline-block; + } + @include media-breakpoint-up(md) { + .row { + display: flex; + > div { + margin: auto 0; + } + } + } +} diff --git a/addons/portal/views/portal_templates.xml b/addons/portal/views/portal_templates.xml index 195a7c5a7cb..7cbfe33844f 100644 --- a/addons/portal/views/portal_templates.xml +++ b/addons/portal/views/portal_templates.xml @@ -40,6 +40,32 @@ + + + + + + -