from rest_framework import permissions, viewsets from .models import Document from .serializers import DocumentDetailSerializer, DocumentListSerializer, DocumentUploadSerializer class IsOwnerOrPublic(permissions.BasePermission): """Allow access if user is owner or the document is public.""" def has_object_permission(self, request, view, obj: Document) -> bool: if request.method in permissions.SAFE_METHODS: return obj.is_public or obj.owner == request.user return obj.owner == request.user class DocumentViewSet(viewsets.ModelViewSet): """CRUD for documents with owner-scoping.""" permission_classes = [permissions.IsAuthenticated, IsOwnerOrPublic] def get_serializer_class(self): if self.action == "create": return DocumentUploadSerializer if self.action in ("retrieve", "update", "partial_update"): return DocumentDetailSerializer return DocumentListSerializer def get_queryset(self): user = self.request.user qs = Document.objects.select_related("owner") if self.action == "list": return qs.filter(owner=user) | qs.filter(is_public=True) return qs def perform_create(self, serializer): serializer.save(owner=self.request.user)