X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/e3ab2edd07579ddcee8128c362b202caa03a4578..572ee91a188114e383712eac2426dab3bcef6c00:/src/catalogue/api/views.py?ds=inline diff --git a/src/catalogue/api/views.py b/src/catalogue/api/views.py index 821b281c4..e5005e2de 100644 --- a/src/catalogue/api/views.py +++ b/src/catalogue/api/views.py @@ -6,7 +6,7 @@ import os.path from urllib.request import urlopen from django.conf import settings from django.core.files.base import ContentFile -from django.http import Http404, HttpResponse +from django.http import Http404, HttpResponse, JsonResponse from django.utils.decorators import method_decorator from django.views.decorators.cache import never_cache from django_filters import rest_framework as dfilters @@ -198,6 +198,11 @@ class BookFilter(dfilters.FilterSet): queryset=Tag.objects.filter(category__in=('author', 'epoch', 'genre', 'kind')), conjoined=True, ) + translator = dfilters.ModelMultipleChoiceFilter( + field_name='translators', + queryset=Tag.objects.filter(category='author'), + conjoined=True, + ) class BookList2(ListAPIView): @@ -221,6 +226,18 @@ class BookList2(ListAPIView): return books +class BookRecommendationsView(ListAPIView): + serializer_class = serializers.BookSerializer2 + pagination_class = None + + def get_queryset(self): + book = get_object_or_404( + Book, + slug=self.kwargs['slug'] + ) + return book.get_recommended(limit=3) + + class BookList11Labs(BookList2): serializer_class = serializers.BookSerializer11Labs @@ -246,6 +263,18 @@ class BookDetail2(RetrieveAPIView): serializer_class = serializers.BookSerializer2 +class BookSyncView(RetrieveAPIView): + queryset = Book.objects.all() + lookup_field = 'slug' + + def retrieve(self, request, *args, **kwargs): + instance = self.get_object() + return Response([ + {"id": i, "timestamp": ts} + for (i, ts) in instance.get_sync() + ]) + + @vary_on_auth # Because of embargo links. class EbookList(BookList): serializer_class = serializers.EbookSerializer @@ -401,6 +430,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] @@ -518,6 +556,15 @@ class BookFragmentView(RetrieveAPIView): return book.choose_fragment() +class BookChildrenView(ListAPIView): + serializer_class = serializers.BookSerializer2 + pagination_class = None + + def get_queryset(self): + book = get_object_or_404(Book, slug=self.kwargs['slug']) + return book.get_children() + + class BookMediaView(ListAPIView): serializer_class = serializers.MediaSerializer2 pagination_class = None @@ -527,3 +574,14 @@ class BookMediaView(ListAPIView): book__slug=self.kwargs['slug'], type=self.kwargs['type'] ).order_by('index') + + +from .tojson import conv +from lxml import etree +from rest_framework.views import APIView + +class BookJsonView(APIView): + def get(self, request, slug): + book = get_object_or_404(Book, slug=slug) + js = conv(etree.parse(book.xml_file.path)) + return JsonResponse(js, json_dumps_params={'ensure_ascii': False})