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.")