1 from api.utils import never_cache
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
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
19 class BookmarkSerializerV3(serializers.ModelSerializer):
20 """Replaced in API v4."""
21 book = serializers.SlugRelatedField(
22 queryset=catalogue.models.Book.objects.all(), slug_field='slug',
25 href = AbsoluteURLField(view_name='api_bookmark', view_args=['uuid'])
26 timestamp = serializers.IntegerField(required=False)
27 location = serializers.CharField(required=False)
30 model = models.Bookmark
31 fields = ['book', 'anchor', 'audio_timestamp', 'mode', 'note', 'href', 'uuid', 'location', 'timestamp', 'deleted']
32 read_only_fields = ['uuid', 'mode']
35 class BookmarkSerializer(serializers.ModelSerializer):
36 book_slug = serializers.SlugRelatedField(
37 queryset=catalogue.models.Book.objects.all(), slug_field='slug',
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)
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']
51 def create(self, validated_data):
52 book = validated_data.pop('book_slug', None)
54 validated_data['book'] = book
55 return super().create(validated_data)
57 def update(self, instance, validated_data):
58 book = validated_data.pop('book_slug', None)
60 validated_data['book'] = book
61 return super().update(instance, validated_data)
64 class BookmarksView(ListCreateAPIView):
65 permission_classes = [IsAuthenticated]
67 def get_serializer_class(self):
68 if self.request.version < 'v4':
69 return BookmarkSerializerV3
71 return BookmarkSerializer
73 def get_queryset(self):
74 return self.request.user.bookmark_set.all()
76 def perform_create(self, serializer):
77 serializer.save(user=self.request.user)
81 class BookBookmarksView(ListAPIView):
82 permission_classes = [IsAuthenticated]
83 pagination_class = None
85 def get_serializer_class(self):
86 if self.request.version < 'v4':
87 return BookmarkSerializerV3
89 return BookmarkSerializer
91 def get_queryset(self):
92 return self.request.user.bookmark_set.filter(book__slug=self.kwargs['book'])
96 class BookmarkView(RetrieveUpdateDestroyAPIView):
97 permission_classes = [IsAuthenticatedOrReadOnly]
100 def get_serializer_class(self):
101 if self.request.version < 'v4':
102 return BookmarkSerializerV3
104 return BookmarkSerializer
106 def get_queryset(self):
107 if self.request.method in SAFE_METHODS:
109 if self.request.user.is_authenticated:
110 q |= Q(user=self.request.user)
111 return models.Bookmark.objects.filter(q)
113 return self.request.user.bookmark_set.all()