[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.
This commit is contained in:
Thibault Delavallée
2017-07-17 18:06:37 +02:00
parent 0908cbd0e8
commit 62de570395
2 changed files with 49 additions and 44 deletions
+35 -40
View File
@@ -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')
+14 -4
View File
@@ -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