from django.db.models import Q from django.shortcuts import get_object_or_404 from django_core.mixins import BaseViewSetMixin from django_filters.rest_framework import DjangoFilterBackend from drf_spectacular.utils import extend_schema, OpenApiParameter from rest_framework import generics from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework.generics import GenericAPIView, ListAPIView from rest_framework.permissions import AllowAny, IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet from core.apps.accounts.choices import RoleChoice from core.apps.accounts.serializers.user import UserSerializer from core.apps.evaluation.filters.auto import AutoevaluationFilter from core.apps.evaluation.models import AutoEvaluationModel from core.apps.evaluation.serializers import auto as serializers, AutoEvaluationModelSerializer @extend_schema(tags=["AutoEvaluation"]) class AutoEvaluationView(BaseViewSetMixin, ModelViewSet): queryset = AutoEvaluationModel.objects.select_related( "valuation", "valuation__customer", "vehicle", ).filter(is_archived=False) serializer_class = serializers.ListAutoevaluationSerializer permission_classes = [AllowAny] filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_class = AutoevaluationFilter search_fields = [ "registration_number", "car_model", "car_brand", "car_number", ] ordering_fields = [ "id", "contract_date", "object_inspection_date", "object_owner_individual_person_passport_num", "object_owner_type", "object_owner_individual_person_f_name", "object_owner_individual_person_l_name", "object_owner_individual_person_p_name", "object_owner_legal_entity", "object_owner_legal_inn", "tex_passport_serie_num", "rating_goal", "object_location_province", "registration_number", "object_type", "object_type_display", "car_brand", "car_model", "car_number", "manufacture_year", "car_color", "status", "status_display", "created_at", "value_determined", "rate_type", ] ordering = ["-created_at"] action_permission_classes = {} action_serializer_class = { "list": serializers.ListAutoevaluationSerializer, "retrieve": serializers.RetrieveAutoevaluationSerializer, "create": serializers.CreateAutoevaluationSerializer, "update": serializers.UpdateAutoevaluationSerializer, "partial_update": serializers.UpdateAutoevaluationSerializer, } def serializer_context(self): return self.serializer_class(context={'request': self.request}) @extend_schema(tags=["AutoEvaluation"]) class AutoEvaluationSetAppraisersView(GenericAPIView): permission_classes = [IsAuthenticated] queryset = AutoEvaluationModel.objects.all() serializer_class = serializers.AutoEvaluationAppraisersSerializer def post(self, request, id): try: auto_evaluation = get_object_or_404(AutoEvaluationModel, id=id) serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) users = serializer.validated_data.get("users") auto_evaluation.appraisers.set(users) auto_evaluation.save() return Response({"success": True, "data": "Foydalanuvchilar muvaffaqiyatli qo'shildi"}) except Exception as e: return Response({"error": str(e)}, status=500) @extend_schema(tags=["AutoEvaluation"]) class AutoEvaluationRemoveAppraisersView(GenericAPIView): permission_classes = [IsAuthenticated] queryset = AutoEvaluationModel.objects.all() serializer_class = serializers.AutoEvaluationAppraisersSerializer def post(self, request, id): try: auto_evaluation = get_object_or_404(AutoEvaluationModel, id=id) serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) users = serializer.validated_data.get("users") auto_evaluation.appraisers.remove(*users) auto_evaluation.save() return Response({"success": True, "data": "Foydalanuvchilar muvaffaqiyatli o'chirildi"}) except Exception as e: return Response({"error": str(e)}, status=500) @extend_schema(tags=["AutoEvaluation"]) class AutoEvaluationListAppraisersView(GenericAPIView): permission_classes = [IsAuthenticated] queryset = AutoEvaluationModel.objects.all() serializer_class = UserSerializer @extend_schema( parameters=[ OpenApiParameter( name="search", type=str, description="Search query", required=False, ) ] ) def get(self, request, id): try: search_query = request.query_params.get("search", "") auto_evaluation = get_object_or_404(AutoEvaluationModel, id=id) query = auto_evaluation.appraisers.all() if search_query: query = query.filter( Q(phone__icontains=search_query) | Q(first_name__icontains=search_query) | Q(last_name__icontains=search_query) ) page = self.paginate_queryset(query) serializer = self.serializer_class(page, many=True) return self.get_paginated_response(serializer.data) except Exception as e: return Response({"error": str(e)}, status=500) @extend_schema(tags=["AutoEvaluation"]) class AutoEvaluationArchivedListAPIView(ListAPIView): permission_classes = [IsAuthenticated] serializer_class = serializers.ListAutoevaluationSerializer def get_queryset(self): return AutoEvaluationModel.objects.filter(is_archived=True) @extend_schema(tags=["AutoEvaluation"]) class AutoEvaluationArchiveAPIView(APIView): permission_classes = [IsAuthenticated] def post(self, request, pk): auto_evaluation = get_object_or_404(AutoEvaluationModel, pk=pk) auto_evaluation.is_archived = request.data["is_archived"] auto_evaluation.save() return Response( { "success": True, "status": auto_evaluation.status, "id": auto_evaluation.pk }, status=200 ) @extend_schema(tags=["AutoEvaluation"]) class AdminEvaluationsAPIView(generics.GenericAPIView): permission_classes = [IsAuthenticated] def get(self, request): if request.user.role != RoleChoice.ADMIN: return Response({'detail': 'Forbidden'}, status=403) auto_eval = AutoEvaluationModel.objects.filter( created_by=self.request.user ).select_related('appraisers').distinct() serializer = AutoEvaluationModelSerializer(auto_eval, many=True) return Response(serializer.data)