From e433625cfb3f12c33f9803cefceb53772e5a6679 Mon Sep 17 00:00:00 2001 From: Simon Lejeune Date: Wed, 7 Dec 2016 14:34:27 +0100 Subject: [PATCH] [FIX] qweb: render of a primary view Revisions [1] and [2] broke the rendering of extensions-primary view because it made the wrong assumption that the `read_template` of an extension-primary view set the `t-name` attribute to the name of the extension-primary view. We now patch the `t-name` in the `read_template` result for this case. [1] 12e36a66f23d79623ef9f96b67406d7e9c5e7fe1 [2] 9dd5bd93498bc57e5e1febf19119bb98cdd9b3d7 --- odoo/addons/base/ir/ir_qweb/ir_qweb.py | 8 +++---- odoo/addons/base/tests/test_views.py | 30 ++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/odoo/addons/base/ir/ir_qweb/ir_qweb.py b/odoo/addons/base/ir/ir_qweb/ir_qweb.py index feda00e23ac..ddb1c64d73d 100644 --- a/odoo/addons/base/ir/ir_qweb/ir_qweb.py +++ b/odoo/addons/base/ir/ir_qweb/ir_qweb.py @@ -83,11 +83,11 @@ class IrQWeb(models.AbstractModel, QWeb): # 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) + # with view ids or children view or children primary views, force it here. + def is_child_view(view_name): + view_id = self.env['ir.ui.view'].get_view_id(view_name) view = self.env['ir.ui.view'].browse(view_id) - return view.inherit_id is not None and view.mode != 'primary' + return view.inherit_id is not None if isinstance(name, (int, long)) or is_child_view(name): for node in etree.fromstring(template): diff --git a/odoo/addons/base/tests/test_views.py b/odoo/addons/base/tests/test_views.py index e210ce90073..7790f2d11db 100644 --- a/odoo/addons/base/tests/test_views.py +++ b/odoo/addons/base/tests/test_views.py @@ -1207,14 +1207,25 @@ class TestQWebRender(ViewCase): """ }) + view3 = self.View.create({ + 'name': "dummy_primary_ext", + 'type': 'qweb', + 'inherit_id': view1.id, + 'mode': 'primary', + 'arch': """ + + another primary thing + + """ + }) - # render with an id + # render view and child view with an id content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id]).render(view1.id) content2 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id]).render(view2.id) self.assertEqual(content1, content2) - # render with an xmlid + # render view and child view with an xmlid self.env.cr.execute("INSERT INTO ir_model_data(name, model, res_id, module)" "VALUES ('dummy', 'ir.ui.view', %s, 'base')" % view1.id) self.env.cr.execute("INSERT INTO ir_model_data(name, model, res_id, module)" @@ -1224,3 +1235,18 @@ class TestQWebRender(ViewCase): content2 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id]).render('base.dummy_ext') self.assertEqual(content1, content2) + + # render view and primary extension with an id + content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id]).render(view1.id) + content3 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id]).render(view3.id) + + self.assertNotEqual(content1, content3) + + # render view and primary extension with an xmlid + self.env.cr.execute("INSERT INTO ir_model_data(name, model, res_id, module)" + "VALUES ('dummy_primary_ext', 'ir.ui.view', %s, 'base')" % view3.id) + + content1 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id]).render('base.dummy') + content3 = self.env['ir.qweb'].with_context(check_view_ids=[view1.id, view2.id, view3.id]).render('base.dummy_primary_ext') + + self.assertNotEqual(content1, content3) \ No newline at end of file