summaryrefslogtreecommitdiff
path: root/odoo/addons/base/tests/test_expression.py
diff options
context:
space:
mode:
authorAlvaro Fuentes <afu@odoo.com>2021-03-31 15:45:49 +0000
committerAlvaro Fuentes <afu@odoo.com>2021-04-01 15:30:21 +0000
commit26976764554af3016097f1659b563e75757148e3 (patch)
treeaf6b0a092fac6009d88f0680265794afae890430 /odoo/addons/base/tests/test_expression.py
parentea4dbcd2404663d8542d3f071ceae97ee6dc61ad (diff)
[FIX] core/expression: fix distribute_not over thruty leafs
A domain with a negated thruty leaf raises an exception here https://github.com/odoo/odoo/blob/835197e48fbbee1c8ac35d52287537fa6f0bdd36/odoo/osv/expression.py#L614 due to https://github.com/odoo/odoo/blob/835197e48fbbee1c8ac35d52287537fa6f0bdd36/odoo/osv/expression.py#L670 and the fact that `FALSE_LEAF != (1, "!=", 1)` and `TRUE_LEAF != (0, "!=", 1)` Current wrong behaviour: ``` >>> distribute_not(['!', TRUE_LEAF]) [(1, '!=', 1)] >>> is_leaf((1, '!=', 1)) False ``` This issue was noticed when adapting domains for fields that have been removed during migration. Example (extract of) traceback: ``` Traceback (most recent call last): File "/home/odoo/src/odoo/13.0/odoo/http.py", line 624, in _handle_exception return super(JsonRequest, self)._handle_exception(exception) ... File "/home/odoo/src/odoo/13.0/odoo/osv/expression.py", line 677, in __init__ self.parse() File "/home/odoo/src/odoo/13.0/odoo/osv/expression.py", line 814, in parse self.stack = [ExtendedLeaf(leaf, self.root_model) for leaf in self.expression] File "/home/odoo/src/odoo/13.0/odoo/osv/expression.py", line 814, in <listcomp> self.stack = [ExtendedLeaf(leaf, self.root_model) for leaf in self.expression] File "/home/odoo/src/odoo/13.0/odoo/osv/expression.py", line 562, in __init__ self.check_leaf(internal) File "/home/odoo/src/odoo/13.0/odoo/osv/expression.py", line 618, in check_leaf raise ValueError("Invalid leaf %s" % str(self.leaf)) ValueError: Invalid leaf (0, '!=', 1) ``` closes odoo/odoo#68657 X-original-commit: e20c23658d15a135e5f35b0e8dec6e3202cecaab Signed-off-by: Christophe Simonis <chs@odoo.com>
Diffstat (limited to 'odoo/addons/base/tests/test_expression.py')
-rw-r--r--odoo/addons/base/tests/test_expression.py11
1 files changed, 11 insertions, 0 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])]