X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/d2a9ebf1eae1ee5fa8a09a7dfea76995274f7716..cba9f6f86615660a7dd4d63def4cbf9c6751e928:/src/bookmarks/api/views.py diff --git a/src/bookmarks/api/views.py b/src/bookmarks/api/views.py index b500a6654..6aeb82de8 100644 --- a/src/bookmarks/api/views.py +++ b/src/bookmarks/api/views.py @@ -3,6 +3,7 @@ from api.utils import never_cache 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 @@ -13,9 +14,11 @@ from rest_framework.generics import ListAPIView, ListCreateAPIView, RetrieveUpda 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 @@ -30,12 +33,44 @@ class BookmarkSerializer(serializers.ModelSerializer): 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() @@ -46,9 +81,14 @@ class BookmarksView(ListCreateAPIView): @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']) @@ -56,9 +96,14 @@ class BookBookmarksView(ListAPIView): @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) @@ -67,3 +112,8 @@ class BookmarkView(RetrieveUpdateDestroyAPIView): 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()