diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index cc6ca0f603c..4c52a8730fb 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -75,36 +75,35 @@ ROOT_USER_ID = 1
def transfer_field_to_modifiers(field, modifiers):
for a in ('invisible', 'readonly', 'required'):
if field.get(a):
- modifiers[a] = field.get(a)
+ modifiers[a] = bool(field.get(a))
# Don't deal with groups, it is done by check_group().
# Need the context to evaluate the invisible attribute on tree views.
# For non-tree views, the context shouldn't be given.
-def transfer_node_to_modifiers(node, modifiers, context=None):
+def transfer_node_to_modifiers(node, modifiers, context=None, in_tree_view=False):
if node.get('attrs'):
modifiers.update(eval(node.get('attrs')))
if node.get('states'):
- # TODO combine with AND or OR, use implicit AND for now.
- modifiers.setdefault('invisible', [])\
- .append(('state', 'not in', node.get('states').split(',')))
+ if 'invisible' in modifiers and isinstance(modifiers['invisible'], list):
+ # TODO combine with AND or OR, use implicit AND for now.
+ modifiers['invisible'].append(('state', 'not in', node.get('states').split(',')))
+ else:
+ modifiers['invisible'] = [('state', 'not in', node.get('states').split(','))]
for a in ('invisible', 'readonly', 'required'):
if node.get(a):
- if a == 'invisible' and context is not None:
+ v = bool(eval(node.get(a), {'context': context or {}}))
+ if in_tree_view and a == 'invisible':
# Invisible in a tree view has a specific meaning, make it a
# new key in the modifiers attribute.
- try:
- modifiers['tree_invisible'] = bool(eval(node.get(a), {'context': context}))
- except:
- print ">>> Can't seem to eval this thing (1):", node.get(a)
- else:
- try:
- # Only simple expression as it is evaluated server-side
- modifiers[a] = bool(eval(node.get(a)))
- except:
- print ">>> Can't seem to eval this thing (2):", node.get(a)
+ modifiers['tree_invisible'] = v
+ elif v or (a not in modifiers or not isinstance(modifiers[a], list)):
+ # Don't set the attribute to False if a dynamic value was
+ # provided (i.e. a domain from attrs or states).
+ modifiers[a] = v
+
def simplify_modifiers(modifiers):
for a in ('invisible', 'readonly', 'required'):
@@ -133,7 +132,10 @@ def test_modifiers(what, expected):
assert json == expected, "%s != %s" % (json, expected)
-def tests():
+# To use this test:
+# import openerp
+# openerp.osv.orm.modifiers_tests()
+def modifiers_tests():
test_modifiers('', '{}')
test_modifiers('', '{"invisible": true}')
test_modifiers('', '{"readonly": true}')
@@ -1517,8 +1519,7 @@ class orm_template(object):
result = self.view_header_get(cr, user, False, node.tag, context)
if result:
node.set('string', result)
- if node.tag == 'tree':
- in_tree_view = True
+ in_tree_view = node.tag == 'tree'
elif node.tag == 'calendar':
for additional_field in ('date_start', 'date_delay', 'date_stop', 'color'):
@@ -1529,7 +1530,7 @@ class orm_template(object):
# The view architeture overrides the python model.
# Get the attrs before they are (possibly) deleted by check_group below
- transfer_node_to_modifiers(node, modifiers, context if in_tree_view else None)
+ transfer_node_to_modifiers(node, modifiers, context, in_tree_view)
# TODO remove attrs couterpart in modifiers when invisible is true ?