from rest_framework import permissions, status, viewsets from rest_framework.decorators import action from rest_framework.response import Response from apps.documents.models import Document from .models import Collection from .serializers import ( CollectionDetailSerializer, CollectionDocumentActionSerializer, CollectionSerializer, ) class CollectionViewSet(viewsets.ModelViewSet): """CRUD for user collections.""" permission_classes = [permissions.IsAuthenticated] def get_serializer_class(self): if self.action in ("retrieve", "update", "partial_update"): return CollectionDetailSerializer return CollectionSerializer def get_queryset(self): return Collection.objects.filter(owner=self.request.user).prefetch_related("documents") def perform_create(self, serializer): serializer.save(owner=self.request.user) @action(detail=True, methods=["post"]) def add_documents(self, request, pk=None): """Add documents to a collection.""" collection = self.get_object() serializer = CollectionDocumentActionSerializer(data=request.data) serializer.is_valid(raise_exception=True) docs = Document.objects.filter( id__in=serializer.validated_data["document_ids"], owner=request.user, ) collection.documents.add(*docs) return Response({"detail": f"Added {docs.count()} document(s)."}, status=status.HTTP_200_OK) @action(detail=True, methods=["post"]) def remove_documents(self, request, pk=None): """Remove documents from a collection.""" collection = self.get_object() serializer = CollectionDocumentActionSerializer(data=request.data) serializer.is_valid(raise_exception=True) collection.documents.remove(*serializer.validated_data["document_ids"]) return Response({"detail": "Documents removed."}, status=status.HTTP_200_OK)