Reviewers: ,
Please review this at http://codereview.tryton.org/811002/
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
@@ -87,10 +87,10 @@
yield cur + nex
cur = None
else:
- if cur:
+ if cur is not None:
yield cur
cur = nex
- if cur:
+ if cur is not None:
yield cur
@@ -440,7 +440,8 @@
}
if isinstance(value, (list, tuple)):
return ';'.join(format_value(field, x) for x in value)
- return quote(converts.get(field['type'], lambda: value)())
+ return quote(converts.get(field['type'],
+ lambda: value if value is not None else '')())
def test_format_boolean():
@@ -569,15 +570,15 @@
yield True
def complete_selection():
- test_value = value
+ test_value = value if value is not None else ''
if isinstance(value, list):
test_value = value[-1]
for svalue, test in field['selection']:
if test.lower().startswith(test_value.lower()):
- if test_value == value:
+ if isinstance(value, list):
+ yield value[:-1] + [svalue]
+ else:
yield svalue
- else:
- yield value[:-1] + [svalue]
def complete_datetime():
yield datetime.date.today()
@@ -612,6 +613,7 @@
('m', ['male']),
('test', []),
('', ['male', 'female']),
+ (None, ['male', 'female']),
(['male', 'f'], [['male', 'female']]),
):
assert list(complete_value(field, value)) == result
@@ -780,8 +782,13 @@
operator = '!'
else:
operator = ''
+ formatted_value = format_value(field, value)
+ if (operator in OPERATORS and
+ field['type'] in
('char', 'text', 'sha', 'selection')
+ and value == ''):
+ formatted_value = '""'
return '%s: %s%s' % (quote(field['string']), operator,
- format_value(field, value))
+ formatted_value)
else:
return '(%s)' % self.string(clause)
@@ -916,7 +923,7 @@
if lvalue:
yield name + (lvalue,)
else:
- yield name + ('',)
+ yield name + (None,)
break
parts = []
@@ -959,7 +966,7 @@
value = likify(value)
if field['type'] in ('integer', 'float', 'numeric',
'datetime', 'date', 'time'):
- if '..' in value:
+ if value and '..' in value:
lvalue, rvalue = value.split('..', 1)
lvalue = convert_value(field, lvalue)
rvalue = convert_value(field, rvalue)
@@ -991,6 +998,9 @@
},
})
assert dom.string([('name', '=', 'Doe')]) == 'Name: =Doe'
+ assert dom.string([('name', '=', None)]) == 'Name: ='
+ assert dom.string([('name', '=', '')]) == 'Name: =""'
+ assert dom.string([('name', 'ilike', '%')]) == 'Name: '
assert dom.string([('name', 'ilike', '%Doe%')]) == 'Name: Doe'
assert dom.string([('name', 'ilike', 'Doe')]) == 'Name: =Doe'
assert dom.string([('name', 'ilike', 'Doe%')]) == 'Name: Doe%'
@@ -1088,7 +1098,20 @@
('Name', None, 'Doe'),
]
assert rlist(dom.group(udlex(u'Name:'))) == [
- ('Name', None, ''),
+ ('Name', None, None),
+ ]
+ assert rlist(dom.group(udlex(u'Name: ='))) == [
+ ('Name', '=', None),
+ ]
+ assert rlist(dom.group(udlex(u'Name: =""'))) == [
+ ('Name', '=', ''),
+ ]
+ assert rlist(dom.group(udlex(u'Name: = ""'))) == [
+ ('Name', '=', ''),
+ ]
+ assert rlist(dom.group(udlex(u'Name: = Name: Doe'))) == [
+ ('Name', '=', None),
+ ('Name', None, 'Doe'),
]
@@ -1116,6 +1139,12 @@
})
assert rlist(dom.parse_clause([('John',)])) == [
('rec_name', 'ilike', '%John%')]
+ assert rlist(dom.parse_clause([('Name', None, None)])) == [
+ ('name', 'ilike', '%')]
+ assert rlist(dom.parse_clause([('Name', '=', None)])) == [
+ ('name', '=', None)]
+ assert rlist(dom.parse_clause([('Name', '=', '')])) == [
+ ('name', '=', '')]
assert rlist(dom.parse_clause([('Name', None, 'Doe')])) == [
('name', 'ilike', '%Doe%')]
assert rlist(dom.parse_clause([('Name', '!', 'Doe')])) == [
@@ -1130,6 +1159,9 @@
== [
('selection', 'in', ['male', 'female'])
]
+ assert rlist(dom.parse_clause([('Integer', None, None)])) == [
+ ('integer', '=', None),
+ ]
assert rlist(dom.parse_clause([('Integer', None, '3..5')])) == [[
('integer', '>=', 3),
('integer', '<', 5),