-# -*- coding: utf-8 -*-
# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
import json
from django.http import Http404, HttpResponse
+from django.utils.decorators import method_decorator
+from django.views.decorators.cache import never_cache
from rest_framework.generics import ListAPIView, RetrieveAPIView, get_object_or_404
from rest_framework.permissions import DjangoModelPermissionsOrAnonReadOnly
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 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.permissions import IsClubMember
from wolnelektury.utils import re_escape
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'):
books = Book.objects.all()
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['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')
class EpubView(RetrieveAPIView):
queryset = Book.objects.all()
lookup_field = 'slug'
- permission_classes = [IsSubscribed]
+ permission_classes = [IsClubMember]
+ @method_decorator(never_cache)
def get(self, *args, **kwargs):
return HttpResponse(self.get_object().get_media('epub'))