Add special "equal to any of" verb for UPC-related grid filters

This commit is contained in:
Lance Edgar 2021-02-12 14:05:44 -06:00
parent 89f0336af9
commit 34623a7307

View file

@ -130,6 +130,7 @@ class GridFilter(object):
'is_any': "is any", 'is_any': "is any",
'equal': "equal to", 'equal': "equal to",
'not_equal': "not equal to", 'not_equal': "not equal to",
'equal_any_of': "equal to any of",
'greater_than': "greater than", 'greater_than': "greater than",
'greater_equal': "greater than or equal to", 'greater_equal': "greater than or equal to",
'less_than': "less than", 'less_than': "less than",
@ -164,6 +165,7 @@ class GridFilter(object):
] ]
multiple_value_verbs = [ multiple_value_verbs = [
'equal_any_of',
'contains_any_of', 'contains_any_of',
] ]
@ -919,7 +921,7 @@ class AlchemyGPCFilter(AlchemyGridFilter):
""" """
GPC filter for SQLAlchemy. GPC filter for SQLAlchemy.
""" """
default_verbs = ['equal', 'not_equal'] default_verbs = ['equal', 'not_equal', 'equal_any_of']
def filter_equal(self, query, value): def filter_equal(self, query, value):
""" """
@ -961,6 +963,47 @@ class AlchemyGPCFilter(AlchemyGridFilter):
except ValueError: except ValueError:
return query return query
def filter_equal_any_of(self, query, value):
"""
This filter expects "multiple values" separated by newline character,
and will add an "OR" condition with each value being checked via
"ILIKE". For instance if the user submits a "value" like this:
.. code-block:: none
07430500132
07430500116
This will result in SQL condition like this:
.. code-block:: sql
(upc IN (7430500132, 74305001321)) OR (upc IN (7430500116, 74305001161))
"""
if not value:
return query
values = value.split('\n')
values = [value for value in values if value]
if not values:
return query
conditions = []
for value in values:
try:
clause = self.column.in_((
GPC(value),
GPC(value, calc_check_digit='upc')))
except ValueError:
pass
else:
conditions.append(clause)
if not conditions:
return query
return query.filter(sa.or_(*conditions))
class AlchemyPhoneNumberFilter(AlchemyStringFilter): class AlchemyPhoneNumberFilter(AlchemyStringFilter):
""" """