Reviewers: ,


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

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,11 @@
                         operator = '!'
                     else:
                         operator = ''
+                formatted_value = format_value(field, value)
+                if operator == '=' 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 +921,7 @@
                         if lvalue:
                             yield name + (lvalue,)
                         else:
-                            yield name + ('',)
+                            yield name + (None,)
                     break

         parts = []
@@ -991,6 +996,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 +1096,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 +1137,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')])) == [



Reply via email to