Add custom grid filter for phone number fields
and use it in various grid views
This commit is contained in:
parent
2bdcc4fe47
commit
ec70d85638
6 changed files with 63 additions and 13 deletions
|
@ -26,6 +26,7 @@ Grid Filters
|
|||
|
||||
from __future__ import unicode_literals, absolute_import
|
||||
|
||||
import re
|
||||
import datetime
|
||||
import logging
|
||||
|
||||
|
@ -765,6 +766,45 @@ class AlchemyGPCFilter(AlchemyGridFilter):
|
|||
return query
|
||||
|
||||
|
||||
class AlchemyPhoneNumberFilter(AlchemyStringFilter):
|
||||
"""
|
||||
Special string filter, with logic to deal with phone numbers.
|
||||
"""
|
||||
|
||||
def parse_value(self, value):
|
||||
newvalue = None
|
||||
|
||||
# first we try to split according to typical 7- or 10-digit number
|
||||
digits = re.sub(r'\D', '', value or '')
|
||||
if len(digits) == 7:
|
||||
newvalue = "{} {}".format(digits[:3], digits[3:])
|
||||
elif len(digits) == 10:
|
||||
newvalue = "{} {} {}".format(digits[:3], digits[3:6], digits[6:])
|
||||
|
||||
# if that didn't work, we can also try to split by grouped digits
|
||||
if not newvalue and value:
|
||||
parts = re.split(r'\D+', value)
|
||||
newvalue = ' '.join(parts)
|
||||
|
||||
return newvalue or value
|
||||
|
||||
def filter_contains(self, query, value):
|
||||
"""
|
||||
Try to parse the value into "parts" of a phone number, then do a normal
|
||||
'ILIKE' query with those parts.
|
||||
"""
|
||||
value = self.parse_value(value)
|
||||
return super(AlchemyPhoneNumberFilter, self).filter_contains(query, value)
|
||||
|
||||
def filter_does_not_contain(self, query, value):
|
||||
"""
|
||||
Try to parse the value into "parts" of a phone number, then do a normal
|
||||
'NOT ILIKE' query with those parts.
|
||||
"""
|
||||
value = self.parse_value(value)
|
||||
return super(AlchemyPhoneNumberFilter, self).filter_does_not_contain(query, value)
|
||||
|
||||
|
||||
class GridFilterSet(OrderedDict):
|
||||
"""
|
||||
Collection class for :class:`GridFilter` instances.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue