From 934c0016809c0ff8db4ff238ac7116c5acccf95a Mon Sep 17 00:00:00 2001 From: Adrian Torres Date: Mon, 18 Feb 2019 10:16:13 +0000 Subject: [PATCH] [FIX] expression: properly handle {TRUE,FALSE}_LEAF Before this commit, doing expression.OR() with only FALSE_LEAF would yield [] which is equivalent to TRUE_LEAF and is therefore not correct. The same happened (to a lesser extent) with expression.AND() within an expression.OR(), since the former would return a [] which would be ignored by expression.OR(). See tests for a clearer view of the use cases. Fixes #30113, #26540 closes odoo/odoo#31202 --- odoo/addons/base/tests/test_expression.py | 30 +++++++++++++++++++++++ odoo/osv/expression.py | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index 365876a9e16..9d3252fd7f2 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -612,6 +612,36 @@ class TestExpression(TransactionCase): not_be = Partner.with_context(lang='fr_FR').search([('country_id', '!=', 'Belgique')]) self.assertNotIn(agrolait, not_be) + def test_proper_combine_unit_leaves(self): + # test that unit leaves (TRUE_LEAF, FALSE_LEAF) are properly handled in specific cases + false = expression.FALSE_DOMAIN + true = expression.TRUE_DOMAIN + normal = [('foo', '=', 'bar')] + # OR with single FALSE_LEAF + expr = expression.OR([false]) + self.assertEqual(expr, false) + # OR with multiple FALSE_LEAF + expr = expression.OR([false, false]) + self.assertEqual(expr, false) + # OR with FALSE_LEAF and a normal leaf + expr = expression.OR([false, normal]) + self.assertEqual(expr, normal) + # OR with AND of single TRUE_LEAF and normal leaf + expr = expression.OR([expression.AND([true]), normal]) + self.assertEqual(expr, true) + # AND with single TRUE_LEAF + expr = expression.AND([true]) + self.assertEqual(expr, true) + # AND with multiple TRUE_LEAF + expr = expression.AND([true, true]) + self.assertEqual(expr, true) + # AND with TRUE_LEAF and normal leaves + expr = expression.AND([true, normal]) + self.assertEqual(expr, normal) + # AND with OR with single FALSE_LEAF and normal leaf + expr = expression.AND([expression.OR([false]), normal]) + self.assertEqual(expr, false) + class TestAutoJoin(TransactionCase): diff --git a/odoo/osv/expression.py b/odoo/osv/expression.py index bef1cb1c523..3025472e0d0 100644 --- a/odoo/osv/expression.py +++ b/odoo/osv/expression.py @@ -233,7 +233,7 @@ def combine(operator, unit, zero, domains): result += domain count += 1 result = [operator] * (count - 1) + result - return result + return result or unit def AND(domains):