More API views migrated.
[wolnelektury.git] / src / catalogue / api / views.py
1 from django.http import HttpResponse
2 from rest_framework.generics import ListAPIView, RetrieveAPIView, get_object_or_404
3 from paypal.permissions import IsSubscribed
4 from api.handlers import read_tags
5 from . import serializers
6 from catalogue.models import Book, Collection, Tag, Fragment
7
8
9 class CollectionList(ListAPIView):
10     queryset = Collection.objects.all()
11     serializer_class = serializers.CollectionListSerializer
12
13
14 class CollectionDetail(RetrieveAPIView):
15     queryset = Collection.objects.all()
16     lookup_field = 'slug'
17     serializer_class = serializers.CollectionSerializer
18
19
20 class BookDetail(RetrieveAPIView):
21     queryset = Book.objects.all()
22     lookup_field = 'slug'
23     serializer_class = serializers.BookDetailSerializer
24
25
26 class EpubView(RetrieveAPIView):
27     queryset = Book.objects.all()
28     lookup_field = 'slug'
29     permission_classes = [IsSubscribed]
30
31     def get(self, *args, **kwargs):
32         return HttpResponse(self.get_object().get_media('epub'))
33
34
35 class TagCategoryView(ListAPIView):
36     serializer_class = serializers.TagSerializer
37
38     def get_queryset(self):
39         category = self.kwargs['category']
40         tags = Tag.objects.filter(category=category).exclude(items=None).order_by('slug')
41         if self.request.query_params.get('book_only') == 'true':
42             tags = tags.filter(for_books=True)
43         if self.request.GET.get('picture_only') == 'true':
44             tags = filter(for_pictures=True)
45
46         after = self.request.query_params.get('after')
47         count = self.request.query_params.get('count')
48         if after:
49             tags = tags.filter(slug__gt=after)
50         if count:
51             tags = tags[:count]
52
53         return tags
54
55
56 class TagView(RetrieveAPIView):
57     serializer_class = serializers.TagDetailSerializer
58
59     def get_object(self):
60         return get_object_or_404(
61             Tag,
62             category=self.kwargs['category'],
63             slug=self.kwargs['slug']
64         )
65
66
67 class FragmentList(ListAPIView):
68     serializer_class = serializers.FragmentSerializer
69
70     def get_queryset(self):
71         try:
72             tags, ancestors = read_tags(
73                 self.kwargs['tags'],
74                 self.request,
75                 allowed={'author', 'epoch', 'kind', 'genre', 'book', 'theme'}
76             )
77         except ValueError:
78             raise Http404
79         return Fragment.tagged.with_all(tags).select_related('book')
80
81
82 class FragmentView(RetrieveAPIView):
83     serializer_class = serializers.FragmentDetailSerializer
84
85     def get_object(self):
86         return get_object_or_404(
87             Fragment,
88             book__slug=self.kwargs['book'],
89             anchor=self.kwargs['anchor']
90         )