From 7627527a213cc42dc570fec489dcdfe1c0447955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 18 Apr 2013 23:28:21 +0200 Subject: [PATCH] Manage differently None and empty string in domain_parser issue3038 review803002 --- tryton/common/domain_parser.py | 54 +++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/tryton/common/domain_parser.py b/tryton/common/domain_parser.py index 6059cefb9f..2a136c9e38 100644 --- a/tryton/common/domain_parser.py +++ b/tryton/common/domain_parser.py @@ -87,10 +87,10 @@ def group_operator(tokens): 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 @@ def format_value(field, value): } 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 @@ def complete_value(field, value): 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: - yield svalue - else: + if isinstance(value, list): yield value[:-1] + [svalue] + else: + yield svalue def complete_datetime(): yield datetime.date.today() @@ -612,6 +613,7 @@ def test_complete_selection(): ('m', ['male']), ('test', []), ('', ['male', 'female']), + (None, ['male', 'female']), (['male', 'f'], [['male', 'female']]), ): assert list(complete_value(field, value)) == result @@ -780,8 +782,13 @@ class DomainParser(object): 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 @@ class DomainParser(object): if lvalue: yield name + (lvalue,) else: - yield name + ('',) + yield name + (None,) break parts = [] @@ -959,7 +966,7 @@ class DomainParser(object): 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 @@ def test_string(): }, }) 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 @@ def test_group(): ('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 @@ def test_parse_clause(): }) 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 @@ def test_parse_clause(): == [ ('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),