From 12e36a66f23d79623ef9f96b67406d7e9c5e7fe1 Mon Sep 17 00:00:00 2001 From: Simon Lejeune Date: Thu, 1 Dec 2016 21:09:46 +0100 Subject: [PATCH] [FIX] qweb: render a child view with its xmlid QWeb's get_template: * remove the fallback that returned the entire result of IRQweb's `load` if no match was made between the t-name of the first children of this result and the template to render * When get_template receives an etree, directly return it and don't try to find a matching t-name in it. The loader was not called but a matching was trying to be made, now that we removed the fallback a lot of tests that were relying on passing etree didn't work anymore. IRQweb's load now return consistently the full result of IrUiView's `read_templace` when asked to load an id or an xmlid. We make a special case to patch the result if asked with an id or with a child view so that the "t-name" of one of the first children of what we return is always what QWeb is looking for. --- addons/website/tests/test_views.py | 2 +- odoo/addons/base/ir/ir_qweb/ir_qweb.py | 24 ++++++++++++++++-------- odoo/addons/base/ir/ir_qweb/qweb.py | 4 ++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/addons/website/tests/test_views.py b/addons/website/tests/test_views.py index 06a1be33048..40a976d4e7d 100644 --- a/addons/website/tests/test_views.py +++ b/addons/website/tests/test_views.py @@ -195,7 +195,7 @@ class TestViewSaving(common.TransactionCase): def test_save_escaped_text(self): """ Test saving html special chars in text nodes """ view = self.env['ir.ui.view'].create({ - 'arch': '

hello world

', + 'arch': '

hello world

', 'type': 'qweb' }) # script and style text nodes should not escaped client side diff --git a/odoo/addons/base/ir/ir_qweb/ir_qweb.py b/odoo/addons/base/ir/ir_qweb/ir_qweb.py index 6b71606395f..feda00e23ac 100644 --- a/odoo/addons/base/ir/ir_qweb/ir_qweb.py +++ b/odoo/addons/base/ir/ir_qweb/ir_qweb.py @@ -77,18 +77,26 @@ class IrQWeb(models.AbstractModel, QWeb): env = self.env if lang != env.context.get('lang'): env = env(context=dict(env.context, lang=lang)) + template = env['ir.ui.view'].read_template(name) - res_id = isinstance(name, (int, long)) and name or None - if res_id: + # QWeb's `read_template` will check if one of the first children of + # what we send to it has a "t-name" attribute having `name` as value + # to consider it has found it. As it'll never be the case when working + # with view ids or children view, force it here. + def is_child_view(view): + view_id = self.env['ir.ui.view'].get_view_id(name) + view = self.env['ir.ui.view'].browse(view_id) + return view.inherit_id is not None and view.mode != 'primary' + + if isinstance(name, (int, long)) or is_child_view(name): for node in etree.fromstring(template): if node.get('t-name'): - return node - elif res_id and node.tag == "t": - node.set('t-name', str(res_id)) - return node - - return template + node.set('t-name', str(name)) + return node.getparent() + return None # trigger "template not found" in QWeb + else: + return template # order diff --git a/odoo/addons/base/ir/ir_qweb/qweb.py b/odoo/addons/base/ir/ir_qweb/qweb.py index a50f478779f..e2ffc4bf399 100644 --- a/odoo/addons/base/ir/ir_qweb/qweb.py +++ b/odoo/addons/base/ir/ir_qweb/qweb.py @@ -335,6 +335,7 @@ class QWeb(object): if isinstance(template, etree._Element): document = template template = etree.tostring(template) + return (document, template) else: try: document = options.get('load', self.load)(template, options) @@ -352,9 +353,8 @@ class QWeb(object): else: element = etree.parse(document).getroot() for node in element: - if node.get('t-name') == template: + if node.get('t-name') == str(template): return (node, document) - return (element, document) raise QWebException("Template not found", name=template)