X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/1501fe79a5abe6fc214309ade4ceb85f6bfd0328..4c459c790ea52c2df629173946a8ddb80935ea32:/src/catalogue/api/views.py diff --git a/src/catalogue/api/views.py b/src/catalogue/api/views.py index 0e758b15e..7457b6f1b 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): @@ -246,6 +251,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 json.loads(instance.get_sync()) + ]) + + @vary_on_auth # Because of embargo links. class EbookList(BookList): serializer_class = serializers.EbookSerializer @@ -401,6 +418,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] @@ -501,6 +527,40 @@ class SuggestedTags(ListAPIView): def get_queryset(self): tag_ids = self.request.GET.getlist('tag', []) + search = self.request.GET.get('search') tags = [get_object_or_404(Tag, id=tid) for tid in tag_ids] related_tags = list(t.id for t in get_top_level_related_tags(tags)) - return Tag.objects.filter(id__in=related_tags) + tags = Tag.objects.filter(id__in=related_tags) + if search: + tags = tags.filter(name__icontains=search) + return tags + + +class BookFragmentView(RetrieveAPIView): + serializer_class = serializers.FragmentSerializer2 + + def get_object(self): + book = get_object_or_404(Book, slug=self.kwargs['slug']) + return book.choose_fragment() + + +class BookMediaView(ListAPIView): + serializer_class = serializers.MediaSerializer2 + pagination_class = None + + def get_queryset(self): + return BookMedia.objects.filter( + 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})