diff --git a/tailbone/newgrids/filters.py b/tailbone/newgrids/filters.py index 2fed4280..cf533240 100644 --- a/tailbone/newgrids/filters.py +++ b/tailbone/newgrids/filters.py @@ -565,6 +565,96 @@ class AlchemyDateTimeFilter(AlchemyDateFilter): return query.filter(self.column < time) +class AlchemyLocalDateTimeFilter(AlchemyDateTimeFilter): + """ + SQLAlchemy filter for *local* datetime values. This assumes datetime + values in the database are for local timezone, as opposed to UTC. + """ + + def filter_equal(self, query, value): + """ + Find all dateimes which fall on the given date. + """ + date = self.make_date(value) + if not date: + return query + + start = datetime.datetime.combine(date, datetime.time(0)) + start = localtime(self.config, start, tzinfo=False) + + stop = datetime.datetime.combine(date + datetime.timedelta(days=1), datetime.time(0)) + stop = localtime(self.config, stop, tzinfo=False) + + return query.filter(self.column >= start)\ + .filter(self.column < stop) + + def filter_not_equal(self, query, value): + """ + Find all dateimes which do *not* fall on the given date. + """ + date = self.make_date(value) + if not date: + return query + + start = datetime.datetime.combine(date, datetime.time(0)) + start = localtime(self.config, start, tzinfo=False) + + stop = datetime.datetime.combine(date + datetime.timedelta(days=1), datetime.time(0)) + stop = localtime(self.config, stop, tzinfo=False) + + return query.filter(sa.or_( + self.column < start, + self.column <= stop)) + + def filter_greater_than(self, query, value): + """ + Find all datetimes which fall after the given date. + """ + date = self.make_date(value) + if not date: + return query + + time = datetime.datetime.combine(date + datetime.timedelta(days=1), datetime.time(0)) + time = localtime(self.config, time, tzinfo=False) + return query.filter(self.column >= time) + + def filter_greater_equal(self, query, value): + """ + Find all datetimes which fall on or after the given date. + """ + date = self.make_date(value) + if not date: + return query + + time = datetime.datetime.combine(date, datetime.time(0)) + time = localtime(self.config, time, tzinfo=False) + return query.filter(self.column >= time) + + def filter_less_than(self, query, value): + """ + Find all datetimes which fall before the given date. + """ + date = self.make_date(value) + if not date: + return query + + time = datetime.datetime.combine(date, datetime.time(0)) + time = localtime(self.config, time, tzinfo=False) + return query.filter(self.column < time) + + def filter_less_equal(self, query, value): + """ + Find all datetimes which fall on or before the given date. + """ + date = self.make_date(value) + if not date: + return query + + time = datetime.datetime.combine(date + datetime.timedelta(days=1), datetime.time(0)) + time = localtime(self.config, time, tzinfo=False) + return query.filter(self.column < time) + + class AlchemyGPCFilter(AlchemyGridFilter): """ GPC filter for SQLAlchemy.