Reviewers: ,


Please review this at http://codereview.tryton.org/591002/

Affected files:
  M tryton/common/domain_parser.py


Index: tryton/common/domain_parser.py
===================================================================
--- a/tryton/common/domain_parser.py
+++ b/tryton/common/domain_parser.py
@@ -569,9 +569,15 @@
             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()
@@ -594,6 +600,23 @@
     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:
@@ -944,7 +967,10 @@
                                     (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


@@ -1077,6 +1103,15 @@
                 '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%')]
@@ -1090,6 +1125,10 @@
     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),


--
[email protected] mailing list

Reply via email to