Skip to content

Commit 688b6a4

Browse files
committed
[IMP] util/domains.py: handle any operator introduced in Odoo 17
In such domain, the right-hand term is domain that should also be adatped. See odoo/odoo@5a99869 closes #88 Signed-off-by: Christophe Simonis (chs) <[email protected]>
1 parent b3ad3a4 commit 688b6a4

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

src/base/tests/test_util.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,21 @@ def test_dotted_old(self, left, expected, model="res.users"):
258258
else:
259259
self.assertIsNone(new_domain)
260260

261+
@unittest.skipUnless(util.version_gte("17.0"), "`any` operator only supported from Odoo 17")
262+
def test_any_operator(self):
263+
domain = [("partner_id", "any", [("complete_name", "=", "Odoo")])]
264+
expected = [("partner_id", "any", [("full_name", "=", "Odoo")])]
265+
266+
new_domain = _adapt_one_domain(self.cr, "res.partner", "complete_name", "full_name", "res.company", domain)
267+
self.assertEqual(new_domain, expected)
268+
269+
# test it also works recursively
270+
domain = [("partner_id", "any", [("title", "not any", [("shortcut", "like", "S.A.")])])]
271+
expected = [("partner_id", "any", [("title", "not any", [("abbr", "like", "S.A.")])])]
272+
273+
new_domain = _adapt_one_domain(self.cr, "res.partner.title", "shortcut", "abbr", "res.company", domain)
274+
self.assertEqual(new_domain, expected)
275+
261276

262277
class TestAdaptDomainView(UnitTestCase):
263278
def test_adapt_domain_view(self):

src/util/domains.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,22 @@ def _adapt_one_domain(cr, target_model, old, new, model, domain, adapter=None, f
226226
def clean_term(term):
227227
if isinstance(term, basestring) or not isinstance(term[0], basestring):
228228
return term
229-
return (clean_path(term[0]), term[1], term[2])
229+
left, op, right = term
230+
left = clean_path(left)
231+
if op in ("any", "not any"):
232+
new_right = _adapt_one_domain(
233+
cr,
234+
target_model,
235+
old,
236+
new,
237+
model=_model_of_path(cr, model, left.split(".")),
238+
domain=right,
239+
adapter=adapter,
240+
force_adapt=force_adapt,
241+
)
242+
if new_right is not None:
243+
right = new_right
244+
return (left, op, right)
230245

231246
final_dom = []
232247
changed = False

0 commit comments

Comments
 (0)