Improve default autocomplete query logic, w/ multiple ILIKE
e.g. to search for customer first and/or last name
This commit is contained in:
parent
e6a92c5667
commit
fbd12c7dfc
|
@ -1,8 +1,8 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8; -*-
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# Rattail -- Retail Software Framework
|
# Rattail -- Retail Software Framework
|
||||||
# Copyright © 2010-2017 Lance Edgar
|
# Copyright © 2010-2021 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Rattail.
|
# This file is part of Rattail.
|
||||||
#
|
#
|
||||||
|
@ -26,6 +26,8 @@ Autocomplete View
|
||||||
|
|
||||||
from __future__ import unicode_literals, absolute_import
|
from __future__ import unicode_literals, absolute_import
|
||||||
|
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from tailbone.views.core import View
|
from tailbone.views.core import View
|
||||||
from tailbone.db import Session
|
from tailbone.db import Session
|
||||||
|
|
||||||
|
@ -45,11 +47,24 @@ class AutocompleteView(View):
|
||||||
return q
|
return q
|
||||||
|
|
||||||
def make_query(self, term):
|
def make_query(self, term):
|
||||||
q = Session.query(self.mapped_class)
|
"""
|
||||||
q = self.filter_query(q)
|
Make and return the "complete" query for the given search term.
|
||||||
q = q.filter(getattr(self.mapped_class, self.fieldname).ilike('%%%s%%' % term))
|
"""
|
||||||
q = q.order_by(getattr(self.mapped_class, self.fieldname))
|
# we are querying one table (and column) primarily
|
||||||
return q
|
query = Session.query(self.mapped_class)
|
||||||
|
column = getattr(self.mapped_class, self.fieldname)
|
||||||
|
|
||||||
|
# filter according to business logic, if applicable
|
||||||
|
query = self.filter_query(query)
|
||||||
|
|
||||||
|
# filter according to search term(s)
|
||||||
|
criteria = [column.ilike('%{}%'.format(word))
|
||||||
|
for word in term.split()]
|
||||||
|
query = query.filter(sa.and_(*criteria))
|
||||||
|
|
||||||
|
# sort results by something meaningful
|
||||||
|
query = query.order_by(column)
|
||||||
|
return query
|
||||||
|
|
||||||
def query(self, term):
|
def query(self, term):
|
||||||
return self.make_query(term)
|
return self.make_query(term)
|
||||||
|
|
Loading…
Reference in a new issue