diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py index 7e956e85658..034ace846c2 100644 --- a/addons/website/models/ir_ui_view.py +++ b/addons/website/models/ir_ui_view.py @@ -7,7 +7,6 @@ from lxml import etree from odoo import api, fields, models from odoo import tools - from odoo.addons.website.models import website from odoo.http import request from odoo.tools import pycompat @@ -88,24 +87,17 @@ class View(models.Model): new_context = dict(self._context) if request and getattr(request, 'website_enabled', False): - qcontext = self._prepare_qcontext() - - # add some values - if values: - qcontext.update(values) + editable = request.website.is_publisher() + translatable = editable and self._context.get('lang') != request.website.default_lang_code + editable = not translatable and editable # in edit mode ir.ui.view will tag nodes - if not qcontext.get('translatable') and not qcontext.get('rendering_bundle'): - if qcontext.get('editable'): + if not translatable and not self.env.context.get('rendering_bundle'): + if editable: new_context = dict(self._context, inherit_branding=True) elif request.env.user.has_group('website.group_website_publisher'): new_context = dict(self._context, inherit_branding_auto=True) - if 'main_object' not in qcontext: - qcontext['main_object'] = self - - values = qcontext - if self._context != new_context: self = self.with_context(new_context) return super(View, self).render(values, engine=engine) @@ -115,38 +107,41 @@ class View(models.Model): """ Returns the qcontext : rendering context with website specific value (required to render website layout template) """ - company = request.website.company_id.sudo() + qcontext = super(View, self)._prepare_qcontext() - editable = request.website.is_publisher() - translatable = editable and self._context.get('lang') != request.website.default_lang_code - editable = not translatable and editable + if request and getattr(request, 'website_enabled', False): + editable = request.website.is_publisher() + translatable = editable and self._context.get('lang') != request.website.default_lang_code + editable = not translatable and editable - def unslug_url(s): - parts = s.split('/') - if parts: - unslug_val = website.unslug(parts[-1]) - if unslug_val[1]: - parts[-1] = str(unslug_val[1]) - return '/'.join(parts) - return s + if 'main_object' not in qcontext: + qcontext['main_object'] = self + + def unslug_url(s): + parts = s.split('/') + if parts: + unslug_val = website.unslug(parts[-1]) + if unslug_val[1]: + parts[-1] = str(unslug_val[1]) + return '/'.join(parts) + return s + + qcontext.update(dict( + self._context.copy(), + website=request.website, + url_for=website.url_for, + slug=website.slug, + unslug_url=unslug_url, + res_company=request.website.company_id.sudo(), + default_lang_code=request.website.default_lang_code, + languages=request.website.get_languages(), + translatable=translatable, + editable=editable, + menu_data=self.env['ir.ui.menu'].load_menus_root() if request.website.is_user() else None, + )) - qcontext = dict( - self._context.copy(), - website=request.website, - url_for=website.url_for, - slug=website.slug, - unslug_url=unslug_url, - res_company=company, - user_id=self.env["res.users"].browse(self.env.user.id), - default_lang_code=request.website.default_lang_code, - languages=request.website.get_languages(), - translatable=translatable, - editable=editable, - menu_data=self.env['ir.ui.menu'].load_menus_root() if request.website.is_user() else None, - ) return qcontext - @api.model def get_default_lang_code(self): website_id = self.env.context.get('website_id') diff --git a/odoo/addons/base/ir/ir_ui_view.py b/odoo/addons/base/ir/ir_ui_view.py index d70ee4cf951..1a14fbfbfef 100644 --- a/odoo/addons/base/ir/ir_ui_view.py +++ b/odoo/addons/base/ir/ir_ui_view.py @@ -1058,10 +1058,22 @@ actual arch. def render(self, values=None, engine='ir.qweb'): assert isinstance(self.id, pycompat.integer_types) + qcontext = self._prepare_qcontext() + qcontext.update(values or {}) + + return self.env[engine].render(self.id, qcontext) + + @api.model + def _prepare_qcontext(self): + """ Returns the qcontext : rendering context with website specific value (required + to render website layout template) + """ qcontext = dict( env=self.env, + user_id=self.env["res.users"].browse(self.env.user.id), + res_company=self.env.user.company_id.sudo(), keep_query=keep_query, - request=request, # might be unbound if we're not in an httprequest context + request=request, # might be unbound if we're not in an httprequest context debug=request.debug if request else False, json=json, quote_plus=werkzeug.url_quote_plus, @@ -1070,9 +1082,7 @@ actual arch. relativedelta=relativedelta, xmlid=self.key, ) - qcontext.update(values or {}) - - return self.env[engine].render(self.id, qcontext) + return qcontext #------------------------------------------------------ # Misc