summaryrefslogtreecommitdiff
path: root/odoo
diff options
context:
space:
mode:
Diffstat (limited to 'odoo')
-rw-r--r--odoo/addons/base/tests/test_expression.py11
-rw-r--r--odoo/osv/expression.py5
2 files changed, 15 insertions, 1 deletions
diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py
index 8cb405319f4..810db9b888b 100644
--- a/odoo/addons/base/tests/test_expression.py
+++ b/odoo/addons/base/tests/test_expression.py
@@ -593,6 +593,17 @@ class TestExpression(SavepointCaseWithUserDemo):
norm_domain = ['&', '&', '&'] + domain
self.assertEqual(norm_domain, expression.normalize_domain(domain), "Non-normalized domains should be properly normalized")
+ def test_35_negating_thruty_leafs(self):
+ self.assertEqual(expression.distribute_not(['!', '!', expression.TRUE_LEAF]), [expression.TRUE_LEAF], "distribute_not applied wrongly")
+ self.assertEqual(expression.distribute_not(['!', '!', expression.FALSE_LEAF]), [expression.FALSE_LEAF], "distribute_not applied wrongly")
+ self.assertEqual(expression.distribute_not(['!', '!', '!', '!', expression.TRUE_LEAF]), [expression.TRUE_LEAF], "distribute_not applied wrongly")
+ self.assertEqual(expression.distribute_not(['!', '!', '!', '!', expression.FALSE_LEAF]), [expression.FALSE_LEAF], "distribute_not applied wrongly")
+
+ self.assertEqual(expression.distribute_not(['!', expression.TRUE_LEAF]), [expression.FALSE_LEAF], "distribute_not applied wrongly")
+ self.assertEqual(expression.distribute_not(['!', expression.FALSE_LEAF]), [expression.TRUE_LEAF], "distribute_not applied wrongly")
+ self.assertEqual(expression.distribute_not(['!', '!', '!', expression.TRUE_LEAF]), [expression.FALSE_LEAF], "distribute_not applied wrongly")
+ self.assertEqual(expression.distribute_not(['!', '!', '!', expression.FALSE_LEAF]), [expression.TRUE_LEAF], "distribute_not applied wrongly")
+
def test_40_negating_long_expression(self):
source = ['!', '&', ('user_id', '=', 4), ('partner_id', 'in', [1, 2])]
expect = ['|', ('user_id', '!=', 4), ('partner_id', 'not in', [1, 2])]
diff --git a/odoo/osv/expression.py b/odoo/osv/expression.py
index 6aa0c88ab5c..ab4b546fa16 100644
--- a/odoo/osv/expression.py
+++ b/odoo/osv/expression.py
@@ -310,7 +310,10 @@ def distribute_not(domain):
if negate:
left, operator, right = token
if operator in TERM_OPERATORS_NEGATION:
- result.append((left, TERM_OPERATORS_NEGATION[operator], right))
+ if token in (TRUE_LEAF, FALSE_LEAF):
+ result.append(FALSE_LEAF if token == TRUE_LEAF else TRUE_LEAF)
+ else:
+ result.append((left, TERM_OPERATORS_NEGATION[operator], right))
else:
result.append(NOT_OPERATOR)
result.append(token)