Commit 2f272f28 authored by Serge S. Koval's avatar Serge S. Koval

Made all type filters case-insensitive for all backends

parent 8d539f81
...@@ -92,10 +92,10 @@ class FilterEmpty(BaseMongoEngineFilter, filters.BaseBooleanFilter): ...@@ -92,10 +92,10 @@ class FilterEmpty(BaseMongoEngineFilter, filters.BaseBooleanFilter):
else: else:
flt = {'%s__ne' % self.column.name: None} flt = {'%s__ne' % self.column.name: None}
return query.filter(**flt) return query.filter(**flt)
def operation(self): def operation(self):
return lazy_gettext('empty') return lazy_gettext('empty')
class FilterInList(BaseMongoEngineFilter): class FilterInList(BaseMongoEngineFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
...@@ -103,23 +103,23 @@ class FilterInList(BaseMongoEngineFilter): ...@@ -103,23 +103,23 @@ class FilterInList(BaseMongoEngineFilter):
def clean(self, value): def clean(self, value):
return [v.strip() for v in value.split(',') if v.strip()] return [v.strip() for v in value.split(',') if v.strip()]
def apply(self, query, value): def apply(self, query, value):
flt = {'%s__in' % self.column.name: value} flt = {'%s__in' % self.column.name: value}
return query.filter(**flt) return query.filter(**flt)
def operation(self): def operation(self):
return lazy_gettext('in list') return lazy_gettext('in list')
class FilterNotInList(FilterInList): class FilterNotInList(FilterInList):
def apply(self, query, value): def apply(self, query, value):
flt = {'%s__nin' % self.column.name: value} flt = {'%s__nin' % self.column.name: value}
return query.filter(**flt) return query.filter(**flt)
def operation(self): def operation(self):
return lazy_gettext('not in list') return lazy_gettext('not in list')
# Customized type filters # Customized type filters
class BooleanEqualFilter(FilterEqual, filters.BaseBooleanFilter): class BooleanEqualFilter(FilterEqual, filters.BaseBooleanFilter):
...@@ -132,95 +132,95 @@ class BooleanNotEqualFilter(FilterNotEqual, filters.BaseBooleanFilter): ...@@ -132,95 +132,95 @@ class BooleanNotEqualFilter(FilterNotEqual, filters.BaseBooleanFilter):
def apply(self, query, value): def apply(self, query, value):
flt = {'%s' % self.column.name: value != '1'} flt = {'%s' % self.column.name: value != '1'}
return query.filter(**flt) return query.filter(**flt)
class IntEqualFilter(FilterEqual, filters.BaseIntFilter): class IntEqualFilter(FilterEqual, filters.BaseIntFilter):
pass pass
class IntNotEqualFilter(FilterNotEqual, filters.BaseIntFilter): class IntNotEqualFilter(FilterNotEqual, filters.BaseIntFilter):
pass pass
class IntGreaterFilter(FilterGreater, filters.BaseIntFilter): class IntGreaterFilter(FilterGreater, filters.BaseIntFilter):
pass pass
class IntSmallerFilter(FilterSmaller, filters.BaseIntFilter): class IntSmallerFilter(FilterSmaller, filters.BaseIntFilter):
pass pass
class IntInListFilter(filters.BaseIntListFilter, FilterInList): class IntInListFilter(filters.BaseIntListFilter, FilterInList):
pass pass
class IntNotInListFilter(filters.BaseIntListFilter, FilterNotInList): class IntNotInListFilter(filters.BaseIntListFilter, FilterNotInList):
pass pass
class FloatEqualFilter(FilterEqual, filters.BaseFloatFilter): class FloatEqualFilter(FilterEqual, filters.BaseFloatFilter):
pass pass
class FloatNotEqualFilter(FilterNotEqual, filters.BaseFloatFilter): class FloatNotEqualFilter(FilterNotEqual, filters.BaseFloatFilter):
pass pass
class FloatGreaterFilter(FilterGreater, filters.BaseFloatFilter): class FloatGreaterFilter(FilterGreater, filters.BaseFloatFilter):
pass pass
class FloatSmallerFilter(FilterSmaller, filters.BaseFloatFilter): class FloatSmallerFilter(FilterSmaller, filters.BaseFloatFilter):
pass pass
class FloatInListFilter(filters.BaseFloatListFilter, FilterInList): class FloatInListFilter(filters.BaseFloatListFilter, FilterInList):
pass pass
class FloatNotInListFilter(filters.BaseFloatListFilter, FilterNotInList): class FloatNotInListFilter(filters.BaseFloatListFilter, FilterNotInList):
pass pass
class DateTimeEqualFilter(FilterEqual, filters.BaseDateTimeFilter): class DateTimeEqualFilter(FilterEqual, filters.BaseDateTimeFilter):
pass pass
class DateTimeNotEqualFilter(FilterNotEqual, filters.BaseDateTimeFilter): class DateTimeNotEqualFilter(FilterNotEqual, filters.BaseDateTimeFilter):
pass pass
class DateTimeGreaterFilter(FilterGreater, filters.BaseDateTimeFilter): class DateTimeGreaterFilter(FilterGreater, filters.BaseDateTimeFilter):
pass pass
class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter): class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter):
pass pass
class DateTimeBetweenFilter(BaseMongoEngineFilter, filters.BaseDateTimeBetweenFilter): class DateTimeBetweenFilter(BaseMongoEngineFilter, filters.BaseDateTimeBetweenFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
super(DateTimeBetweenFilter, self).__init__(column, super(DateTimeBetweenFilter, self).__init__(column,
name, name,
options, options,
data_type='datetimerangepicker') data_type='datetimerangepicker')
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
flt = {'%s__gte' % self.column.name: start, '%s__lte' % self.column.name: end} flt = {'%s__gte' % self.column.name: start, '%s__lte' % self.column.name: end}
return query.filter(**flt) return query.filter(**flt)
class DateTimeNotBetweenFilter(DateTimeBetweenFilter): class DateTimeNotBetweenFilter(DateTimeBetweenFilter):
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(Q(**{'%s__not__gte' % self.column.name: start}) | return query.filter(Q(**{'%s__not__gte' % self.column.name: start}) |
Q(**{'%s__not__lte' % self.column.name: end})) Q(**{'%s__not__lte' % self.column.name: end}))
def operation(self): def operation(self):
return lazy_gettext('not between') return lazy_gettext('not between')
# Base peewee filter field converter # Base peewee filter field converter
class FilterConverter(filters.BaseFilterConverter): class FilterConverter(filters.BaseFilterConverter):
strings = (FilterEqual, FilterNotEqual, FilterLike, FilterNotLike, strings = (FilterEqual, FilterNotEqual, FilterLike, FilterNotLike,
...@@ -229,17 +229,19 @@ class FilterConverter(filters.BaseFilterConverter): ...@@ -229,17 +229,19 @@ class FilterConverter(filters.BaseFilterConverter):
IntSmallerFilter, FilterEmpty, IntInListFilter, IntSmallerFilter, FilterEmpty, IntInListFilter,
IntNotInListFilter) IntNotInListFilter)
float_filters = (FloatEqualFilter, FloatNotEqualFilter, FloatGreaterFilter, float_filters = (FloatEqualFilter, FloatNotEqualFilter, FloatGreaterFilter,
FloatSmallerFilter, FilterEmpty, FloatInListFilter, FloatSmallerFilter, FilterEmpty, FloatInListFilter,
FloatNotInListFilter) FloatNotInListFilter)
bool_filters = (BooleanEqualFilter, BooleanNotEqualFilter) bool_filters = (BooleanEqualFilter, BooleanNotEqualFilter)
datetime_filters = (DateTimeEqualFilter, DateTimeNotEqualFilter, datetime_filters = (DateTimeEqualFilter, DateTimeNotEqualFilter,
DateTimeGreaterFilter, DateTimeSmallerFilter, DateTimeGreaterFilter, DateTimeSmallerFilter,
DateTimeBetweenFilter, DateTimeNotBetweenFilter, DateTimeBetweenFilter, DateTimeNotBetweenFilter,
FilterEmpty) FilterEmpty)
def convert(self, type_name, column, name): def convert(self, type_name, column, name):
if type_name in self.converters: filter_name = type_name.lower()
return self.converters[type_name](column, name)
if filter_name in self.converters:
return self.converters[filter_name](column, name)
return None return None
...@@ -254,11 +256,11 @@ class FilterConverter(filters.BaseFilterConverter): ...@@ -254,11 +256,11 @@ class FilterConverter(filters.BaseFilterConverter):
@filters.convert('IntField', 'LongField') @filters.convert('IntField', 'LongField')
def conv_int(self, column, name): def conv_int(self, column, name):
return [f(column, name) for f in self.int_filters] return [f(column, name) for f in self.int_filters]
@filters.convert('DecimalField', 'FloatField') @filters.convert('DecimalField', 'FloatField')
def conv_float(self, column, name): def conv_float(self, column, name):
return [f(column, name) for f in self.float_filters] return [f(column, name) for f in self.float_filters]
@filters.convert('DateTimeField', 'ComplexDateTimeField') @filters.convert('DateTimeField', 'ComplexDateTimeField')
def conv_datetime(self, column, name): def conv_datetime(self, column, name):
return [f(column, name) for f in self.datetime_filters] return [f(column, name) for f in self.datetime_filters]
...@@ -89,7 +89,7 @@ class FilterEmpty(BasePeeweeFilter, filters.BaseBooleanFilter): ...@@ -89,7 +89,7 @@ class FilterEmpty(BasePeeweeFilter, filters.BaseBooleanFilter):
def operation(self): def operation(self):
return lazy_gettext('empty') return lazy_gettext('empty')
class FilterInList(BasePeeweeFilter): class FilterInList(BasePeeweeFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
...@@ -97,144 +97,144 @@ class FilterInList(BasePeeweeFilter): ...@@ -97,144 +97,144 @@ class FilterInList(BasePeeweeFilter):
def clean(self, value): def clean(self, value):
return [v.strip() for v in value.split(',') if v.strip()] return [v.strip() for v in value.split(',') if v.strip()]
def apply(self, query, value): def apply(self, query, value):
return query.filter(self.column << value) return query.filter(self.column << value)
def operation(self): def operation(self):
return lazy_gettext('in list') return lazy_gettext('in list')
class FilterNotInList(FilterInList): class FilterNotInList(FilterInList):
def apply(self, query, value): def apply(self, query, value):
# NOT IN can exclude NULL values, so "or_ == None" needed to be added # NOT IN can exclude NULL values, so "or_ == None" needed to be added
return query.filter(~(self.column << value) | (self.column >> None)) return query.filter(~(self.column << value) | (self.column >> None))
def operation(self): def operation(self):
return lazy_gettext('not in list') return lazy_gettext('not in list')
# Customized type filters # Customized type filters
class BooleanEqualFilter(FilterEqual, filters.BaseBooleanFilter): class BooleanEqualFilter(FilterEqual, filters.BaseBooleanFilter):
pass pass
class BooleanNotEqualFilter(FilterNotEqual, filters.BaseBooleanFilter): class BooleanNotEqualFilter(FilterNotEqual, filters.BaseBooleanFilter):
pass pass
class IntEqualFilter(FilterEqual, filters.BaseIntFilter): class IntEqualFilter(FilterEqual, filters.BaseIntFilter):
pass pass
class IntNotEqualFilter(FilterNotEqual, filters.BaseIntFilter): class IntNotEqualFilter(FilterNotEqual, filters.BaseIntFilter):
pass pass
class IntGreaterFilter(FilterGreater, filters.BaseIntFilter): class IntGreaterFilter(FilterGreater, filters.BaseIntFilter):
pass pass
class IntSmallerFilter(FilterSmaller, filters.BaseIntFilter): class IntSmallerFilter(FilterSmaller, filters.BaseIntFilter):
pass pass
class IntInListFilter(filters.BaseIntListFilter, FilterInList): class IntInListFilter(filters.BaseIntListFilter, FilterInList):
pass pass
class IntNotInListFilter(filters.BaseIntListFilter, FilterNotInList): class IntNotInListFilter(filters.BaseIntListFilter, FilterNotInList):
pass pass
class FloatEqualFilter(FilterEqual, filters.BaseFloatFilter): class FloatEqualFilter(FilterEqual, filters.BaseFloatFilter):
pass pass
class FloatNotEqualFilter(FilterNotEqual, filters.BaseFloatFilter): class FloatNotEqualFilter(FilterNotEqual, filters.BaseFloatFilter):
pass pass
class FloatGreaterFilter(FilterGreater, filters.BaseFloatFilter): class FloatGreaterFilter(FilterGreater, filters.BaseFloatFilter):
pass pass
class FloatSmallerFilter(FilterSmaller, filters.BaseFloatFilter): class FloatSmallerFilter(FilterSmaller, filters.BaseFloatFilter):
pass pass
class FloatInListFilter(filters.BaseFloatListFilter, FilterInList): class FloatInListFilter(filters.BaseFloatListFilter, FilterInList):
pass pass
class FloatNotInListFilter(filters.BaseFloatListFilter, FilterNotInList): class FloatNotInListFilter(filters.BaseFloatListFilter, FilterNotInList):
pass pass
class DateEqualFilter(FilterEqual, filters.BaseDateFilter): class DateEqualFilter(FilterEqual, filters.BaseDateFilter):
pass pass
class DateNotEqualFilter(FilterNotEqual, filters.BaseDateFilter): class DateNotEqualFilter(FilterNotEqual, filters.BaseDateFilter):
pass pass
class DateGreaterFilter(FilterGreater, filters.BaseDateFilter): class DateGreaterFilter(FilterGreater, filters.BaseDateFilter):
pass pass
class DateSmallerFilter(FilterSmaller, filters.BaseDateFilter): class DateSmallerFilter(FilterSmaller, filters.BaseDateFilter):
pass pass
class DateBetweenFilter(BasePeeweeFilter, filters.BaseDateBetweenFilter): class DateBetweenFilter(BasePeeweeFilter, filters.BaseDateBetweenFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
super(DateBetweenFilter, self).__init__(column, super(DateBetweenFilter, self).__init__(column,
name, name,
options, options,
data_type='daterangepicker') data_type='daterangepicker')
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(self.column.between(start, end)) return query.filter(self.column.between(start, end))
class DateNotBetweenFilter(DateBetweenFilter): class DateNotBetweenFilter(DateBetweenFilter):
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(~(self.column.between(start, end))) return query.filter(~(self.column.between(start, end)))
def operation(self): def operation(self):
return lazy_gettext('not between') return lazy_gettext('not between')
class DateTimeEqualFilter(FilterEqual, filters.BaseDateTimeFilter): class DateTimeEqualFilter(FilterEqual, filters.BaseDateTimeFilter):
pass pass
class DateTimeNotEqualFilter(FilterNotEqual, filters.BaseDateTimeFilter): class DateTimeNotEqualFilter(FilterNotEqual, filters.BaseDateTimeFilter):
pass pass
class DateTimeGreaterFilter(FilterGreater, filters.BaseDateTimeFilter): class DateTimeGreaterFilter(FilterGreater, filters.BaseDateTimeFilter):
pass pass
class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter): class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter):
pass pass
class DateTimeBetweenFilter(BasePeeweeFilter, filters.BaseDateTimeBetweenFilter): class DateTimeBetweenFilter(BasePeeweeFilter, filters.BaseDateTimeBetweenFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
super(DateTimeBetweenFilter, self).__init__(column, super(DateTimeBetweenFilter, self).__init__(column,
name, name,
options, options,
data_type='datetimerangepicker') data_type='datetimerangepicker')
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(self.column.between(start, end)) return query.filter(self.column.between(start, end))
class DateTimeNotBetweenFilter(DateTimeBetweenFilter): class DateTimeNotBetweenFilter(DateTimeBetweenFilter):
def apply(self, query, value): def apply(self, query, value):
...@@ -243,45 +243,45 @@ class DateTimeNotBetweenFilter(DateTimeBetweenFilter): ...@@ -243,45 +243,45 @@ class DateTimeNotBetweenFilter(DateTimeBetweenFilter):
def operation(self): def operation(self):
return lazy_gettext('not between') return lazy_gettext('not between')
class TimeEqualFilter(FilterEqual, filters.BaseTimeFilter): class TimeEqualFilter(FilterEqual, filters.BaseTimeFilter):
pass pass
class TimeNotEqualFilter(FilterNotEqual, filters.BaseTimeFilter): class TimeNotEqualFilter(FilterNotEqual, filters.BaseTimeFilter):
pass pass
class TimeGreaterFilter(FilterGreater, filters.BaseTimeFilter): class TimeGreaterFilter(FilterGreater, filters.BaseTimeFilter):
pass pass
class TimeSmallerFilter(FilterSmaller, filters.BaseTimeFilter): class TimeSmallerFilter(FilterSmaller, filters.BaseTimeFilter):
pass pass
class TimeBetweenFilter(BasePeeweeFilter, filters.BaseTimeBetweenFilter): class TimeBetweenFilter(BasePeeweeFilter, filters.BaseTimeBetweenFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
super(TimeBetweenFilter, self).__init__(column, super(TimeBetweenFilter, self).__init__(column,
name, name,
options, options,
data_type='timerangepicker') data_type='timerangepicker')
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(self.column.between(start, end)) return query.filter(self.column.between(start, end))
class TimeNotBetweenFilter(TimeBetweenFilter): class TimeNotBetweenFilter(TimeBetweenFilter):
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(~(self.column.between(start, end))) return query.filter(~(self.column.between(start, end)))
def operation(self): def operation(self):
return lazy_gettext('not between') return lazy_gettext('not between')
# Base peewee filter field converter # Base peewee filter field converter
class FilterConverter(filters.BaseFilterConverter): class FilterConverter(filters.BaseFilterConverter):
strings = (FilterEqual, FilterNotEqual, FilterLike, FilterNotLike, strings = (FilterEqual, FilterNotEqual, FilterLike, FilterNotLike,
...@@ -290,23 +290,25 @@ class FilterConverter(filters.BaseFilterConverter): ...@@ -290,23 +290,25 @@ class FilterConverter(filters.BaseFilterConverter):
IntSmallerFilter, FilterEmpty, IntInListFilter, IntSmallerFilter, FilterEmpty, IntInListFilter,
IntNotInListFilter) IntNotInListFilter)
float_filters = (FloatEqualFilter, FloatNotEqualFilter, FloatGreaterFilter, float_filters = (FloatEqualFilter, FloatNotEqualFilter, FloatGreaterFilter,
FloatSmallerFilter, FilterEmpty, FloatInListFilter, FloatSmallerFilter, FilterEmpty, FloatInListFilter,
FloatNotInListFilter) FloatNotInListFilter)
bool_filters = (BooleanEqualFilter, BooleanNotEqualFilter) bool_filters = (BooleanEqualFilter, BooleanNotEqualFilter)
date_filters = (DateEqualFilter, DateNotEqualFilter, DateGreaterFilter, date_filters = (DateEqualFilter, DateNotEqualFilter, DateGreaterFilter,
DateSmallerFilter, DateBetweenFilter, DateNotBetweenFilter, DateSmallerFilter, DateBetweenFilter, DateNotBetweenFilter,
FilterEmpty) FilterEmpty)
datetime_filters = (DateTimeEqualFilter, DateTimeNotEqualFilter, datetime_filters = (DateTimeEqualFilter, DateTimeNotEqualFilter,
DateTimeGreaterFilter, DateTimeSmallerFilter, DateTimeGreaterFilter, DateTimeSmallerFilter,
DateTimeBetweenFilter, DateTimeNotBetweenFilter, DateTimeBetweenFilter, DateTimeNotBetweenFilter,
FilterEmpty) FilterEmpty)
time_filters = (TimeEqualFilter, TimeNotEqualFilter, TimeGreaterFilter, time_filters = (TimeEqualFilter, TimeNotEqualFilter, TimeGreaterFilter,
TimeSmallerFilter, TimeBetweenFilter, TimeNotBetweenFilter, TimeSmallerFilter, TimeBetweenFilter, TimeNotBetweenFilter,
FilterEmpty) FilterEmpty)
def convert(self, type_name, column, name): def convert(self, type_name, column, name):
if type_name in self.converters: filter_name = type_name.lower()
return self.converters[type_name](column, name)
if filter_name in self.converters:
return self.converters[filter_name](column, name)
return None return None
...@@ -321,11 +323,11 @@ class FilterConverter(filters.BaseFilterConverter): ...@@ -321,11 +323,11 @@ class FilterConverter(filters.BaseFilterConverter):
@filters.convert('IntegerField', 'BigIntegerField') @filters.convert('IntegerField', 'BigIntegerField')
def conv_int(self, column, name): def conv_int(self, column, name):
return [f(column, name) for f in self.int_filters] return [f(column, name) for f in self.int_filters]
@filters.convert('DecimalField', 'FloatField', 'DoubleField') @filters.convert('DecimalField', 'FloatField', 'DoubleField')
def conv_float(self, column, name): def conv_float(self, column, name):
return [f(column, name) for f in self.float_filters] return [f(column, name) for f in self.float_filters]
@filters.convert('DateField') @filters.convert('DateField')
def conv_date(self, column, name): def conv_date(self, column, name):
return [f(column, name) for f in self.date_filters] return [f(column, name) for f in self.date_filters]
...@@ -333,7 +335,7 @@ class FilterConverter(filters.BaseFilterConverter): ...@@ -333,7 +335,7 @@ class FilterConverter(filters.BaseFilterConverter):
@filters.convert('DateTimeField') @filters.convert('DateTimeField')
def conv_datetime(self, column, name): def conv_datetime(self, column, name):
return [f(column, name) for f in self.datetime_filters] return [f(column, name) for f in self.datetime_filters]
@filters.convert('TimeField') @filters.convert('TimeField')
def conv_time(self, column, name): def conv_time(self, column, name):
return [f(column, name) for f in self.time_filters] return [f(column, name) for f in self.time_filters]
\ No newline at end of file
...@@ -89,7 +89,7 @@ class FilterEmpty(BaseSQLAFilter, filters.BaseBooleanFilter): ...@@ -89,7 +89,7 @@ class FilterEmpty(BaseSQLAFilter, filters.BaseBooleanFilter):
def operation(self): def operation(self):
return lazy_gettext('empty') return lazy_gettext('empty')
class FilterInList(BaseSQLAFilter): class FilterInList(BaseSQLAFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
...@@ -97,145 +97,145 @@ class FilterInList(BaseSQLAFilter): ...@@ -97,145 +97,145 @@ class FilterInList(BaseSQLAFilter):
def clean(self, value): def clean(self, value):
return [v.strip() for v in value.split(',') if v.strip()] return [v.strip() for v in value.split(',') if v.strip()]
def apply(self, query, value): def apply(self, query, value):
return query.filter(self.column.in_(value)) return query.filter(self.column.in_(value))
def operation(self): def operation(self):
return lazy_gettext('in list') return lazy_gettext('in list')
class FilterNotInList(FilterInList): class FilterNotInList(FilterInList):
def apply(self, query, value): def apply(self, query, value):
# NOT IN can exclude NULL values, so "or_ == None" needed to be added # NOT IN can exclude NULL values, so "or_ == None" needed to be added
return query.filter(or_(~self.column.in_(value), self.column == None)) return query.filter(or_(~self.column.in_(value), self.column == None))
def operation(self): def operation(self):
return lazy_gettext('not in list') return lazy_gettext('not in list')
# Customized type filters # Customized type filters
class BooleanEqualFilter(FilterEqual, filters.BaseBooleanFilter): class BooleanEqualFilter(FilterEqual, filters.BaseBooleanFilter):
pass pass
class BooleanNotEqualFilter(FilterNotEqual, filters.BaseBooleanFilter): class BooleanNotEqualFilter(FilterNotEqual, filters.BaseBooleanFilter):
pass pass
class IntEqualFilter(FilterEqual, filters.BaseIntFilter): class IntEqualFilter(FilterEqual, filters.BaseIntFilter):
pass pass
class IntNotEqualFilter(FilterNotEqual, filters.BaseIntFilter): class IntNotEqualFilter(FilterNotEqual, filters.BaseIntFilter):
pass pass
class IntGreaterFilter(FilterGreater, filters.BaseIntFilter): class IntGreaterFilter(FilterGreater, filters.BaseIntFilter):
pass pass
class IntSmallerFilter(FilterSmaller, filters.BaseIntFilter): class IntSmallerFilter(FilterSmaller, filters.BaseIntFilter):
pass pass
class IntInListFilter(filters.BaseIntListFilter, FilterInList): class IntInListFilter(filters.BaseIntListFilter, FilterInList):
pass pass
class IntNotInListFilter(filters.BaseIntListFilter, FilterNotInList): class IntNotInListFilter(filters.BaseIntListFilter, FilterNotInList):
pass pass
class FloatEqualFilter(FilterEqual, filters.BaseFloatFilter): class FloatEqualFilter(FilterEqual, filters.BaseFloatFilter):
pass pass
class FloatNotEqualFilter(FilterNotEqual, filters.BaseFloatFilter): class FloatNotEqualFilter(FilterNotEqual, filters.BaseFloatFilter):
pass pass
class FloatGreaterFilter(FilterGreater, filters.BaseFloatFilter): class FloatGreaterFilter(FilterGreater, filters.BaseFloatFilter):
pass pass
class FloatSmallerFilter(FilterSmaller, filters.BaseFloatFilter): class FloatSmallerFilter(FilterSmaller, filters.BaseFloatFilter):
pass pass
class FloatInListFilter(filters.BaseFloatListFilter, FilterInList): class FloatInListFilter(filters.BaseFloatListFilter, FilterInList):
pass pass
class FloatNotInListFilter(filters.BaseFloatListFilter, FilterNotInList): class FloatNotInListFilter(filters.BaseFloatListFilter, FilterNotInList):
pass pass
class DateEqualFilter(FilterEqual, filters.BaseDateFilter): class DateEqualFilter(FilterEqual, filters.BaseDateFilter):
pass pass
class DateNotEqualFilter(FilterNotEqual, filters.BaseDateFilter): class DateNotEqualFilter(FilterNotEqual, filters.BaseDateFilter):
pass pass
class DateGreaterFilter(FilterGreater, filters.BaseDateFilter): class DateGreaterFilter(FilterGreater, filters.BaseDateFilter):
pass pass
class DateSmallerFilter(FilterSmaller, filters.BaseDateFilter): class DateSmallerFilter(FilterSmaller, filters.BaseDateFilter):
pass pass
class DateBetweenFilter(BaseSQLAFilter, filters.BaseDateBetweenFilter): class DateBetweenFilter(BaseSQLAFilter, filters.BaseDateBetweenFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
super(DateBetweenFilter, self).__init__(column, super(DateBetweenFilter, self).__init__(column,
name, name,
options, options,
data_type='daterangepicker') data_type='daterangepicker')
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(self.column.between(start, end)) return query.filter(self.column.between(start, end))
class DateNotBetweenFilter(DateBetweenFilter): class DateNotBetweenFilter(DateBetweenFilter):
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
# ~between() isn't possible until sqlalchemy 1.0.0 # ~between() isn't possible until sqlalchemy 1.0.0
return query.filter(not_(self.column.between(start, end))) return query.filter(not_(self.column.between(start, end)))
def operation(self): def operation(self):
return lazy_gettext('not between') return lazy_gettext('not between')
class DateTimeEqualFilter(FilterEqual, filters.BaseDateTimeFilter): class DateTimeEqualFilter(FilterEqual, filters.BaseDateTimeFilter):
pass pass
class DateTimeNotEqualFilter(FilterNotEqual, filters.BaseDateTimeFilter): class DateTimeNotEqualFilter(FilterNotEqual, filters.BaseDateTimeFilter):
pass pass
class DateTimeGreaterFilter(FilterGreater, filters.BaseDateTimeFilter): class DateTimeGreaterFilter(FilterGreater, filters.BaseDateTimeFilter):
pass pass
class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter): class DateTimeSmallerFilter(FilterSmaller, filters.BaseDateTimeFilter):
pass pass
class DateTimeBetweenFilter(BaseSQLAFilter, filters.BaseDateTimeBetweenFilter): class DateTimeBetweenFilter(BaseSQLAFilter, filters.BaseDateTimeBetweenFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
super(DateTimeBetweenFilter, self).__init__(column, super(DateTimeBetweenFilter, self).__init__(column,
name, name,
options, options,
data_type='datetimerangepicker') data_type='datetimerangepicker')
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(self.column.between(start, end)) return query.filter(self.column.between(start, end))
class DateTimeNotBetweenFilter(DateTimeBetweenFilter): class DateTimeNotBetweenFilter(DateTimeBetweenFilter):
def apply(self, query, value): def apply(self, query, value):
...@@ -244,45 +244,45 @@ class DateTimeNotBetweenFilter(DateTimeBetweenFilter): ...@@ -244,45 +244,45 @@ class DateTimeNotBetweenFilter(DateTimeBetweenFilter):
def operation(self): def operation(self):
return lazy_gettext('not between') return lazy_gettext('not between')
class TimeEqualFilter(FilterEqual, filters.BaseTimeFilter): class TimeEqualFilter(FilterEqual, filters.BaseTimeFilter):
pass pass
class TimeNotEqualFilter(FilterNotEqual, filters.BaseTimeFilter): class TimeNotEqualFilter(FilterNotEqual, filters.BaseTimeFilter):
pass pass
class TimeGreaterFilter(FilterGreater, filters.BaseTimeFilter): class TimeGreaterFilter(FilterGreater, filters.BaseTimeFilter):
pass pass
class TimeSmallerFilter(FilterSmaller, filters.BaseTimeFilter): class TimeSmallerFilter(FilterSmaller, filters.BaseTimeFilter):
pass pass
class TimeBetweenFilter(BaseSQLAFilter, filters.BaseTimeBetweenFilter): class TimeBetweenFilter(BaseSQLAFilter, filters.BaseTimeBetweenFilter):
def __init__(self, column, name, options=None, data_type=None): def __init__(self, column, name, options=None, data_type=None):
super(TimeBetweenFilter, self).__init__(column, super(TimeBetweenFilter, self).__init__(column,
name, name,
options, options,
data_type='timerangepicker') data_type='timerangepicker')
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(self.column.between(start, end)) return query.filter(self.column.between(start, end))
class TimeNotBetweenFilter(TimeBetweenFilter): class TimeNotBetweenFilter(TimeBetweenFilter):
def apply(self, query, value): def apply(self, query, value):
start, end = value start, end = value
return query.filter(not_(self.column.between(start, end))) return query.filter(not_(self.column.between(start, end)))
def operation(self): def operation(self):
return lazy_gettext('not between') return lazy_gettext('not between')
# Base SQLA filter field converter # Base SQLA filter field converter
class FilterConverter(filters.BaseFilterConverter): class FilterConverter(filters.BaseFilterConverter):
strings = (FilterEqual, FilterNotEqual, FilterLike, FilterNotLike, strings = (FilterEqual, FilterNotEqual, FilterLike, FilterNotLike,
...@@ -291,7 +291,7 @@ class FilterConverter(filters.BaseFilterConverter): ...@@ -291,7 +291,7 @@ class FilterConverter(filters.BaseFilterConverter):
IntSmallerFilter, FilterEmpty, IntInListFilter, IntSmallerFilter, FilterEmpty, IntInListFilter,
IntNotInListFilter) IntNotInListFilter)
float_filters = (FloatEqualFilter, FloatNotEqualFilter, FloatGreaterFilter, float_filters = (FloatEqualFilter, FloatNotEqualFilter, FloatGreaterFilter,
FloatSmallerFilter, FilterEmpty, FloatInListFilter, FloatSmallerFilter, FilterEmpty, FloatInListFilter,
FloatNotInListFilter) FloatNotInListFilter)
bool_filters = (BooleanEqualFilter, BooleanNotEqualFilter) bool_filters = (BooleanEqualFilter, BooleanNotEqualFilter)
enum = (FilterEqual, FilterNotEqual, FilterEmpty, FilterInList, enum = (FilterEqual, FilterNotEqual, FilterEmpty, FilterInList,
...@@ -306,43 +306,46 @@ class FilterConverter(filters.BaseFilterConverter): ...@@ -306,43 +306,46 @@ class FilterConverter(filters.BaseFilterConverter):
time_filters = (TimeEqualFilter, TimeNotEqualFilter, TimeGreaterFilter, time_filters = (TimeEqualFilter, TimeNotEqualFilter, TimeGreaterFilter,
TimeSmallerFilter, TimeBetweenFilter, TimeNotBetweenFilter, TimeSmallerFilter, TimeBetweenFilter, TimeNotBetweenFilter,
FilterEmpty) FilterEmpty)
def convert(self, type_name, column, name, **kwargs): def convert(self, type_name, column, name, **kwargs):
if type_name.lower() in self.converters: filter_name = type_name.lower()
return self.converters[type_name.lower()](column, name, **kwargs)
if filter_name in self.converters:
return self.converters[filter_name](column, name, **kwargs)
return None return None
@filters.convert('string', 'char', 'unicode', 'varchar', 'tinytext', @filters.convert('string', 'char', 'unicode', 'varchar', 'tinytext',
'text', 'mediumtext', 'longtext', 'unicodetext', 'text', 'mediumtext', 'longtext', 'unicodetext',
'nchar', 'nvarchar', 'ntext') 'nchar', 'nvarchar', 'ntext')
def conv_string(self, column, name, **kwargs): def conv_string(self, column, name, **kwargs):
return [f(column, name, **kwargs) for f in self.strings] return [f(column, name, **kwargs) for f in self.strings]
@filters.convert('boolean', 'tinyint') @filters.convert('boolean', 'tinyint')
def conv_bool(self, column, name, **kwargs): def conv_bool(self, column, name, **kwargs):
return [f(column, name, **kwargs) for f in self.bool_filters] return [f(column, name, **kwargs) for f in self.bool_filters]
@filters.convert('int', 'integer', 'smallinteger', 'smallint', 'numeric', @filters.convert('int', 'integer', 'smallinteger', 'smallint', 'numeric',
'biginteger', 'bigint', 'mediumint') 'biginteger', 'bigint', 'mediumint')
def conv_int(self, column, name, **kwargs): def conv_int(self, column, name, **kwargs):
return [f(column, name, **kwargs) for f in self.int_filters] return [f(column, name, **kwargs) for f in self.int_filters]
@filters.convert('float', 'real', 'decimal', 'double_precision', 'double') @filters.convert('float', 'real', 'decimal', 'double_precision', 'double')
def conv_float(self, column, name, **kwargs): def conv_float(self, column, name, **kwargs):
return [f(column, name, **kwargs) for f in self.float_filters] return [f(column, name, **kwargs) for f in self.float_filters]
@filters.convert('date') @filters.convert('date')
def conv_date(self, column, name, **kwargs): def conv_date(self, column, name, **kwargs):
return [f(column, name, **kwargs) for f in self.date_filters] return [f(column, name, **kwargs) for f in self.date_filters]
@filters.convert('datetime', 'datetime2', 'timestamp', 'smalldatetime') @filters.convert('datetime', 'datetime2', 'timestamp', 'smalldatetime')
def conv_datetime(self, column, name, **kwargs): def conv_datetime(self, column, name, **kwargs):
return [f(column, name, **kwargs) for f in self.datetime_filters] return [f(column, name, **kwargs) for f in self.datetime_filters]
@filters.convert('time') @filters.convert('time')
def conv_time(self, column, name, **kwargs): def conv_time(self, column, name, **kwargs):
return [f(column, name, **kwargs) for f in self.time_filters] return [f(column, name, **kwargs) for f in self.time_filters]
@filters.convert('enum') @filters.convert('enum')
def conv_enum(self, column, name, options=None, **kwargs): def conv_enum(self, column, name, options=None, **kwargs):
if not options: if not options:
......
...@@ -48,7 +48,7 @@ class BaseFilter(object): ...@@ -48,7 +48,7 @@ class BaseFilter(object):
Validate value. Validate value.
If value is valid, returns `True` and `False` otherwise. If value is valid, returns `True` and `False` otherwise.
:param value: :param value:
Value to validate Value to validate
""" """
...@@ -102,7 +102,7 @@ class BaseBooleanFilter(BaseFilter): ...@@ -102,7 +102,7 @@ class BaseBooleanFilter(BaseFilter):
def validate(self, value): def validate(self, value):
return value in ('0', '1') return value in ('0', '1')
class BaseIntFilter(BaseFilter): class BaseIntFilter(BaseFilter):
""" """
...@@ -110,7 +110,7 @@ class BaseIntFilter(BaseFilter): ...@@ -110,7 +110,7 @@ class BaseIntFilter(BaseFilter):
""" """
def clean(self, value): def clean(self, value):
return int(float(value)) return int(float(value))
class BaseFloatFilter(BaseFilter): class BaseFloatFilter(BaseFilter):
""" """
...@@ -118,7 +118,7 @@ class BaseFloatFilter(BaseFilter): ...@@ -118,7 +118,7 @@ class BaseFloatFilter(BaseFilter):
""" """
def clean(self, value): def clean(self, value):
return float(value) return float(value)
class BaseIntListFilter(BaseFilter): class BaseIntListFilter(BaseFilter):
""" """
...@@ -126,7 +126,7 @@ class BaseIntListFilter(BaseFilter): ...@@ -126,7 +126,7 @@ class BaseIntListFilter(BaseFilter):
""" """
def clean(self, value): def clean(self, value):
return [int(float(v.strip())) for v in value.split(',') if v.strip()] return [int(float(v.strip())) for v in value.split(',') if v.strip()]
class BaseFloatListFilter(BaseFilter): class BaseFloatListFilter(BaseFilter):
""" """
...@@ -134,7 +134,7 @@ class BaseFloatListFilter(BaseFilter): ...@@ -134,7 +134,7 @@ class BaseFloatListFilter(BaseFilter):
""" """
def clean(self, value): def clean(self, value):
return [float(v.strip()) for v in value.split(',') if v.strip()] return [float(v.strip()) for v in value.split(',') if v.strip()]
class BaseDateFilter(BaseFilter): class BaseDateFilter(BaseFilter):
""" """
...@@ -144,10 +144,10 @@ class BaseDateFilter(BaseFilter): ...@@ -144,10 +144,10 @@ class BaseDateFilter(BaseFilter):
super(BaseDateFilter, self).__init__(name, super(BaseDateFilter, self).__init__(name,
options, options,
data_type='datepicker') data_type='datepicker')
def clean(self, value): def clean(self, value):
return datetime.datetime.strptime(value, '%Y-%m-%d').date() return datetime.datetime.strptime(value, '%Y-%m-%d').date()
class BaseDateBetweenFilter(BaseFilter): class BaseDateBetweenFilter(BaseFilter):
""" """
...@@ -163,16 +163,16 @@ class BaseDateBetweenFilter(BaseFilter): ...@@ -163,16 +163,16 @@ class BaseDateBetweenFilter(BaseFilter):
def validate(self, value): def validate(self, value):
try: try:
value = [datetime.datetime.strptime(range, '%Y-%m-%d') value = [datetime.datetime.strptime(range, '%Y-%m-%d')
for range in value.split(' to ')] for range in value.split(' to ')]
# if " to " is missing, fail validation # if " to " is missing, fail validation
# sqlalchemy's .between() will not work if end date is before start date # sqlalchemy's .between() will not work if end date is before start date
if (len(value) == 2) and (value[0] <= value[1]): if (len(value) == 2) and (value[0] <= value[1]):
return True return True
else: else:
return False return False
except ValueError: except ValueError:
return False return False
class BaseDateTimeFilter(BaseFilter): class BaseDateTimeFilter(BaseFilter):
...@@ -183,27 +183,27 @@ class BaseDateTimeFilter(BaseFilter): ...@@ -183,27 +183,27 @@ class BaseDateTimeFilter(BaseFilter):
super(BaseDateTimeFilter, self).__init__(name, super(BaseDateTimeFilter, self).__init__(name,
options, options,
data_type='datetimepicker') data_type='datetimepicker')
def clean(self, value): def clean(self, value):
# datetime filters will not work in SQLite + SQLAlchemy if value not converted to datetime # datetime filters will not work in SQLite + SQLAlchemy if value not converted to datetime
return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S') return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S')
class BaseDateTimeBetweenFilter(BaseFilter): class BaseDateTimeBetweenFilter(BaseFilter):
""" """
Base DateTime Between filter. Consolidates logic for validation and clean. Base DateTime Between filter. Consolidates logic for validation and clean.
Apply method is different for each back-end. Apply method is different for each back-end.
""" """
def clean(self, value): def clean(self, value):
return [datetime.datetime.strptime(range, '%Y-%m-%d %H:%M:%S') return [datetime.datetime.strptime(range, '%Y-%m-%d %H:%M:%S')
for range in value.split(' to ')] for range in value.split(' to ')]
def operation(self): def operation(self):
return lazy_gettext('between') return lazy_gettext('between')
def validate(self, value): def validate(self, value):
try: try:
value = [datetime.datetime.strptime(range, '%Y-%m-%d %H:%M:%S') value = [datetime.datetime.strptime(range, '%Y-%m-%d %H:%M:%S')
for range in value.split(' to ')] for range in value.split(' to ')]
if (len(value) == 2) and (value[0] <= value[1]): if (len(value) == 2) and (value[0] <= value[1]):
return True return True
...@@ -211,7 +211,7 @@ class BaseDateTimeBetweenFilter(BaseFilter): ...@@ -211,7 +211,7 @@ class BaseDateTimeBetweenFilter(BaseFilter):
return False return False
except ValueError: except ValueError:
return False return False
class BaseTimeFilter(BaseFilter): class BaseTimeFilter(BaseFilter):
""" """
...@@ -221,14 +221,14 @@ class BaseTimeFilter(BaseFilter): ...@@ -221,14 +221,14 @@ class BaseTimeFilter(BaseFilter):
super(BaseTimeFilter, self).__init__(name, super(BaseTimeFilter, self).__init__(name,
options, options,
data_type='timepicker') data_type='timepicker')
def clean(self, value): def clean(self, value):
# time filters will not work in SQLite + SQLAlchemy if value not converted to time # time filters will not work in SQLite + SQLAlchemy if value not converted to time
timetuple = time.strptime(value, '%H:%M:%S') timetuple = time.strptime(value, '%H:%M:%S')
return datetime.time(timetuple.tm_hour, return datetime.time(timetuple.tm_hour,
timetuple.tm_min, timetuple.tm_min,
timetuple.tm_sec) timetuple.tm_sec)
class BaseTimeBetweenFilter(BaseFilter): class BaseTimeBetweenFilter(BaseFilter):
""" """
...@@ -236,7 +236,7 @@ class BaseTimeBetweenFilter(BaseFilter): ...@@ -236,7 +236,7 @@ class BaseTimeBetweenFilter(BaseFilter):
Apply method is different for each back-end. Apply method is different for each back-end.
""" """
def clean(self, value): def clean(self, value):
timetuples = [time.strptime(range, '%H:%M:%S') timetuples = [time.strptime(range, '%H:%M:%S')
for range in value.split(' to ')] for range in value.split(' to ')]
return [datetime.time(timetuple.tm_hour, return [datetime.time(timetuple.tm_hour,
timetuple.tm_min, timetuple.tm_min,
...@@ -248,7 +248,7 @@ class BaseTimeBetweenFilter(BaseFilter): ...@@ -248,7 +248,7 @@ class BaseTimeBetweenFilter(BaseFilter):
def validate(self, value): def validate(self, value):
try: try:
timetuples = [time.strptime(range, '%H:%M:%S') timetuples = [time.strptime(range, '%H:%M:%S')
for range in value.split(' to ')] for range in value.split(' to ')]
if (len(timetuples) == 2) and (timetuples[0] <= timetuples[1]): if (len(timetuples) == 2) and (timetuples[0] <= timetuples[1]):
return True return True
...@@ -257,7 +257,7 @@ class BaseTimeBetweenFilter(BaseFilter): ...@@ -257,7 +257,7 @@ class BaseTimeBetweenFilter(BaseFilter):
except ValueError: except ValueError:
raise raise
return False return False
def convert(*args): def convert(*args):
""" """
...@@ -266,7 +266,7 @@ def convert(*args): ...@@ -266,7 +266,7 @@ def convert(*args):
See :mod:`flask.ext.admin.contrib.sqla.filters` for usage example. See :mod:`flask.ext.admin.contrib.sqla.filters` for usage example.
""" """
def _inner(func): def _inner(func):
func._converter_for = args func._converter_for = map(str.lower, args)
return func return func
return _inner return _inner
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment