Fix domain parser when value is a list
review591002 (transplanted from 61d834ed6a8c49c89c29b85b3134ae28112cb9ee)
This commit is contained in:
1 parent
58bac50f46
commit
3af52d7994
1 file changed
+42
-3
@@ -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),
|
||||
|
||||
Reference in new issue
Block a user