+
+
+@never_cache
+class MyLikesView(APIView):
+ permission_classes = [IsAuthenticated]
+
+ def get(self, request):
+ ids = catalogue.models.tag.TagRelation.objects.filter(tag__user=request.user).values_list('object_id', flat=True).distinct()
+ books = Book.objects.filter(id__in=ids)
+ books = {b.id: b.slug for b in books}
+ res = get_sets_for_book_ids(ids, request.user)
+ res = {books[bid]: v for bid, v in res.items()}
+
+ res = list(books.values())
+ res.sort()
+ return Response(res)
+
+
+class TaggedBooksField(serializers.Field):
+ def to_representation(self, value):
+ return catalogue.models.Book.tagged.with_all([value]).values_list('slug', flat=True)
+
+ def to_internal_value(self, value):
+ return {'books': catalogue.models.Book.objects.filter(slug__in=value)}
+
+
+class UserListSerializer(serializers.ModelSerializer):
+ books = TaggedBooksField(source='*')
+
+ class Meta:
+ model = catalogue.models.Tag
+ fields = ['name', 'slug', 'books']
+ read_only_fields = ['slug']
+
+ def create(self, validated_data):
+ instance = get_set(validated_data['user'], validated_data['name'])
+ catalogue.models.tag.TagRelation.objects.filter(tag=instance).delete()
+ for book in validated_data['books']:
+ catalogue.models.Tag.objects.add_tag(book, instance)
+ return instance
+
+ def update(self, instance, validated_data):
+ catalogue.models.tag.TagRelation.objects.filter(tag=instance).delete()
+ for book in validated_data['books']:
+ catalogue.models.Tag.objects.add_tag(book, instance)
+ return instance
+
+class UserListBooksSerializer(UserListSerializer):
+ class Meta:
+ model = catalogue.models.Tag
+ fields = ['books']
+
+
+@never_cache
+class ListsView(ListCreateAPIView):
+ permission_classes = [IsAuthenticated]
+ #pagination_class = None
+ serializer_class = UserListSerializer
+
+ def get_queryset(self):
+ return catalogue.models.Tag.objects.filter(user=self.request.user).exclude(name='')
+
+ def perform_create(self, serializer):
+ serializer.save(user=self.request.user)
+
+
+@never_cache
+class ListView(RetrieveUpdateDestroyAPIView):
+ # TODO: check if can modify
+ permission_classes = [IsAuthenticated]
+ serializer_class = UserListSerializer
+
+ def get_object(self):
+ return get_object_or_404(catalogue.models.Tag, slug=self.kwargs['slug'], user=self.request.user)
+
+ def perform_update(self, serializer):
+ serializer.save(user=self.request.user)
+
+ def post(self, request, slug):
+ serializer = UserListBooksSerializer(data=request.data)
+ serializer.is_valid(raise_exception=True)
+ instance = self.get_object()
+ for book in serializer.validated_data['books']:
+ catalogue.models.Tag.objects.add_tag(book, instance)
+ return Response(self.get_serializer(instance).data)
+
+
+@never_cache
+class ListItemView(APIView):
+ permission_classes = [IsAuthenticated]
+
+ def delete(self, request, slug, book):
+ instance = get_object_or_404(catalogue.models.Tag, slug=slug, user=self.request.user)
+ book = get_object_or_404(catalogue.models.Book, slug=book)
+ catalogue.models.Tag.objects.remove_tag(book, instance)
+ return Response(UserListSerializer(instance).data)