# 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
from rest_framework import status
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, 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']
queryset = Book.objects.none() # Required for DjangoModelPermissions
serializer_class = serializers.BookListSerializer
+ def get(self, request, filename=None, **kwargs):
+ if filename 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(
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):
+ books = books.exclude(preview=True)
+
if self.kwargs.get('top_level'):
books = books.filter(parent=None)
if self.kwargs.get('audiobooks'):
serializer_class = serializers.BookDetailSerializer
+@vary_on_auth # Because of embargo links.
class EbookList(BookList):
serializer_class = serializers.EbookSerializer
-@vary_on_auth # Because of 'liked'.
+@method_decorator(never_cache, name='dispatch')
class Preview(ListAPIView):
- queryset = Book.objects.filter(preview=True)
+ #queryset = Book.objects.filter(preview=True)
serializer_class = serializers.BookPreviewSerializer
+ def get_queryset(self):
+ qs = Book.objects.filter(preview=True)
+ # FIXME: temporary workaround for a problem with iOS app; see #3954.
+ if 'Darwin' in self.request.META.get('HTTP_USER_AGENT', '') and 'debug' not in self.request.GET:
+ qs = qs.none()
+ return qs
+
@vary_on_auth # Because of 'liked'.
class FilterBookList(ListAPIView):
is_lektura = self.parse_bool(self.request.query_params.get('lektura'))
is_audiobook = self.parse_bool(self.request.query_params.get('audiobook'))
preview = self.parse_bool(self.request.query_params.get('preview'))
+ if not Membership.is_active_for(self.request.user):
+ preview = False
new_api = self.request.query_params.get('new_api')
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:
)
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'.