From 22a0c7f9eefd1d979905a37ee2c4ea7b45bf3664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Voet=20=28ryv=29?= Date: Tue, 4 Jul 2023 14:04:51 +0000 Subject: [PATCH] [FIX] core: filtered_domain with 'any'/'not any' `filtered_domain` didn't throw an exception when it is called with a domain containing the new 'any' and 'not any' operators. Fix it. X-original-commit: 05713a270bfad406daa9dbf739b80cf8c4d065c0 Part-of: odoo/odoo#127750 --- odoo/addons/base/tests/test_expression.py | 19 +++++++++++++++++++ odoo/models.py | 6 +++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index 9682783a89f..032b789bbba 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -897,6 +897,25 @@ class TestExpression(SavepointCaseWithUserDemo): domain = ['|', ('id', '=', id2), ('id', '=', id1)] self.assertEqual(countries.filtered_domain(domain)._ids, expected._ids) + def test_filtered_domain_any_operator(self): + Partner = self.env['res.partner'] + + all_partner = self._search(Partner, []) + partner = self.partners[0] + + children_partner_1 = self._search(Partner, [('parent_id', 'any', [('name', '=', partner.name)])]) + self.assertEqual(children_partner_1, partner.child_ids) + + children_other_partners = self._search(Partner, [('parent_id', 'not any', [('name', '=', partner.name)])]) + self.assertEqual(children_other_partners, all_partner - partner.child_ids) + + one_child_partner = partner.child_ids[0] + parent_partner = self._search(Partner, [('child_ids', 'any', [('name', '=', one_child_partner.name)])]) + self.assertEqual(parent_partner, partner) + + other_partners = self._search(Partner, [('child_ids', 'not any', [('name', '=', one_child_partner.name)])]) + self.assertEqual(other_partners, all_partner - partner) + class TestExpression2(TransactionCase): diff --git a/odoo/models.py b/odoo/models.py index 7ac14d9f25a..8b365f9c1e2 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -5743,7 +5743,7 @@ class BaseModel(metaclass=MetaModel): matching_ids = set() for record in self: data = record.mapped(key) - if isinstance(data, BaseModel): + if isinstance(data, BaseModel) and comparator not in ('any', 'not any'): v = value if isinstance(value, (list, tuple, set)) and value: v = next(iter(value)) @@ -5789,6 +5789,10 @@ class BaseModel(metaclass=MetaModel): elif comparator == '=ilike': data = [(x or "").lower() for x in data] ok = fnmatch.filter(data, value and value_esc.lower()) + elif comparator == 'any': + ok = data.filtered_domain(value) + elif comparator == 'not any': + ok = not data.filtered_domain(value) else: raise ValueError(f"Invalid term domain '{leaf}', operator '{comparator}' doesn't exist.")