helper script
[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 import catalogue.models
15 from social.utils import likes
16 from social.views import get_sets_for_book_ids
17
18
19 @vary_on_auth
20 class LikeView(APIView):
21     permission_classes = [IsAuthenticated]
22
23     def get(self, request, slug):
24         book = get_object_or_404(Book, slug=slug)
25         return Response({"likes": likes(request.user, book)})
26
27     def post(self, request, slug):
28         book = get_object_or_404(Book, slug=slug)
29         action = request.query_params.get('action', 'like')
30         if action == 'like':
31             book.like(request.user)
32         elif action == 'unlike':
33             book.unlike(request.user)
34         return Response({})
35
36
37 @vary_on_auth
38 class LikeView2(APIView):
39     permission_classes = [IsAuthenticated]
40
41     def get(self, request, slug):
42         book = get_object_or_404(Book, slug=slug)
43         return Response({"likes": likes(request.user, book)})
44
45     def put(self, request, slug):
46         book = get_object_or_404(Book, slug=slug)
47         book.like(request.user)
48         return Response({"likes": likes(request.user, book)})
49
50     def delete(self, request, slug):
51         book = get_object_or_404(Book, slug=slug)
52         book.unlike(request.user)
53         return Response({"likes": likes(request.user, book)})
54
55
56 @vary_on_auth
57 class LikesView(APIView):
58     permission_classes = [IsAuthenticated]
59
60     def get(self, request):
61         slugs = request.GET.getlist('slug')
62         books = Book.objects.filter(slug__in=slugs)
63         books = {b.id: b.slug for b in books}
64         ids = books.keys()
65         res = get_sets_for_book_ids(ids, request.user)
66         res = {books[bid]: v for bid, v in res.items()}
67         return Response(res)
68
69
70 @vary_on_auth
71 class MyLikesView(APIView):
72     permission_classes = [IsAuthenticated]
73
74     def get(self, request):
75         ids = catalogue.models.tag.TagRelation.objects.filter(tag__user=request.user).values_list('object_id', flat=True).distinct()
76         books = Book.objects.filter(id__in=ids)
77         books = {b.id: b.slug for b in books}
78         res = get_sets_for_book_ids(ids, request.user)
79         res = {books[bid]: v for bid, v in res.items()}
80         return Response(res)
81
82
83
84 @vary_on_auth
85 class ShelfView(ListAPIView):
86     permission_classes = [IsAuthenticated]
87     serializer_class = BookSerializer
88     pagination_class = None
89
90     def get_queryset(self):
91         state = self.kwargs['state']
92         if state not in ('reading', 'complete', 'likes'):
93             raise Http404
94         new_api = self.request.query_params.get('new_api')
95         after = self.request.query_params.get('after')
96         count = int(self.request.query_params.get('count', 50))
97         if state == 'likes':
98             books = Book.tagged.with_any(self.request.user.tag_set.all())
99         else:
100             ids = BookUserData.objects.filter(user=self.request.user, complete=state == 'complete')\
101                 .values_list('book_id', flat=True)
102             books = Book.objects.filter(id__in=list(ids)).distinct()
103             books = order_books(books, new_api)
104         if after:
105             books = books_after(books, after, new_api)
106         if count:
107             books = books[:count]
108
109         return books
110