Allow email login
[wolnelektury.git] / src / bookmarks / api / views.py
1 from api.utils import never_cache
2
3 from django.db.models import Q
4 from django.http import Http404, JsonResponse
5 from django.shortcuts import render, get_object_or_404
6 from django.views.decorators import cache
7 import catalogue.models
8 from wolnelektury.utils import is_ajax
9 from bookmarks import models
10 from lxml import html
11 import re
12 from rest_framework.generics import ListAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView
13 from rest_framework import serializers
14 from rest_framework.permissions import SAFE_METHODS, IsAuthenticated, IsAuthenticatedOrReadOnly
15 from api.fields import AbsoluteURLField
16
17
18 class BookmarkSerializer(serializers.ModelSerializer):
19     book = serializers.SlugRelatedField(
20         queryset=catalogue.models.Book.objects.all(), slug_field='slug',
21         required=False
22     )
23     href = AbsoluteURLField(view_name='api_bookmark', view_args=['uuid'])
24     timestamp = serializers.IntegerField(required=False)
25     location = serializers.CharField(required=False)
26     
27     class Meta:
28         model = models.Bookmark
29         fields = ['book', 'anchor', 'audio_timestamp', 'mode', 'note', 'href', 'uuid', 'location', 'timestamp', 'deleted']
30         read_only_fields = ['uuid', 'mode']
31
32
33
34 @never_cache
35 class BookmarksView(ListCreateAPIView):
36     permission_classes = [IsAuthenticated]
37     serializer_class = BookmarkSerializer
38
39     def get_queryset(self):
40         return self.request.user.bookmark_set.all()
41
42     def perform_create(self, serializer):
43         serializer.save(user=self.request.user)
44
45
46 @never_cache
47 class BookBookmarksView(ListAPIView):
48     permission_classes = [IsAuthenticated]
49     serializer_class = BookmarkSerializer
50     pagination_class = None
51
52     def get_queryset(self):
53         return self.request.user.bookmark_set.filter(book__slug=self.kwargs['book'])
54
55
56 @never_cache
57 class BookmarkView(RetrieveUpdateDestroyAPIView):
58     permission_classes = [IsAuthenticatedOrReadOnly]
59     serializer_class = BookmarkSerializer
60     lookup_field = 'uuid'
61
62     def get_queryset(self):
63         if self.request.method in SAFE_METHODS:
64             q = Q(deleted=False)
65             if self.request.user.is_authenticated:
66                 q |= Q(user=self.request.user)
67             return models.Bookmark.objects.filter(q)
68         else:
69             return self.request.user.bookmark_set.all()