From 62de570395c06f5a17cdbd4d19c468c5a09641e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 19 May 2017 14:29:58 +0200 Subject: [PATCH] [IMP] base, website: correctly use inheritance when creating qweb rendering context Base render method now calls a prepare_qcontext method used to prepare the qweb context used for the rendering. Website override of ir_ui_view now simply inherits this method to add its own set of values instead of doing strange things with the base render override. Qweb context should be the same after this commit, i.e. containing a lot of duplicated things like a copy of the context. The only change is that user_id and res_company are now directly supported in base rendering instead of only in website version of rendering. Future commits will use those values. --- addons/website/models/ir_ui_view.py | 75 ++++++++++++++--------------- odoo/addons/base/ir/ir_ui_view.py | 18 +++++-- 2 files changed, 49 insertions(+), 44 deletions(-) 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