From 8fadfe88bddb7a9ee2faab964aa509aab03c52a7 Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Tue, 12 Mar 2024 18:48:41 +0100 Subject: [PATCH] [FIX] base: ir_qweb, allow to use link with xmlns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Until now, it is impossible to do xxx because qweb will autoclose the because it checks if link is a void element instead to check g:link. Now we check the el_tag instead of unqualified_tag. closes odoo/odoo#159476 Signed-off-by: Rémy Voet (ryv) --- odoo/addons/base/models/ir_qweb.py | 6 +++--- odoo/addons/base/tests/test_qweb.py | 30 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/odoo/addons/base/models/ir_qweb.py b/odoo/addons/base/models/ir_qweb.py index 2e140a6fe10..a20f2bfc4d9 100644 --- a/odoo/addons/base/models/ir_qweb.py +++ b/odoo/addons/base/models/ir_qweb.py @@ -1317,7 +1317,7 @@ class IrQWeb(models.AbstractModel): if unqualified_el_tag != 't': el.set('t-tag-open', el_tag) - if unqualified_el_tag not in VOID_ELEMENTS: + if el_tag not in VOID_ELEMENTS: el.set('t-tag-close', el_tag) if not ({'t-out', 't-esc', 't-raw', 't-field'} & set(el.attrib)): @@ -1371,7 +1371,7 @@ class IrQWeb(models.AbstractModel): attributes = ''.join(f' {name}="{escape(str(value))}"' for name, value in attrib.items() if value or isinstance(value, str)) self._append_text(f'<{el_tag}{"".join(attributes)}', compile_context) - if unqualified_el_tag in VOID_ELEMENTS: + if el_tag in VOID_ELEMENTS: self._append_text('/>', compile_context) else: self._append_text('>', compile_context) @@ -1386,7 +1386,7 @@ class IrQWeb(models.AbstractModel): body = self._compile_directive(el, compile_context, 'inner-content', level) if unqualified_el_tag != 't': - if unqualified_el_tag not in VOID_ELEMENTS: + if el_tag not in VOID_ELEMENTS: self._append_text(f'', compile_context) return body diff --git a/odoo/addons/base/tests/test_qweb.py b/odoo/addons/base/tests/test_qweb.py index c0adc6b4b94..e69264a4194 100644 --- a/odoo/addons/base/tests/test_qweb.py +++ b/odoo/addons/base/tests/test_qweb.py @@ -670,6 +670,36 @@ class TestQWebNS(TransactionCase): with self.assertRaises(QWebException, msg=error_msg): self.env['ir.qweb']._render(view1.id) + + def test_render_static_xml_with_void_element(self): + """ Test the rendering on a namespaced view with dynamic URI (need default namespace uri). + """ + tempate = """ + + Odoo + My Link + + """ + expected_result = """ + + Odoo + My Link + + + """ + + view1 = self.env['ir.ui.view'].create({ + 'name': "dummy", + 'type': 'qweb', + 'arch': """ + %s + """ % tempate + }) + + rendering = self.env['ir.qweb']._render(view1.id) + + self.assertEqual(etree.fromstring(rendering), etree.fromstring(expected_result)) + class TestQWebBasic(TransactionCase): def test_compile_expr(self): tests = [