diff --git a/config/urls.py b/config/urls.py index bccc0f0c..6c784700 100755 --- a/config/urls.py +++ b/config/urls.py @@ -20,6 +20,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 @@ -28,6 +29,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..55d93ca5 --- /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", + "slug", + ) + + +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 %}