Reviewers: ,


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

Affected files:
  M CHANGELOG
  M tryton/common/domain_parser.py
  M tryton/gui/window/view_form/view/screen_container.py


Index: CHANGELOG
===================================================================

--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,5 @@
+* Use range for Date/Time fields in filter box
+
 Version 2.6.0 - 2012-10-22
 * Bug fixes (see mercurial logs for details)
 * Allow to paste in editable list view

Index: tryton/common/domain_parser.py
===================================================================

--- a/tryton/common/domain_parser.py
+++ b/tryton/common/domain_parser.py
@@ -747,7 +747,9 @@
                             operator = '!'
                         value = value.replace('%%', '%')
                 def_operator = default_operator(field)
-                if def_operator in operator:
+                if (def_operator == operator.strip()
+                        or (def_operator in operator
+                            and 'not' in operator)):
                     operator = operator.rstrip(def_operator
                         ).replace('not', '!').strip()
                 if operator.endswith('in'):
@@ -932,7 +934,8 @@
                         operator = negate_operator(default_operator(field))
                     if 'like' in operator:
                         value = likify(value)
-                    if field['type'] in ('integer', 'float', 'numeric'):
+                    if field['type'] in ('integer', 'float', 'numeric',
+                            'datetime', 'date', 'time'):
                         if '..' in value:
                             lvalue, rvalue = value.split('..', 1)
                             lvalue = convert_value(field, lvalue)
@@ -956,6 +959,10 @@
                 'string': '(Sur)Name',
                 'type': 'char',
                 },
+            'date': {
+                'string': 'Date',
+                'type': 'date',
+                },
             })
     assert dom.string([('name', '=', 'Doe')]) == 'Name: =Doe'
     assert dom.string([('name', 'ilike', '%Doe%')]) == 'Name: Doe'
@@ -983,6 +990,8 @@
                     'Name: Doe (Name: John or Name: Jane)'
     assert dom.string([]) == ''
assert dom.string([('surname', 'ilike', '%Doe%')]) == '"(Sur)Name": Doe'
+    assert dom.string([('date', '>=', datetime.date(2012, 10, 24))]) == \
+        'Date: >=10/24/2012'


 def test_group():

Index: tryton/gui/window/view_form/view/screen_container.py
===================================================================

--- a/tryton/gui/window/view_form/view/screen_container.py
+++ b/tryton/gui/window/view_form/view/screen_container.py
@@ -15,6 +15,30 @@
 _ = gettext.gettext


+class Dates(gtk.HBox):
+
+    def __init__(self, format_):
+        super(Dates, self).__init__()
+        self.from_ = common.date_widget.DateEntry(format_)
+        self.pack_start(self.from_, expand=True, fill=True)
+        self.pack_start(gtk.Label(_('..')), expand=False, fill=False)
+        self.to = common.date_widget.DateEntry(format_)
+        self.pack_start(self.to, expand=True, fill=True)
+
+    def get_value(self):
+        from_ = self.from_.get_text()
+        to = self.to.get_text()
+        if from_ and to:
+            if from_ != to:
+                return '%s..%s' % (quote(from_), quote(to))
+            else:
+                return quote(from_)
+        elif from_:
+            return '>=%s' % quote(from_)
+        elif to:
+            return '<%s' % quote(to)
+
+
 class ScreenContainer(object):

     def __init__(self):
@@ -213,11 +237,13 @@
             text = ''
             for label, entry in self.search_table.fields:
                 if isinstance(entry, gtk.ComboBox):
-                    value = entry.get_active_text()
+                    value = quote(entry.get_active_text())
+                elif isinstance(entry, Dates):
+                    value = entry.get_value()
                 else:
-                    value = entry.get_text()
+                    value = quote(entry.get_text())
                 if value:
-                    text += label + ' ' + quote(value) + ' '
+                    text += label + ' ' + value + ' '
             self.set_text(text)
             self.do_search()

@@ -274,8 +300,9 @@
                         format_ = PYSONDecoder({}).decode(field['format'])
                         if field['type'] == 'datetime':
                             format_ = date_format() + ' ' + format_
-                    entry = common.date_widget.DateEntry(format_)
-                    entry.connect('activate', date_activate)
+                    entry = Dates(format_)
+                    entry.from_.connect('activate', date_activate)
+                    entry.to.connect('activate', date_activate)
                 else:
                     entry = gtk.Entry()
                     entry.connect('activate', lambda *a: search())



--
[email protected] mailing list

Reply via email to