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 %}