diff --git a/tryton/common/domain_inversion.py b/tryton/common/domain_inversion.py index 62b262fb63..8da0a6aa2a 100644 --- a/tryton/common/domain_inversion.py +++ b/tryton/common/domain_inversion.py @@ -4,6 +4,12 @@ import operator import types +def in_(a, b): + if isinstance(a, (list, tuple)): + return any(operator.contains(b, x) for x in a) + else: + return operator.contains(b, a) + OPERATORS = { '=': operator.eq, '>': operator.gt, @@ -11,8 +17,8 @@ OPERATORS = { '<=': operator.le, '>=': operator.ge, '!=': operator.ne, - 'in': lambda a, b: operator.contains(b, a), - 'not in': lambda a, b: not operator.contains(b, a), + 'in': in_, + 'not in': lambda a, b: not in_(b, a), # Those operators are not supported (yet ?) 'like': lambda a, b: True, 'ilike': lambda a, b: True, @@ -390,6 +396,13 @@ def test_evaldomain(): assert eval_domain(domain, {'x': 6}) assert not eval_domain(domain, {'x': 4}) + domain = [['x', 'in', [3, 5]]] + assert eval_domain(domain, {'x': 3}) + assert not eval_domain(domain, {'x': 4}) + assert eval_domain(domain, {'x': [3]}) + assert eval_domain(domain, {'x': [3, 4]}) + assert not eval_domain(domain, {'x': [1, 2]}) + domain = ['OR', ['x', '>', 10], ['x', '<', 0]] assert eval_domain(domain, {'x': 11}) assert eval_domain(domain, {'x': -4})