From 3af52d79947a30bcfbff945075a5b573ee7dcf75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 2 Nov 2012 16:19:00 +0100 Subject: [PATCH] Fix domain parser when value is a list review591002 (transplanted from 61d834ed6a8c49c89c29b85b3134ae28112cb9ee) --- tryton/common/domain_parser.py | 45 +++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/tryton/common/domain_parser.py b/tryton/common/domain_parser.py index ba02d80b37..11e50daec3 100644 --- a/tryton/common/domain_parser.py +++ b/tryton/common/domain_parser.py @@ -541,9 +541,15 @@ def complete_value(field, value): yield True def complete_selection(): + test_value = value + if isinstance(value, list): + test_value = value[-1] for svalue, test in field['selection']: - if test.lower().startswith(value.lower()): - yield svalue + if test.lower().startswith(test_value.lower()): + if test_value == value: + yield svalue + else: + yield value[:-1] + [svalue] def complete_datetime(): yield datetime.date.today() @@ -566,6 +572,23 @@ def complete_value(field, value): return completes.get(field['type'], lambda: [])() +def test_complete_selection(): + field = { + 'type': 'selection', + 'selection': [ + ('male', 'Male'), + ('female', 'Female'), + ], + } + for value, result in ( + ('m', ['male']), + ('test', []), + ('', ['male', 'female']), + (['male', 'f'], [['male', 'female']]), + ): + assert list(complete_value(field, value)) == result + + def parenthesize(tokens): "Nest tokens according to parenthesis" for token in tokens: @@ -912,7 +935,10 @@ class DomainParser(object): (field['name'], '<', rvalue), ]) continue - value = convert_value(field, value) + if isinstance(value, list): + value = [convert_value(field, v) for v in value] + else: + value = convert_value(field, value) yield field['name'], operator, value @@ -1045,6 +1071,15 @@ def test_parse_clause(): 'name': 'integer', 'type': 'integer', }, + 'selection': { + 'string': 'Selection', + 'name': 'selection', + 'type': 'selection', + 'selection': [ + ('male', 'Male'), + ('female', 'Female'), + ], + }, }) assert rlist(dom.parse_clause([('John',)])) == [ ('rec_name', 'ilike', '%John%')] @@ -1058,6 +1093,10 @@ def test_parse_clause(): assert rlist(dom.parse_clause([('Name', '!', ['John', 'Jane'])])) == [ ('name', 'not in', ['John', 'Jane']), ] + assert rlist(dom.parse_clause([('Selection', None, ['Male', 'Female'])])) \ + == [ + ('selection', 'in', ['male', 'female']) + ] assert rlist(dom.parse_clause([('Integer', None, '3..5')])) == [[ ('integer', '>=', 3), ('integer', '<', 5),