Add some API views for receiving, and vendor autocomplete

lots more to do yet, for those...
This commit is contained in:
Lance Edgar 2019-11-12 11:55:28 -06:00
parent afdd294c60
commit 3514c4050e
7 changed files with 409 additions and 130 deletions

View file

@ -27,6 +27,7 @@ Tailbone Web API - Master View
from __future__ import unicode_literals, absolute_import
import json
import six
from rattail.config import parse_bool
@ -364,3 +365,55 @@ class APIMasterView(APIView):
# that's all we can do here, subclass must override if more needed
return obj
##############################
# autocomplete
##############################
def autocomplete(self):
term = self.request.params.get('term', '').strip()
term = self.prepare_autocomplete_term(term)
if not term:
return []
results = self.get_autocomplete_data(term)
return [{'label': self.autocomplete_display(x),
'value': self.autocomplete_value(x)}
for x in results]
@property
def autocomplete_fieldname(self):
raise NotImplementedError("You must define `autocomplete_fieldname` "
"attribute for API view class: {}".format(
self.__class__))
def autocomplete_display(self, obj):
return getattr(obj, self.autocomplete_fieldname)
def autocomplete_value(self, obj):
return obj.uuid
def get_autocomplete_data(self, term):
query = self.make_autocomplete_query(term)
return query.all()
def make_autocomplete_query(self, term):
model_class = self.get_model_class()
query = self.Session.query(model_class)
query = self.filter_autocomplete_query(query)
field = getattr(model_class, self.autocomplete_fieldname)
query = query.filter(field.ilike('%%%s%%' % term))\
.order_by(field)
return query
def filter_autocomplete_query(self, query):
return query
def prepare_autocomplete_term(self, term):
"""
If necessary, massage the incoming search term for use with the
autocomplete query.
"""
return term