diff --git a/odoo/addons/base/models/ir_ui_view.py b/odoo/addons/base/models/ir_ui_view.py
index 48d051a24c2..dd3b9391db9 100644
--- a/odoo/addons/base/models/ir_ui_view.py
+++ b/odoo/addons/base/models/ir_ui_view.py
@@ -84,6 +84,9 @@ def transfer_node_to_modifiers(node, modifiers):
attrs = node.attrib.pop('attrs', None)
if attrs:
modifiers.update(ast.literal_eval(attrs.strip()))
+ for a in ('invisible', 'readonly', 'required'):
+ if a in modifiers and isinstance(modifiers[a], int):
+ modifiers[a] = bool(modifiers[a])
states = node.attrib.pop('states', None)
if states:
diff --git a/odoo/addons/base/tests/test_views.py b/odoo/addons/base/tests/test_views.py
index 4ee19f5d3b6..15ac8377fe7 100644
--- a/odoo/addons/base/tests/test_views.py
+++ b/odoo/addons/base/tests/test_views.py
@@ -1792,7 +1792,7 @@ class TestViews(ViewCase):
node = etree.fromstring(what) if isinstance(what, str) else what
transfer_node_to_modifiers(node, modifiers)
simplify_modifiers(modifiers)
- assert modifiers == expected, "%s != %s" % (modifiers, expected)
+ assert str(modifiers) == str(expected), "%s != %s" % (modifiers, expected)
_test_modifiers('', {})
_test_modifiers('', {"invisible": True})
@@ -1801,6 +1801,14 @@ class TestViews(ViewCase):
_test_modifiers('', {})
_test_modifiers('', {})
_test_modifiers('', {})
+ _test_modifiers(
+ """""",
+ {"readonly": True},
+ )
+ _test_modifiers(
+ """""",
+ {},
+ )
# TODO: Order is not guaranteed
_test_modifiers(
'',