from django_core.mixins import BaseViewSetMixin from django_filters.rest_framework import DjangoFilterBackend from drf_spectacular.utils import extend_schema, OpenApiResponse from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework.parsers import FormParser, MultiPartParser from rest_framework.permissions import AllowAny, IsAuthenticated from rest_framework.viewsets import ModelViewSet from rest_framework.generics import GenericAPIView from rest_framework.response import Response from rest_framework import status from django.shortcuts import get_object_or_404 from core.apps.evaluation.filters.quick import QuickevaluationFilter from core.apps.evaluation.models import QuickEvaluationModel from core.apps.evaluation.serializers.quick import ( CreateQuickevaluationSerializer, ListQuickevaluationSerializer, RetrieveQuickevaluationSerializer, ArchiveQuickevaluationSerializer, ) @extend_schema(tags=["QuickEvaluation"]) class QuickEvaluationView(BaseViewSetMixin, ModelViewSet): queryset = QuickEvaluationModel.objects.select_related( "created_by", "brand", "marka", "color", "fuel_type", "body_type", "state_car", "car_position", ).filter(is_archive=False) serializer_class = ListQuickevaluationSerializer permission_classes = [AllowAny] parser_classes = [MultiPartParser, FormParser] filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_class = QuickevaluationFilter search_fields = ["car_number", "marka__name", "brand__name"] ordering_fields = [ "created_at", "updated_at", "car_number", "brand__name", "marka__name", "car_type", "car_manufactured_date", "color__name", "fuel_type__name", "state_car__name", "status", "distance_covered", ] ordering = ["-created_at"] action_permission_classes = {} action_serializer_class = { "list": ListQuickevaluationSerializer, "retrieve": RetrieveQuickevaluationSerializer, "create": CreateQuickevaluationSerializer, } @extend_schema(tags=["QuickEvaluation"]) class ArchiveQuickEvaluationView(GenericAPIView): permission_classes = [IsAuthenticated] def get_serializer_class(self): if self.request.method == "GET": return ListQuickevaluationSerializer return ArchiveQuickevaluationSerializer @extend_schema( tags=["QuickEvaluation"], summary="Get archived quick evaluations list", description=""" Returns only archived quick evaluations. This endpoint works like quick-evaluation/, but only records with is_archive=True are returned. """, responses={200: ListQuickevaluationSerializer(many=True)}, ) def get(self, request, *args, **kwargs): queryset = QuickEvaluationModel.objects.filter( is_archive=True ).order_by("-created_at") serializer = self.get_serializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) @extend_schema( tags=["QuickEvaluation"], summary="Archive or unarchive quick evaluation", description=""" Update archive status for quick evaluation. - is_archive=true → archive - is_archive=false → remove from archive """, request=ArchiveQuickevaluationSerializer, responses={ 200: OpenApiResponse( description="Archive status updated successfully" ), 400: OpenApiResponse( description="Validation error" ), 404: OpenApiResponse( description="Quick evaluation not found" ), }, ) def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) validated_data = serializer.validated_data obj = get_object_or_404( QuickEvaluationModel, id=validated_data["id"] ) obj.is_archive = validated_data["is_archive"] obj.save(update_fields=["is_archive"]) return Response( { "success": True, "message": "Archive status updated successfully" }, status=status.HTTP_200_OK )