Skip to content

Commit

Permalink
Add random sorting and filtering for cards
Browse files Browse the repository at this point in the history
  • Loading branch information
ldeluigi committed Jun 16, 2023
1 parent c2606dd commit ede4dca
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
2 changes: 2 additions & 0 deletions backend/spellbook/views/cards.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from rest_framework import viewsets
from spellbook.models import Card
from spellbook.serializers import CardDetailSerializer
from .query_filters import CardQueryFilter


class CardViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Card.objects.prefetch_related(
'features',
)
serializer_class = CardDetailSerializer
filter_backends = [CardQueryFilter]
20 changes: 18 additions & 2 deletions backend/spellbook/views/query_filters.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
from django.db.models import QuerySet
from django.template import loader
from rest_framework import filters
from django.utils.encoding import force_str
from spellbook.parsers import variants_query_parser, NotSupportedError


class SpellbookQueryFilter(filters.BaseFilterBackend):
class AbstractQueryFilter(filters.BaseFilterBackend):
search_param = 'q'
template = 'rest_framework/filters/search.html'
search_title = 'Search'
search_description = 'A search query.'

def query_parser(self, queryset: QuerySet, search_terms: str):
raise NotImplementedError

def get_search_terms(self, request) -> str:
"""
Search terms are set by a ?q=... query parameter,
Expand All @@ -23,7 +27,7 @@ def filter_queryset(self, request, queryset, view):
search_terms = self.get_search_terms(request)

try:
queryset = variants_query_parser(queryset, search_terms)
queryset = self.query_parser(queryset, search_terms)
return queryset
except NotSupportedError:
return queryset.none()
Expand All @@ -50,3 +54,15 @@ def get_schema_operation_parameters(self, view):
},
},
]


class SpellbookQueryFilter(AbstractQueryFilter):
def query_parser(self, queryset, search_terms):
return variants_query_parser(queryset, search_terms)


class CardQueryFilter(AbstractQueryFilter):
def query_parser(self, queryset, search_terms):
if search_terms == '?':
return queryset.order_by('?')
return queryset.filter(name__icontains=search_terms)

0 comments on commit ede4dca

Please sign in to comment.