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