from django.db.models import Q from django_core.mixins import BaseViewSetMixin from django.shortcuts import get_object_or_404 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.permissions import AllowAny, IsAuthenticated from rest_framework.viewsets import ModelViewSet from rest_framework.generics import GenericAPIView from rest_framework.response import Response 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.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 = [ "registration_number", "contract_date", "object_inspection_date", "rate_date", "rate_report_date", "rate_object_name", "object_type", "object_owner_type", "object_location_province", "object_location_district", "object_location_city", "tex_passport_serie_num", "tex_passport_gived_date", "car_brand", "car_model", "car_number", "manufacture_year", "car_color", "property_rights", "form_ownership", "value_determined", "rate_type", "status", "created_at", "updated_at", ] ordering = ["-created_at"] action_permission_classes = {} action_serializer_class = { "list": ListAutoevaluationSerializer, "retrieve": RetrieveAutoevaluationSerializer, "create": CreateAutoevaluationSerializer, "update": UpdateAutoevaluationSerializer, "partial_update": UpdateAutoevaluationSerializer, } @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)