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.permissions import IsAdminRole from core.apps.accounts.serializers.user import UserSerializer from core.apps.evaluation.filters.mechanic_auto import MechanicAutoevaluationFilter from core.apps.evaluation.models import MechanicAutoEvaluationModel from core.apps.evaluation.serializers.auto.MechanicAutoEvaluation import ( ListMechanicAutoevaluationSerializer, RetrieveMechanicAutoevaluationSerializer, CreateMechanicAutoevaluationSerializer, UpdateMechanicAutoevaluationSerializer, MechanicAutoEvaluationAppraisersSerializer, MechanicAutoEvaluationModelSerializer, ) @extend_schema(tags=["MechanicAutoEvaluation"]) class MechanicAutoEvaluationView(BaseViewSetMixin, ModelViewSet): queryset = MechanicAutoEvaluationModel.objects.select_related( "valuation", "valuation__customer", "vehicle", ).filter(is_archived=False) serializer_class = ListMechanicAutoevaluationSerializer permission_classes = [AllowAny] filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_class = MechanicAutoevaluationFilter 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", "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": ListMechanicAutoevaluationSerializer, "retrieve": RetrieveMechanicAutoevaluationSerializer, "create": CreateMechanicAutoevaluationSerializer, "update": UpdateMechanicAutoevaluationSerializer, "partial_update": UpdateMechanicAutoevaluationSerializer, } def serializer_context(self): return self.serializer_class(context={'request': self.request}) @extend_schema(tags=["MechanicAutoEvaluation"]) class MechanicAutoEvaluationSetAppraisersView(GenericAPIView): permission_classes = [IsAuthenticated] queryset = MechanicAutoEvaluationModel.objects.all() serializer_class = MechanicAutoEvaluationAppraisersSerializer def post(self, request, id): try: evaluation = get_object_or_404(MechanicAutoEvaluationModel, id=id) serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) users = serializer.validated_data.get("users") evaluation.appraisers.set(users) 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=["MechanicAutoEvaluation"]) class MechanicAutoEvaluationRemoveAppraisersView(GenericAPIView): permission_classes = [IsAuthenticated] queryset = MechanicAutoEvaluationModel.objects.all() serializer_class = MechanicAutoEvaluationAppraisersSerializer def post(self, request, id): try: evaluation = get_object_or_404(MechanicAutoEvaluationModel, id=id) serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) users = serializer.validated_data.get("users") evaluation.appraisers.remove(*users) 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=["MechanicAutoEvaluation"]) class MechanicAutoEvaluationListAppraisersView(GenericAPIView): permission_classes = [IsAuthenticated] queryset = MechanicAutoEvaluationModel.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", "") evaluation = get_object_or_404(MechanicAutoEvaluationModel, id=id) query = 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=["MechanicAutoEvaluation"]) class MechanicAutoEvaluationArchivedListAPIView(ListAPIView): permission_classes = [IsAuthenticated] serializer_class = ListMechanicAutoevaluationSerializer def get_queryset(self): return MechanicAutoEvaluationModel.objects.filter(is_archived=True) @extend_schema(tags=["MechanicAutoEvaluation"]) class MechanicAutoEvaluationArchiveAPIView(APIView): permission_classes = [IsAuthenticated] def post(self, request, pk): evaluation = get_object_or_404(MechanicAutoEvaluationModel, pk=pk) evaluation.is_archived = request.data["is_archived"] evaluation.save() return Response( { "success": True, "status": evaluation.status, "id": evaluation.pk }, status=200 ) @extend_schema(tags=["MechanicAutoEvaluation"]) class AdminMechanicEvaluationsAPIView(generics.GenericAPIView): permission_classes = [IsAuthenticated, IsAdminRole] queryset = MechanicAutoEvaluationModel.objects.all() serializer_class = MechanicAutoEvaluationModelSerializer def get(self, request): evaluations = MechanicAutoEvaluationModel.objects.filter( created_by=self.request.user ).distinct() serializer = MechanicAutoEvaluationModelSerializer(evaluations, many=True) return Response(serializer.data)