update
This commit is contained in:
1
core/apps/api/views/feedback/__init__.py
Normal file
1
core/apps/api/views/feedback/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .feedback import *
|
||||
95
core/apps/api/views/feedback/feedback.py
Normal file
95
core/apps/api/views/feedback/feedback.py
Normal file
@@ -0,0 +1,95 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user