This commit is contained in:
A'zamov Samandar
2025-12-06 21:50:28 +05:00
parent 3aa20fdaa1
commit f5766aa319
140 changed files with 2376 additions and 1582 deletions

View File

@@ -0,0 +1 @@
from .feedback import *

View 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)