Add basic support for "between" verb, for date range grid filter
this seems to be complete, but we'll see in practice if i forgot something..
This commit is contained in:
parent
14778757d9
commit
d97f95fb92
4 changed files with 177 additions and 10 deletions
|
@ -553,6 +553,7 @@ class AlchemyDateFilter(AlchemyGridFilter):
|
|||
'greater_equal': "on or after",
|
||||
'less_than': "before",
|
||||
'less_equal': "on or before",
|
||||
'between': "between",
|
||||
'is_null': "is null",
|
||||
'is_not_null': "is not null",
|
||||
'is_any': "is any",
|
||||
|
@ -562,8 +563,18 @@ class AlchemyDateFilter(AlchemyGridFilter):
|
|||
"""
|
||||
Expose greater-than / less-than verbs in addition to core.
|
||||
"""
|
||||
return ['equal', 'not_equal', 'greater_than', 'greater_equal',
|
||||
'less_than', 'less_equal', 'is_null', 'is_not_null', 'is_any']
|
||||
return [
|
||||
'equal',
|
||||
'not_equal',
|
||||
'greater_than',
|
||||
'greater_equal',
|
||||
'less_than',
|
||||
'less_equal',
|
||||
'between',
|
||||
'is_null',
|
||||
'is_not_null',
|
||||
'is_any',
|
||||
]
|
||||
|
||||
def make_date(self, value):
|
||||
"""
|
||||
|
@ -577,6 +588,44 @@ class AlchemyDateFilter(AlchemyGridFilter):
|
|||
else:
|
||||
return dt.date()
|
||||
|
||||
def filter_between(self, query, value):
|
||||
"""
|
||||
Filter data with a "between" query. Really this uses ">=" and "<="
|
||||
(inclusive) logic instead of SQL "between" keyword.
|
||||
"""
|
||||
if value is None or value == '':
|
||||
return query
|
||||
|
||||
if '|' not in value:
|
||||
return query
|
||||
|
||||
values = value.split('|')
|
||||
if len(values) != 2:
|
||||
return query
|
||||
|
||||
start_date, end_date = values
|
||||
if start_date:
|
||||
start_date = self.make_date(start_date)
|
||||
if end_date:
|
||||
end_date = self.make_date(end_date)
|
||||
|
||||
# we'll only filter if we have start and/or end date
|
||||
if not start_date and not end_date:
|
||||
return query
|
||||
|
||||
return self.filter_date_range(query, start_date, end_date)
|
||||
|
||||
def filter_date_range(self, query, start_date, end_date):
|
||||
"""
|
||||
This method should actually apply filter(s) to the query, according to
|
||||
the given date range. Subclasses may override this logic.
|
||||
"""
|
||||
if start_date:
|
||||
query = query.filter(self.column >= start_date)
|
||||
if end_date:
|
||||
query = query.filter(self.column <= end_date)
|
||||
return query
|
||||
|
||||
|
||||
class AlchemyDateTimeFilter(AlchemyDateFilter):
|
||||
"""
|
||||
|
@ -666,6 +715,17 @@ class AlchemyDateTimeFilter(AlchemyDateFilter):
|
|||
time = make_utc(localtime(self.config, time))
|
||||
return query.filter(self.column < time)
|
||||
|
||||
def filter_date_range(self, query, start_date, end_date):
|
||||
if start_date:
|
||||
start_time = datetime.datetime.combine(start_date, datetime.time(0))
|
||||
start_time = localtime(self.config, start_time)
|
||||
query = query.filter(self.column >= make_utc(start_time))
|
||||
if end_date:
|
||||
end_time = datetime.datetime.combine(end_date + datetime.timedelta(days=1), datetime.time(0))
|
||||
end_time = localtime(self.config, end_time)
|
||||
query = query.filter(self.column <= make_utc(end_time))
|
||||
return query
|
||||
|
||||
|
||||
class AlchemyLocalDateTimeFilter(AlchemyDateTimeFilter):
|
||||
"""
|
||||
|
@ -756,6 +816,17 @@ class AlchemyLocalDateTimeFilter(AlchemyDateTimeFilter):
|
|||
time = localtime(self.config, time, tzinfo=False)
|
||||
return query.filter(self.column < time)
|
||||
|
||||
def filter_date_range(self, query, start_date, end_date):
|
||||
if start_date:
|
||||
start_time = datetime.datetime.combine(start_date, datetime.time(0))
|
||||
start_time = localtime(self.config, start_time, tzinfo=False)
|
||||
query = query.filter(self.column >= start_time)
|
||||
if end_date:
|
||||
end_time = datetime.datetime.combine(end_date + datetime.timedelta(days=1), datetime.time(0))
|
||||
end_time = localtime(self.config, end_time, tzinfo=False)
|
||||
query = query.filter(self.column <= end_time)
|
||||
return query
|
||||
|
||||
|
||||
class AlchemyGPCFilter(AlchemyGridFilter):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue