Standardize book serialization.
[wolnelektury.git] / src / search / api / views.py
1 # This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
3 #
4 from rest_framework.generics import ListAPIView
5 from rest_framework.response import Response
6 from rest_framework import serializers
7 from rest_framework.views import APIView
8 import catalogue.models
9 import catalogue.api.serializers
10 from search.views import get_hints
11 from search.forms import SearchFilters
12
13
14 class HintView(APIView):
15     def get(self, request):
16         term = request.query_params.get('q')
17         hints = get_hints(term, request.user)
18         for h in hints:
19             if h.get('img'):
20                 h['img'] = request.build_absolute_uri(h['img'])
21         return Response(hints)
22
23
24 class SearchView(APIView):
25     def get(self, request):
26         term = self.request.query_params.get('q')
27         f = SearchFilters({'q': term})
28         if f.is_valid():
29             r = f.results()
30             res = {}
31             rl = res['author'] = []
32             c = {'request': request}
33             for item in r['author']:
34                 rl.append(
35                     catalogue.api.serializers.AuthorSerializer(item, context=c).data
36                 )
37             rl = res['genre'] = []
38             for item in r['genre']:
39                 rl.append(
40                     catalogue.api.serializers.GenreSerializer(item, context=c).data
41                 )
42             rl = res['theme'] = []
43             for item in r['theme']:
44                 rl.append(
45                     catalogue.api.serializers.ThemeSerializer(item, context=c).data
46                 )
47
48         return Response(res)
49
50
51 class BookSearchView(ListAPIView):
52     serializer_class = catalogue.api.serializers.BookSerializer2
53
54     def get_queryset(self):
55         term = self.request.query_params.get('q')
56         f = SearchFilters({'q': term})
57         if f.is_valid():
58             r = f.results()
59             return r['book']
60         return []
61
62
63
64 class SnippetSerializer(serializers.ModelSerializer):
65     anchor = serializers.CharField(source='sec')
66     headline = serializers.CharField()
67
68     class Meta:
69         model = catalogue.models.Snippet
70         fields = ['anchor', 'headline']
71
72
73 class BookSnippetsSerializer(serializers.Serializer):
74     book = catalogue.api.serializers.BookSerializer2()
75     snippets = SnippetSerializer(many=True)
76
77
78 class TextSearchView(ListAPIView):
79     serializer_class = BookSnippetsSerializer
80
81     def get_queryset(self):
82         term = self.request.query_params.get('q')
83         f = SearchFilters({'q': term})
84         if f.is_valid():
85             r = f.results()
86             r = list({
87                 'book': book,
88                 'snippets': snippets
89             } for (book, snippets) in r['snippet'].items())
90             return r
91         return []
92