d34503da1a6ffa409f0a95b53f91c2a92d12cf7a
[wolnelektury.git] / src / social / api / views.py
1 # This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
3 #
4 from django.http import Http404
5 from rest_framework.generics import ListAPIView, get_object_or_404
6 from rest_framework.permissions import IsAuthenticated
7 from rest_framework.response import Response
8 from rest_framework.views import APIView
9 from api.models import BookUserData
10 from api.utils import vary_on_auth
11 from catalogue.api.helpers import order_books, books_after
12 from catalogue.api.serializers import BookSerializer
13 from catalogue.models import Book
14 from social.utils import likes
15 from social.views import get_sets_for_book_ids
16
17
18 @vary_on_auth
19 class LikeView(APIView):
20     permission_classes = [IsAuthenticated]
21
22     def get(self, request, slug):
23         book = get_object_or_404(Book, slug=slug)
24         return Response({"likes": likes(request.user, book)})
25
26     def post(self, request, slug):
27         book = get_object_or_404(Book, slug=slug)
28         action = request.query_params.get('action', 'like')
29         if action == 'like':
30             book.like(request.user)
31         elif action == 'unlike':
32             book.unlike(request.user)
33         return Response({})
34
35
36 @vary_on_auth
37 class LikeView2(APIView):
38     permission_classes = [IsAuthenticated]
39
40     def get(self, request, slug):
41         book = get_object_or_404(Book, slug=slug)
42         return Response({"likes": likes(request.user, book)})
43
44     def put(self, request, slug):
45         book = get_object_or_404(Book, slug=slug)
46         book.like(request.user)
47         return Response({"likes": likes(request.user, book)})
48
49     def delete(self, request, slug):
50         book = get_object_or_404(Book, slug=slug)
51         book.unlike(request.user)
52         return Response({"likes": likes(request.user, book)})
53
54
55 @vary_on_auth
56 class LikesView(APIView):
57     permission_classes = [IsAuthenticated]
58
59     def get(self, request):
60         slugs = request.GET.getlist('slug')
61         books = Book.objects.filter(slug__in=slugs)
62         books = {b.id: b.slug for b in books}
63         ids = books.keys()
64         res = get_sets_for_book_ids(ids, request.user)
65         res = {books[bid]: v for bid, v in res.items()}
66         return Response(res)
67         
68
69
70 @vary_on_auth
71 class ShelfView(ListAPIView):
72     permission_classes = [IsAuthenticated]
73     serializer_class = BookSerializer
74     pagination_class = None
75
76     def get_queryset(self):
77         state = self.kwargs['state']
78         if state not in ('reading', 'complete', 'likes'):
79             raise Http404
80         new_api = self.request.query_params.get('new_api')
81         after = self.request.query_params.get('after')
82         count = int(self.request.query_params.get('count', 50))
83         if state == 'likes':
84             books = Book.tagged.with_any(self.request.user.tag_set.all())
85         else:
86             ids = BookUserData.objects.filter(user=self.request.user, complete=state == 'complete')\
87                 .values_list('book_id', flat=True)
88             books = Book.objects.filter(id__in=list(ids)).distinct()
89             books = order_books(books, new_api)
90         if after:
91             books = books_after(books, after, new_api)
92         if count:
93             books = books[:count]
94
95         return books
96