From 28d64a4ef8f83a2f7e40bf68a3f0dbb387c4316b Mon Sep 17 00:00:00 2001 From: Greg Newman Date: Fri, 10 Feb 2023 11:04:33 -0500 Subject: [PATCH 1/3] :tractor: WIP working search * Bootstrapped API viewset to search libraries * Updated templates * Added htmx for search * Search results template to display results Issue: #88 --- config/urls.py | 2 + libraries/api.py | 50 +++++++++++++++++++ package.json | 1 + templates/base.html | 1 + .../includes/search_command_palatte.html | 29 ++++++----- .../libraries/includes/search_results.html | 14 ++++++ templates/libraries/list.html | 2 +- yarn.lock | 5 ++ 8 files changed, 88 insertions(+), 16 deletions(-) create mode 100644 libraries/api.py create mode 100644 templates/libraries/includes/search_results.html diff --git a/config/urls.py b/config/urls.py index 3537a9b1..81c23aa4 100755 --- a/config/urls.py +++ b/config/urls.py @@ -21,6 +21,7 @@ from libraries.views import ( LibraryByCategory, LibraryDetail, ) +from libraries.api import LibrarySearchView from support.views import SupportView, ContactView from versions.api import VersionViewSet from versions.views import VersionList, VersionDetail @@ -29,6 +30,7 @@ router = routers.SimpleRouter() router.register(r"users", UserViewSet, basename="users") router.register(r"versions", VersionViewSet, basename="versions") +router.register(r"libraries", LibrarySearchView, basename="libraries") urlpatterns = [ diff --git a/libraries/api.py b/libraries/api.py new file mode 100644 index 00000000..edb5db51 --- /dev/null +++ b/libraries/api.py @@ -0,0 +1,50 @@ +from django.db.models import Q + +from rest_framework import permissions +from rest_framework import viewsets +from rest_framework import serializers +from rest_framework import renderers +from rest_framework.response import Response + +from .models import Library + + +class LibrarySearchSerializer(serializers.ModelSerializer): + + class Meta: + model = Library + fields = ( + "name", + "description", + ) + + +class LibrarySearchView(viewsets.ModelViewSet): + model = Library + serializer_class = LibrarySearchSerializer + permission_classes = [permissions.AllowAny] + queryset = Library.objects.all() + renderer_classes = (renderers.TemplateHTMLRenderer, ) + + def filter_queryset(self, queryset): + """ + This view should return a list of all the libraries that + match the search params limited to 5 results + """ + value = self.request.query_params.get("q") + f = ( + Q(name__icontains=value) + | Q(description__icontains=value) + | Q(categories__name__icontains=value) + | Q(authors__first_name__icontains=value) + | Q(authors__last_name__icontains=value) + ) + return Library.objects.filter(f)[:5] + + def list(self, request, *args, **kwargs): + queryset = self.filter_queryset(self.get_queryset()) + serializer = self.get_serializer(queryset, many=True) + return Response( + {"libraries": serializer.data}, + template_name="libraries/includes/search_results.html" + ) diff --git a/package.json b/package.json index 9deed485..1e26a8ea 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "alpinejs": "^3.10.2", "autoprefixer": "^10.4.12", "cssnano": "^5.1.14", + "htmx": "^0.0.2", "tailwindcss": "^3.2.1" } } diff --git a/templates/base.html b/templates/base.html index 0a314e62..edfe7f88 100644 --- a/templates/base.html +++ b/templates/base.html @@ -16,6 +16,7 @@ + {% block extra_head %}{% endblock %}