96 lines
3.7 KiB
Python
96 lines
3.7 KiB
Python
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)
|