Add experimental soundex filter support to the Customers grid.
This commit is contained in:
parent
8f1e34c73c
commit
54bb9e2869
|
@ -1,9 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2012 Lance Edgar
|
||||
# Copyright © 2010-2014 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -26,7 +25,7 @@
|
|||
Grid Search Filters
|
||||
"""
|
||||
|
||||
from sqlalchemy import or_
|
||||
from sqlalchemy import func, or_
|
||||
|
||||
from webhelpers.html import tags
|
||||
from webhelpers.html import literal
|
||||
|
@ -55,6 +54,8 @@ class SearchFilter(Object):
|
|||
('nt', "is not"),
|
||||
('lk', "contains"),
|
||||
('nl', "doesn't contain"),
|
||||
(u'sx', u"sounds like"),
|
||||
(u'nx', u"doesn't sound like"),
|
||||
]
|
||||
options = []
|
||||
filter_map = self.search.filter_map[self.name]
|
||||
|
@ -179,6 +180,34 @@ def filter_ilike(field):
|
|||
return {'lk': ilike, 'nl': not_ilike}
|
||||
|
||||
|
||||
def filter_soundex(field):
|
||||
"""
|
||||
Returns a filter map entry which leverages the `soundex()` SQL function.
|
||||
"""
|
||||
|
||||
def soundex(query, value):
|
||||
if value:
|
||||
query = query.filter(func.soundex(field) == func.soundex(value))
|
||||
return query
|
||||
|
||||
def not_soundex(query, value):
|
||||
if value:
|
||||
query = query.filter(func.soundex(field) != func.soundex(value))
|
||||
return query
|
||||
|
||||
return {u'sx': soundex, u'nx': not_soundex}
|
||||
|
||||
|
||||
def filter_ilike_and_soundex(field):
|
||||
"""
|
||||
Returns a filter map which provides both the `ilike` and `soundex`
|
||||
features.
|
||||
"""
|
||||
filters = filter_ilike(field)
|
||||
filters.update(filter_soundex(field))
|
||||
return filters
|
||||
|
||||
|
||||
def get_filter_config(prefix, request, filter_map, **kwargs):
|
||||
"""
|
||||
Returns a configuration dictionary for a search form.
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2012 Lance Edgar
|
||||
# Copyright © 2010-2014 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -58,7 +57,7 @@ class CustomersGrid(SearchableAlchemyGridView):
|
|||
def filter_map(self):
|
||||
return self.make_filter_map(
|
||||
exact=['id'],
|
||||
ilike=['name'],
|
||||
name=self.filter_ilike_and_soundex(model.Customer.name),
|
||||
email=self.filter_ilike(model.CustomerEmailAddress.address),
|
||||
phone=self.filter_ilike(model.CustomerPhoneNumber.number))
|
||||
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2012 Lance Edgar
|
||||
# Copyright © 2010-2014 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -139,6 +138,12 @@ class SearchableAlchemyGridView(PagedAlchemyGridView):
|
|||
def filter_ilike(self, field):
|
||||
return grids.search.filter_ilike(field)
|
||||
|
||||
def filter_soundex(self, field):
|
||||
return grids.search.filter_soundex(field)
|
||||
|
||||
def filter_ilike_and_soundex(self, field):
|
||||
return grids.search.filter_ilike_and_soundex(field)
|
||||
|
||||
def make_filter_map(self, **kwargs):
|
||||
return grids.search.get_filter_map(self.mapped_class, **kwargs)
|
||||
|
||||
|
|
Loading…
Reference in a new issue