from rest_framework.viewsets import ModelViewSet from rest_framework.permissions import IsAuthenticatedOrReadOnly, IsAuthenticated from rest_framework.decorators import action from rest_framework.response import Response from drf_spectacular.utils import extend_schema, extend_schema_view from django_core.mixins import BaseViewSetMixin from core.apps.api.models import FeedbackModel from core.apps.api.serializers.feedback import ( FeedbackListSerializer, FeedbackDetailSerializer, FeedbackCreateSerializer, FeedbackUpdateSerializer, ) @extend_schema_view( list=extend_schema( summary="List all feedbacks", description="Get list of all product feedbacks/reviews", tags=["Feedbacks"] ), retrieve=extend_schema( summary="Get feedback details", description="Get detailed information about a specific feedback", tags=["Feedbacks"], ), create=extend_schema( summary="Create feedback", description="Create a new feedback/review for a product", tags=["Feedbacks"] ), update=extend_schema(summary="Update feedback", description="Update your own feedback", tags=["Feedbacks"]), partial_update=extend_schema( summary="Partially update feedback", description="Partially update your own feedback", tags=["Feedbacks"] ), destroy=extend_schema(summary="Delete feedback", description="Delete your own feedback", tags=["Feedbacks"]), ) class FeedbackViewSet(BaseViewSetMixin, ModelViewSet): """ ViewSet for managing product feedbacks/reviews. Users can create, read, update and delete their own feedbacks. """ queryset = FeedbackModel.objects.select_related("user", "ad").prefetch_related("images").order_by("-created_at") permission_classes = [IsAuthenticatedOrReadOnly] def get_queryset(self): queryset = super().get_queryset() ad_id = self.request.query_params.get("ad") if ad_id: queryset = queryset.filter(ad_id=ad_id) user_id = self.request.query_params.get("user") if user_id: queryset = queryset.filter(user_id=user_id) star = self.request.query_params.get("star") if star: queryset = queryset.filter(star=star) return queryset def get_serializer_class(self): if self.action == "create": return FeedbackCreateSerializer elif self.action in ["update", "partial_update"]: return FeedbackUpdateSerializer elif self.action == "retrieve": return FeedbackDetailSerializer return FeedbackListSerializer def perform_create(self, serializer): serializer.save(user=self.request.user) def perform_update(self, serializer): if serializer.instance.user != self.request.user: raise PermissionError("You can only update your own feedback") serializer.save() def perform_destroy(self, instance): # Only allow users to delete their own feedback if instance.user != self.request.user: raise PermissionError("You can only delete your own feedback") instance.delete() @extend_schema( summary="Get my feedbacks", description="Get all feedbacks created by the current user", tags=["Feedbacks"] ) @action(detail=False, methods=["get"], permission_classes=[IsAuthenticated]) def my_feedbacks(self, request): """Get current user's feedbacks""" queryset = self.get_queryset().filter(user=request.user) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)