search
authorRadek Czajka <rczajka@rczajka.pl>
Wed, 6 Aug 2025 10:48:00 +0000 (12:48 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Wed, 6 Aug 2025 10:48:00 +0000 (12:48 +0200)
src/catalogue/api/serializers.py
src/catalogue/api/urls2.py
src/catalogue/api/views.py
src/search/api/views.py

index 8968bf6..9c70a9f 100644 (file)
@@ -117,6 +117,18 @@ class KindSerializer(KindItemSerializer):
             'collective_noun',
         ]
 
+class ThemeSerializer(serializers.ModelSerializer):
+    url = AbsoluteURLField()
+    href = AbsoluteURLField(
+        view_name='catalogue_api_theme',
+        view_args=('slug',)
+    )
+    class Meta:
+        model = Tag
+        fields = [
+            'url', 'href', 'name', 'slug', 'sort_key', 'description',
+        ]
+
 
 class TranslatorSerializer(serializers.Serializer):
     name = serializers.CharField(source='*')
index f06ecdf..29d4a3a 100644 (file)
@@ -56,4 +56,10 @@ urlpatterns = [
     path('genres/<slug:slug>/',
          piwik_track_view(views.GenreView.as_view()),
          name='catalogue_api_genre'),
+    path('themes/',
+         piwik_track_view(views.ThemeList.as_view()),
+         name="catalogue_api_theme_list"),
+    path('themes/<slug:slug>/',
+         piwik_track_view(views.ThemeView.as_view()),
+         name='catalogue_api_theme'),
 ]
index b2734d9..198f87f 100644 (file)
@@ -406,6 +406,15 @@ class KindView(RetrieveAPIView):
     queryset = Tag.objects.filter(category='kind')
     lookup_field = 'slug'
 
+class ThemeList(ListAPIView):
+    serializer_class = serializers.ThemeSerializer
+    queryset = Tag.objects.filter(category='theme')
+
+class ThemeView(RetrieveAPIView):
+    serializer_class = serializers.ThemeSerializer
+    queryset = Tag.objects.filter(category='theme')
+    lookup_field = 'slug'
+
 
 class TagView(RetrieveAPIView):
     permission_classes = [DjangoModelPermissionsOrAnonReadOnly]
index 1ce66a9..1fbf8e3 100644 (file)
@@ -3,7 +3,10 @@
 #
 from rest_framework.generics import ListAPIView
 from rest_framework.response import Response
+from rest_framework import serializers
 from rest_framework.views import APIView
+import catalogue.models
+import catalogue.api.serializers
 from search.views import get_hints
 from search.forms import SearchFilters
 
@@ -12,6 +15,9 @@ class HintView(APIView):
     def get(self, request):
         term = request.query_params.get('q')
         hints = get_hints(term, request.user)
+        for h in hints:
+            if h.get('img'):
+                h['img'] = request.build_absolute_uri(h['img'])
         return Response(hints)
 
 
@@ -19,15 +25,68 @@ class SearchView(APIView):
     def get(self, request):
         term = self.request.query_params.get('q')
         f = SearchFilters({'q': term})
-        r = {}
         if f.is_valid():
             r = f.results()
-        return Response(r)
+            res = {}
+            rl = res['author'] = []
+            c = {'request': request}
+            for item in r['author']:
+                rl.append(
+                    catalogue.api.serializers.AuthorSerializer(item, context=c).data
+                )
+            rl = res['genre'] = []
+            for item in r['genre']:
+                rl.append(
+                    catalogue.api.serializers.GenreSerializer(item, context=c).data
+                )
+            rl = res['theme'] = []
+            for item in r['theme']:
+                rl.append(
+                    catalogue.api.serializers.ThemeSerializer(item, context=c).data
+                )
+
+        return Response(res)
+
 
 class BookSearchView(ListAPIView):
-    def get_queryset(self, request):
+    serializer_class = catalogue.api.serializers.BookSerializer
+
+    def get_queryset(self):
         term = self.request.query_params.get('q')
+        f = SearchFilters({'q': term})
+        if f.is_valid():
+            r = f.results()
+            return r['book']
+        return []
+
+
+
+class SnippetSerializer(serializers.ModelSerializer):
+    anchor = serializers.CharField(source='sec')
+    headline = serializers.CharField()
+
+    class Meta:
+        model = catalogue.models.Snippet
+        fields = ['anchor', 'headline']
+
+
+class BookSnippetsSerializer(serializers.Serializer):
+    book = catalogue.api.serializers.BookSerializer()
+    snippets = SnippetSerializer(many=True)
+
 
 class TextSearchView(ListAPIView):
-    def get_queryset(self, request):
+    serializer_class = BookSnippetsSerializer
+
+    def get_queryset(self):
         term = self.request.query_params.get('q')
+        f = SearchFilters({'q': term})
+        if f.is_valid():
+            r = f.results()
+            r = list({
+                'book': book,
+                'snippets': snippets
+            } for (book, snippets) in r['snippet'].items())
+            return r
+        return []
+