[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:
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user