diff --git a/odoo/addons/base/ir/ir_ui_view.py b/odoo/addons/base/ir/ir_ui_view.py index daa8d72f26f..7f9d0340f02 100644 --- a/odoo/addons/base/ir/ir_ui_view.py +++ b/odoo/addons/base/ir/ir_ui_view.py @@ -466,7 +466,7 @@ actual arch. :return: a node in the source matching the spec """ if spec.tag == 'xpath': - nodes = arch.xpath(spec.get('expr')) + nodes = etree.ETXPath(spec.get('expr'))(arch) return nodes[0] if nodes else None elif spec.tag == 'field': # Only compare the field name: a field can be only once in a given view diff --git a/odoo/addons/base/tests/test_qweb.py b/odoo/addons/base/tests/test_qweb.py index c4b279c2f43..284cc104840 100644 --- a/odoo/addons/base/tests/test_qweb.py +++ b/odoo/addons/base/tests/test_qweb.py @@ -373,6 +373,52 @@ class TestQWebNS(TransactionCase): self.assertEquals(len(cac_lines), 2) self.assertEquals(result.count('Appel'), 2) + def test_render_static_xml_with_extension(self): + """ Test the extension of a view by an xpath expression on a ns prefixed element. + """ + # primary view + view1 = self.env['ir.ui.view'].create({ + 'name': "dummy", + 'type': 'qweb', + 'arch': """ + + + + + Apples + Bananas + + + + + """ + }) + # extension patching the primary view + view2 = self.env['ir.ui.view'].create({ + 'name': "dummy_ext", + 'type': 'qweb', + 'inherit_id': view1.id, + 'arch': """ + + Oranges + + """ + }) + + expected_result = """ + + + + Apples + Bananas + Oranges + + + + """ + + self.assertEquals(dedent_and_strip(view1.with_context(check_view_ids=[view1.id, view2.id]).render()), dedent_and_strip(expected_result)) + from copy import deepcopy class FileSystemLoader(object):