From 0ce1f45befb101b24a96fc9676a377a8cb7f6e8d Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Wed, 6 Aug 2025 12:48:00 +0200 Subject: [PATCH] search --- src/catalogue/api/serializers.py | 12 ++++++ src/catalogue/api/urls2.py | 6 +++ src/catalogue/api/views.py | 9 +++++ src/search/api/views.py | 67 ++++++++++++++++++++++++++++++-- 4 files changed, 90 insertions(+), 4 deletions(-) diff --git a/src/catalogue/api/serializers.py b/src/catalogue/api/serializers.py index 8968bf6b1..9c70a9f0e 100644 --- a/src/catalogue/api/serializers.py +++ b/src/catalogue/api/serializers.py @@ -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='*') diff --git a/src/catalogue/api/urls2.py b/src/catalogue/api/urls2.py index f06ecdf21..29d4a3a0e 100644 --- a/src/catalogue/api/urls2.py +++ b/src/catalogue/api/urls2.py @@ -56,4 +56,10 @@ urlpatterns = [ path('genres//', 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//', + piwik_track_view(views.ThemeView.as_view()), + name='catalogue_api_theme'), ] diff --git a/src/catalogue/api/views.py b/src/catalogue/api/views.py index b2734d941..198f87fdd 100644 --- a/src/catalogue/api/views.py +++ b/src/catalogue/api/views.py @@ -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] diff --git a/src/search/api/views.py b/src/search/api/views.py index 1ce66a964..1fbf8e3fd 100644 --- a/src/search/api/views.py +++ b/src/search/api/views.py @@ -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 [] + -- 2.20.1