from django.db.models import Q
from django.http import Http404, JsonResponse
from django.shortcuts import render, get_object_or_404
+from django.utils.timezone import now
from django.views.decorators import cache
import catalogue.models
from wolnelektury.utils import is_ajax
from rest_framework import serializers
from rest_framework.permissions import SAFE_METHODS, IsAuthenticated, IsAuthenticatedOrReadOnly
from api.fields import AbsoluteURLField
+from catalogue.api.serializers import BookSerializer2
-class BookmarkSerializer(serializers.ModelSerializer):
+class BookmarkSerializerV3(serializers.ModelSerializer):
+ """Replaced in API v4."""
book = serializers.SlugRelatedField(
queryset=catalogue.models.Book.objects.all(), slug_field='slug',
required=False
read_only_fields = ['uuid', 'mode']
+class BookmarkSerializer(serializers.ModelSerializer):
+ book_slug = serializers.SlugRelatedField(
+ queryset=catalogue.models.Book.objects.all(), slug_field='slug',
+ write_only=True,
+ required=False
+ )
+ book = BookSerializer2(read_only=True)
+ href = AbsoluteURLField(view_name='api_bookmark', view_args=['uuid'])
+ timestamp = serializers.IntegerField(required=False)
+ location = serializers.CharField(required=False)
+
+ class Meta:
+ model = models.Bookmark
+ fields = ['book_slug', 'book', 'anchor', 'audio_timestamp', 'mode', 'note', 'href', 'uuid', 'location', 'timestamp', 'deleted']
+ read_only_fields = ['uuid', 'mode']
+
+ def create(self, validated_data):
+ book = validated_data.pop('book_slug', None)
+ if book is not None:
+ validated_data['book'] = book
+ return super().create(validated_data)
+
+ def update(self, instance, validated_data):
+ book = validated_data.pop('book_slug', None)
+ if book is not None:
+ validated_data['book'] = book
+ return super().update(instance, validated_data)
@never_cache
class BookmarksView(ListCreateAPIView):
permission_classes = [IsAuthenticated]
- serializer_class = BookmarkSerializer
+ def get_serializer_class(self):
+ if self.request.version < 'v4':
+ return BookmarkSerializerV3
+ else:
+ return BookmarkSerializer
+
def get_queryset(self):
return self.request.user.bookmark_set.all()
@never_cache
class BookBookmarksView(ListAPIView):
permission_classes = [IsAuthenticated]
- serializer_class = BookmarkSerializer
pagination_class = None
+ def get_serializer_class(self):
+ if self.request.version < 'v4':
+ return BookmarkSerializerV3
+ else:
+ return BookmarkSerializer
+
def get_queryset(self):
return self.request.user.bookmark_set.filter(book__slug=self.kwargs['book'])
@never_cache
class BookmarkView(RetrieveUpdateDestroyAPIView):
permission_classes = [IsAuthenticatedOrReadOnly]
- serializer_class = BookmarkSerializer
lookup_field = 'uuid'
+ def get_serializer_class(self):
+ if self.request.version < 'v4':
+ return BookmarkSerializerV3
+ else:
+ return BookmarkSerializer
+
def get_queryset(self):
if self.request.method in SAFE_METHODS:
q = Q(deleted=False)
return models.Bookmark.objects.filter(q)
else:
return self.request.user.bookmark_set.all()
+
+ def perform_destroy(self, instance):
+ instance.deleted = True
+ instance.updated_at = now()
+ instance.save()