Fix banner image sizing.
[wolnelektury.git] / src / catalogue / api / views.py
index 34971c4..faeeb3c 100644 (file)
@@ -2,6 +2,8 @@
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 import json
+import os.path
+from django.conf import settings
 from django.http import Http404, HttpResponse
 from django.utils.decorators import method_decorator
 from django.views.decorators.cache import never_cache
@@ -11,14 +13,14 @@ from rest_framework.response import Response
 from rest_framework import status
 from api.handlers import read_tags
 from api.utils import vary_on_auth
-from club.models import Membership
-from .helpers import books_after, order_books
-from . import serializers
 from catalogue.forms import BookImportForm
 from catalogue.models import Book, Collection, Tag, Fragment, BookMedia
 from catalogue.models.tag import prefetch_relations
+from club.models import Membership
 from club.permissions import IsClubMember
 from wolnelektury.utils import re_escape
+from .helpers import books_after, order_books
+from . import serializers
 
 
 book_tag_categories = ['author', 'epoch', 'kind', 'genre']
@@ -42,6 +44,16 @@ class BookList(ListAPIView):
     queryset = Book.objects.none()  # Required for DjangoModelPermissions
     serializer_class = serializers.BookListSerializer
 
+    def get(self, request, filename=None, **kwargs):
+        if filename and not kwargs.get('tags') and 'count' not in request.query_params:
+            try:
+                with open(os.path.join(settings.MEDIA_ROOT, 'api', '%s.%s' % (filename, request.accepted_renderer.format)), 'rb') as f:
+                    content = f.read()
+                return HttpResponse(content, content_type=request.accepted_media_type)
+            except:
+                pass
+        return super().get(request, filename=filename, **kwargs)
+
     def get_queryset(self):
         try:
             tags, ancestors = read_tags(
@@ -70,6 +82,7 @@ class BookList(ListAPIView):
                 books = Book.tagged.with_all(tags)
         else:
             books = Book.objects.all()
+        books = books.filter(findable=True)
         books = order_books(books, new_api)
 
         if not Membership.is_active_for(self.request.user):
@@ -122,6 +135,10 @@ class BookList(ListAPIView):
         name = request.POST.get('name', '')
         part_name = request.POST.get('part_name', '')
 
+        project_data = request.POST.get('project', {})
+        project_description = project_data.get('description', '')
+        project_icon = project_data.get('icon', '')
+
         _rest, slug = request.POST['book'].rstrip('/').rsplit('/', 1)
         book = Book.objects.get(slug=slug)
 
@@ -133,6 +150,8 @@ class BookList(ListAPIView):
         bm.name = name
         bm.part_name = part_name
         bm.index = index
+        bm.project_description = project_description
+        bm.project_icon = project_icon
         bm.file.save(None, request.data['file'], save=False)
         bm.save(parts_count=parts_count)
 
@@ -187,6 +206,7 @@ class FilterBookList(ListAPIView):
         after = self.request.query_params.get('after')
         count = int(self.request.query_params.get('count', 50))
         books = order_books(Book.objects.distinct(), new_api)
+        books = books.filter(findable=True)
         if is_lektura is not None:
             books = books.filter(has_audience=is_lektura)
         if is_audiobook is not None:
@@ -293,7 +313,7 @@ class FragmentList(ListAPIView):
             )
         except ValueError:
             raise Http404
-        return Fragment.tagged.with_all(tags).select_related('book')
+        return Fragment.tagged.with_all(tags).filter(book__findable=True).select_related('book')
 
 
 @vary_on_auth  # Because of 'liked'.