diff --git a/CHANGELOG b/CHANGELOG index d71d5a06bd..f16c0d0c22 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Allow PYSON Expression as key for PYSON In with dict object * Add method to format warning name with records * Add option to trytond-console to start a readonly transaction * Add support for werkzeug 2.0 diff --git a/trytond/pyson.py b/trytond/pyson.py index d79fefb876..d8da0f846a 100644 --- a/trytond/pyson.py +++ b/trytond/pyson.py @@ -485,11 +485,17 @@ class In(PYSON): assert obj.types().issubset({dict, list}), \ 'obj must be a dict or a list' if obj.types() == {dict}: - assert isinstance(key, str), 'key must be a string' + if isinstance(key, PYSON): + assert key.types() == {str}, 'key must be a string' + else: + assert isinstance(key, str), 'key must be a string' else: assert isinstance(obj, (dict, list)) if isinstance(obj, dict): - assert isinstance(key, str), 'key must be a string' + if isinstance(key, PYSON): + assert key.types() == {str}, 'key must be a string' + else: + assert isinstance(key, str), 'key must be a string' self._key = key self._obj = obj diff --git a/trytond/tests/test_pyson.py b/trytond/tests/test_pyson.py index bc8102312f..b0de2caf55 100644 --- a/trytond/tests/test_pyson.py +++ b/trytond/tests/test_pyson.py @@ -461,12 +461,20 @@ class PYSONTestCase(unittest.TestCase): eval = pyson.PYSONEncoder().encode(pyson.In('foo', {'foo': 'bar'})) self.assertTrue(pyson.PYSONDecoder().decode(eval)) + eval = pyson.PYSONEncoder().encode(pyson.In( + pyson.Eval('test', 'foo'), {'foo': 'bar'})) + self.assertTrue(pyson.PYSONDecoder().decode(eval)) + eval = pyson.PYSONEncoder().encode(pyson.In('1', {1: 'bar'})) self.assertTrue(pyson.PYSONDecoder().decode(eval)) eval = pyson.PYSONEncoder().encode(pyson.In('test', {'foo': 'bar'})) self.assertFalse(pyson.PYSONDecoder().decode(eval)) + eval = pyson.PYSONEncoder().encode(pyson.In( + pyson.Eval('foo', 'test'), {'foo': 'bar'})) + self.assertFalse(pyson.PYSONDecoder().decode(eval)) + eval = pyson.PYSONEncoder().encode(pyson.In('1', {2: 'bar'})) self.assertFalse(pyson.PYSONDecoder().decode(eval))