import requests 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.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.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 AutoEvaluationSerializer from core.apps.evaluation.serializers.auto import ( CreateAutoevaluationSerializer, ListAutoevaluationSerializer, RetrieveAutoevaluationSerializer, AutoEvaluationAppraisersSerializer, UpdateAutoevaluationSerializer ) @extend_schema(tags=["AutoEvaluation"]) class AutoEvaluationView(BaseViewSetMixin, ModelViewSet): queryset = AutoEvaluationModel.objects.select_related( "valuation", "valuation__customer", "vehicle", ).all() serializer_class = 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", "property_rights", "form_ownership", ] ordering = ["-created_at"] action_permission_classes = {} action_serializer_class = { "list": ListAutoevaluationSerializer, "retrieve": RetrieveAutoevaluationSerializer, "create": CreateAutoevaluationSerializer, "update": UpdateAutoevaluationSerializer, "partial_update": 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 = 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 = 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"], request=AutoEvaluationSerializer, ) class AutoEvaluationRequestView(APIView): authentication_classes = [] permission_classes = [AllowAny] def post(self, request): serializer = AutoEvaluationSerializer(data=request.data) if serializer.is_valid(): data = serializer.validated_data url = "https://uzxarid.felixits.uz/api/v1/ad/price-estimate/" response = requests.post(url, json=data) return Response({ "success": True, "external_status": response.status_code, "data": response.json(), }) return Response({"error": serializer.errors}, status=400) @extend_schema(tags=["AutoEvaluation"]) class GetArchivedEvaluation(ListAPIView): authentication_classes = [] permission_classes = [IsAuthenticated] def get_queryset(self): return AutoEvaluationModel.objects.filter(is_archived=True)