X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/ff382f6c37063c0c4c5d21c2834a8759e25c5d02..154870f0416b6b387637d6035c96321410512e95:/src/catalogue/api/views.py?ds=inline diff --git a/src/catalogue/api/views.py b/src/catalogue/api/views.py index ee345ba68..7c4b88825 100644 --- a/src/catalogue/api/views.py +++ b/src/catalogue/api/views.py @@ -10,10 +10,11 @@ from rest_framework.response import Response from rest_framework import status from paypal.permissions import IsSubscribed from api.handlers import read_tags +from api.utils import vary_on_auth from .helpers import books_after, order_books from . import serializers from catalogue.forms import BookImportForm -from catalogue.models import Book, Collection, Tag, Fragment +from catalogue.models import Book, Collection, Tag, Fragment, BookMedia from catalogue.models.tag import prefetch_relations from wolnelektury.utils import re_escape @@ -26,12 +27,14 @@ class CollectionList(ListAPIView): serializer_class = serializers.CollectionListSerializer +@vary_on_auth # Because of 'liked'. class CollectionDetail(RetrieveAPIView): queryset = Collection.objects.all() lookup_field = 'slug' serializer_class = serializers.CollectionSerializer +@vary_on_auth # Because of 'liked'. class BookList(ListAPIView): permission_classes = [DjangoModelPermissionsOrAnonReadOnly] queryset = Book.objects.none() # Required for DjangoModelPermissions @@ -49,6 +52,11 @@ class BookList(ListAPIView): new_api = self.request.query_params.get('new_api') after = self.request.query_params.get('after', self.kwargs.get('after')) count = self.request.query_params.get('count', self.kwargs.get('count')) + if count: + try: + count = int(count) + except TypeError: + raise Http404 # Fixme if tags: if self.kwargs.get('top_level'): @@ -87,7 +95,12 @@ class BookList(ListAPIView): return books def post(self, request, **kwargs): - # Permission needed. + if kwargs.get('audiobooks'): + return self.post_audiobook(request, **kwargs) + else: + return self.post_book(request, **kwargs) + + def post_book(self, request, **kwargs): data = json.loads(request.POST.get('data')) form = BookImportForm(data) if form.is_valid(): @@ -96,7 +109,32 @@ class BookList(ListAPIView): else: raise Http404 + def post_audiobook(self, request, **kwargs): + index = int(request.POST['part_index']) + parts_count = int(request.POST['parts_count']) + media_type = request.POST['type'].lower() + source_sha1 = request.POST.get('source_sha1') + name = request.POST.get('name', '') + part_name = request.POST.get('part_name', '') + + _rest, slug = request.POST['book'].rstrip('/').rsplit('/', 1) + book = Book.objects.get(slug=slug) + + try: + assert source_sha1 + bm = book.media.get(type=media_type, source_sha1=source_sha1) + except (AssertionError, BookMedia.DoesNotExist): + bm = BookMedia(book=book, type=media_type) + bm.name = name + bm.part_name = part_name + bm.index = index + bm.file.save(None, request.data['file'], save=False) + bm.save(parts_count=parts_count) + + return Response({}, status=status.HTTP_201_CREATED) + +@vary_on_auth # Because of 'liked'. class BookDetail(RetrieveAPIView): queryset = Book.objects.all() lookup_field = 'slug' @@ -107,11 +145,13 @@ class EbookList(BookList): serializer_class = serializers.EbookSerializer +@vary_on_auth # Because of 'liked'. class Preview(ListAPIView): queryset = Book.objects.filter(preview=True) serializer_class = serializers.BookPreviewSerializer +@vary_on_auth # Because of 'liked'. class FilterBookList(ListAPIView): serializer_class = serializers.FilterBookListSerializer @@ -224,6 +264,7 @@ class TagView(RetrieveAPIView): ) +@vary_on_auth # Because of 'liked'. class FragmentList(ListAPIView): serializer_class = serializers.FragmentSerializer @@ -239,6 +280,7 @@ class FragmentList(ListAPIView): return Fragment.tagged.with_all(tags).select_related('book') +@vary_on_auth # Because of 'liked'. class FragmentView(RetrieveAPIView): serializer_class = serializers.FragmentDetailSerializer