diff --git a/odoo/addons/base/models/ir_ui_view.py b/odoo/addons/base/models/ir_ui_view.py index 514bd2ebc9a..2cd347e2bf4 100644 --- a/odoo/addons/base/models/ir_ui_view.py +++ b/odoo/addons/base/models/ir_ui_view.py @@ -1061,7 +1061,8 @@ actual arch. """ for node in tree.xpath('//*[@groups]'): - if not self.user_has_groups(node.attrib.pop('groups')): + attrib_groups = node.attrib.pop('groups') + if attrib_groups and not self.user_has_groups(attrib_groups): node.getparent().remove(node) elif node.tag == 't' and (not node.attrib or node.get('postprocess_added')): # Move content of blocks diff --git a/odoo/addons/base/tests/test_views.py b/odoo/addons/base/tests/test_views.py index da21a75d569..b46b7a93b5d 100644 --- a/odoo/addons/base/tests/test_views.py +++ b/odoo/addons/base/tests/test_views.py @@ -2969,6 +2969,23 @@ class TestViews(ViewCase): """, valid=True) + @mute_logger('odoo.addons.base.models.ir_ui_view') + def test_empty_groups_attrib(self): + """Ensure we allow empty groups attribute""" + view = self.View.create({ + 'name': 'foo', + 'model': 'res.partner', + 'arch': """ +
+ + + """, + }) + arch = self.env['res.partner'].get_view(view_id=view.id)['arch'] + tree = etree.fromstring(arch) + nodes = tree.xpath("//field[@name='name' and not (@groups)]") + self.assertEqual(1, len(nodes)) + def test_attrs_groups_with_groups_in_model(self): """Tests the attrs is well processed to modifiers for a field node combining: - a `groups` attribute on the field node in the view architecture