Python 3.11, relevant upgrades
[wolnelektury.git] / src / social / api / views.py
index 2c23835..a2d92cc 100644 (file)
@@ -1,10 +1,10 @@
 # This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
-from datetime import datetime
+from datetime import datetime, timezone
 from django.db.models import Q
 from django.http import Http404
-from django.utils.timezone import now, utc
+from django.utils.timezone import now
 from rest_framework.exceptions import MethodNotAllowed
 from rest_framework.generics import ListAPIView, ListCreateAPIView, RetrieveAPIView, RetrieveUpdateAPIView, RetrieveUpdateDestroyAPIView, get_object_or_404
 from rest_framework.permissions import SAFE_METHODS, IsAuthenticated, IsAuthenticatedOrReadOnly
@@ -21,7 +21,7 @@ from social.utils import likes
 from social import models
 import bookmarks.models
 from . import serializers
-from bookmarks.api.views import BookmarkSerializer
+from bookmarks.api.views import BookmarkSerializer, QuoteSerializer
 
 
 
@@ -187,12 +187,20 @@ class ListItemViewV2(APIView):
 @never_cache
 class ListItemListViewV3(ListCreateAPIView):
     permission_classes = [IsAuthenticatedOrReadOnly]
-    serializer_class = serializers.UserListItemSerializer
 
     def get_queryset(self):
         lst = get_userlist(self.kwargs['slug'], self.request)
         return lst.userlistitem_set.all().order_by('order')
 
+    def get_serializer_class(self):
+        if self.request.method == 'GET':
+            if self.request.version < 'v4':
+                return serializers.UserListItemReadSerializerV3
+            else:
+                return serializers.UserListItemReadSerializer
+        else:
+            return serializers.UserListItemSerializer
+    
     def get_serializer(self, *args, **kwargs):
         serializer_class = self.get_serializer_class()
         kwargs.setdefault('context', self.get_serializer_context())
@@ -207,10 +215,40 @@ class ListItemListViewV3(ListCreateAPIView):
         serializer.save(list=lst)
 
 
+@never_cache
+class ListItemsForBook(ListAPIView):
+    permission_classes = [IsAuthenticated]
+
+    def get_serializer_class(self):
+        if self.request.version < 'v4':
+            return serializers.UserListItemReadSerializerV3
+        else:
+            return serializers.UserListItemReadSerializer
+
+    def get_queryset(self):
+        book = get_object_or_404(catalogue.models.Book, slug=self.kwargs['book'])
+        return models.UserListItem.objects.filter(
+            list__user=self.request.user,
+            book=book,
+        )
+
+
+class ListItemsView(APIView):
+    permission_classes = [IsAuthenticated]
+
+    def delete(self, request):
+        if not isinstance(self.request.data, list):
+            return Response({"error": "no data"}, status=400)
+        models.UserListItem.objects.filter(
+            list__user=self.request.user,
+            uuid__in=self.request.data
+        ).delete()
+        return Response({})
+
+
 @never_cache
 class ListItemViewV3(RetrieveUpdateDestroyAPIView):
     permission_classes = [IsAuthenticated]
-    serializer_class = serializers.UserListItemSerializer
     lookup_field = 'uuid'
 
     def get_queryset(self):
@@ -218,6 +256,15 @@ class ListItemViewV3(RetrieveUpdateDestroyAPIView):
             list__user=self.request.user
         )
 
+    def get_serializer_class(self):
+        if self.request.method == 'GET':
+            if self.request.version < 'v4':
+                return serializers.UserListItemReadSerializerV3
+            else:
+                return serializers.UserListItemReadSerializer
+        else:
+            return serializers.UserListItemSerializer
+
 
 @vary_on_auth
 class ShelfView(ListAPIView):
@@ -308,7 +355,7 @@ class SyncView(ListAPIView):
         except:
             timestamp = 0
 
-        timestamp = datetime.fromtimestamp(timestamp, tz=utc)
+        timestamp = datetime.fromtimestamp(timestamp, tz=timezone.utc)
         
         data = []
         return self.get_queryset_for_ts(timestamp)
@@ -405,3 +452,11 @@ class BookmarkSyncView(SyncView):
             if data.get('location'):
                 ret = self.model.get_by_location(user, data['location'])
         return ret
+
+
+class QuoteSyncView(SyncView):
+    model = bookmarks.models.Quote
+    serializer_class = QuoteSerializer
+
+    sync_id_field = 'uuid'
+    sync_id_serializer_field = 'uuid'