fix for bookmarks
[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 from catalogue.api.serializers import BookSerializer2
17
18
19 class BookmarkSerializerV3(serializers.ModelSerializer):
20     """Replaced in API v4."""
21     book = serializers.SlugRelatedField(
22         queryset=catalogue.models.Book.objects.all(), slug_field='slug',
23         required=False
24     )
25     href = AbsoluteURLField(view_name='api_bookmark', view_args=['uuid'])
26     timestamp = serializers.IntegerField(required=False)
27     location = serializers.CharField(required=False)
28     
29     class Meta:
30         model = models.Bookmark
31         fields = ['book', 'anchor', 'audio_timestamp', 'mode', 'note', 'href', 'uuid', 'location', 'timestamp', 'deleted']
32         read_only_fields = ['uuid', 'mode']
33
34
35 class BookmarkSerializer(serializers.ModelSerializer):
36     book_slug = serializers.SlugRelatedField(
37         queryset=catalogue.models.Book.objects.all(), slug_field='slug',
38         write_only=True,
39         required=False
40     )
41     book = BookSerializer2(read_only=True)
42     href = AbsoluteURLField(view_name='api_bookmark', view_args=['uuid'])
43     timestamp = serializers.IntegerField(required=False)
44     location = serializers.CharField(required=False)
45     
46     class Meta:
47         model = models.Bookmark
48         fields = ['book_slug', 'book', 'anchor', 'audio_timestamp', 'mode', 'note', 'href', 'uuid', 'location', 'timestamp', 'deleted']
49         read_only_fields = ['uuid', 'mode']
50
51     def create(self, validated_data):
52         book = validated_data.pop('book_slug', None)
53         if book is not None:
54             validated_data['book'] = book
55         return super().create(validated_data)
56
57     def update(self, instance, validated_data):
58         book = validated_data.pop('book_slug', None)
59         if book is not None:
60             validated_data['book'] = book
61         return super().update(instance, validated_data)
62
63 @never_cache
64 class BookmarksView(ListCreateAPIView):
65     permission_classes = [IsAuthenticated]
66
67     def get_serializer_class(self):
68         if self.request.version < 'v4':
69             return BookmarkSerializerV3
70         else:
71             return BookmarkSerializer
72     
73     def get_queryset(self):
74         return self.request.user.bookmark_set.all()
75
76     def perform_create(self, serializer):
77         serializer.save(user=self.request.user)
78
79
80 @never_cache
81 class BookBookmarksView(ListAPIView):
82     permission_classes = [IsAuthenticated]
83     pagination_class = None
84
85     def get_serializer_class(self):
86         if self.request.version < 'v4':
87             return BookmarkSerializerV3
88         else:
89             return BookmarkSerializer
90     
91     def get_queryset(self):
92         return self.request.user.bookmark_set.filter(book__slug=self.kwargs['book'])
93
94
95 @never_cache
96 class BookmarkView(RetrieveUpdateDestroyAPIView):
97     permission_classes = [IsAuthenticatedOrReadOnly]
98     lookup_field = 'uuid'
99
100     def get_serializer_class(self):
101         if self.request.version < 'v4':
102             return BookmarkSerializerV3
103         else:
104             return BookmarkSerializer
105     
106     def get_queryset(self):
107         if self.request.method in SAFE_METHODS:
108             q = Q(deleted=False)
109             if self.request.user.is_authenticated:
110                 q |= Q(user=self.request.user)
111             return models.Bookmark.objects.filter(q)
112         else:
113             return self.request.user.bookmark_set.all()