implement simple backend search for items and tickets
This commit is contained in:
parent
797ea3ae12
commit
72ff5aea12
6 changed files with 160 additions and 9 deletions
|
@ -6,7 +6,9 @@ from rest_framework.response import Response
|
|||
from rest_framework.permissions import IsAuthenticated
|
||||
|
||||
from inventory.models import Event, Container, Item
|
||||
from inventory.serializers import EventSerializer, ContainerSerializer, ItemSerializer
|
||||
from inventory.serializers import EventSerializer, ContainerSerializer, ItemSerializer, SearchResultSerializer
|
||||
|
||||
from base64 import b64decode
|
||||
|
||||
|
||||
class EventViewSet(viewsets.ModelViewSet):
|
||||
|
@ -20,18 +22,26 @@ class ContainerViewSet(viewsets.ModelViewSet):
|
|||
queryset = Container.objects.all()
|
||||
|
||||
|
||||
def filter_items(items, query):
|
||||
query_tokens = query.split(' ')
|
||||
for item in items:
|
||||
value = 0
|
||||
for token in query_tokens:
|
||||
if token in item.description:
|
||||
value += 1
|
||||
if value > 0:
|
||||
yield {'search_score': value, 'item': item}
|
||||
|
||||
|
||||
@api_view(['GET'])
|
||||
@permission_classes([IsAuthenticated])
|
||||
@permission_required('view_item', raise_exception=True)
|
||||
def search_items(request, event_slug, query):
|
||||
try:
|
||||
event = Event.objects.get(slug=event_slug)
|
||||
query_tokens = query.split(' ')
|
||||
q = Item.objects.filter(event=event)
|
||||
for token in query_tokens:
|
||||
if token:
|
||||
q = q.filter(description__icontains=token)
|
||||
return Response(ItemSerializer(q, many=True).data)
|
||||
if not request.user.has_event_perm(event, 'view_item'):
|
||||
return Response(status=403)
|
||||
items = filter_items(Item.objects.filter(event=event), b64decode(query).decode('utf-8'))
|
||||
return Response(SearchResultSerializer(items, many=True).data)
|
||||
except Event.DoesNotExist:
|
||||
return Response(status=404)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue