[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
This commit is contained in:
Rémy Voet (ryv)
2023-07-07 16:42:45 +02:00
parent 78165067a6
commit 22a0c7f9ee
2 changed files with 24 additions and 1 deletions
+19
View File
@@ -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):
+5 -1
View File
@@ -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.")