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 from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework.pagination import PageNumberPagination from rest_framework.permissions import AllowAny, IsAuthenticated from rest_framework.viewsets import ModelViewSet from rest_framework.response import Response from rest_framework.views import APIView from rest_framework import status from core.apps.evaluation.filters.request import EvaluationrequestFilter from core.apps.evaluation.models import EvaluationrequestModel from core.apps.evaluation.serializers.request import ( CreateEvaluationrequestSerializer, ListEvaluationrequestSerializer, RetrieveEvaluationrequestSerializer, ArchiveEvaluationrequestSerializer, ) from core.apps.evaluation.choices.request import RequestStatus from rest_framework.generics import GenericAPIView from drf_spectacular.utils import OpenApiResponse # class RequestPagination(PageNumberPagination): # page_size = 20 # page_size_query_param = "limit" # max_page_size = 100 @extend_schema(tags=["EvaluationRequest"]) class EvaluationrequestView(BaseViewSetMixin, ModelViewSet): serializer_class = ListEvaluationrequestSerializer permission_classes = [IsAuthenticated] # pagination_class = RequestPagination filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_class = EvaluationrequestFilter search_fields = [ "customer_inn_number", "owner_inn_number", "tex_passport", ] ordering_fields = [ "id", "rate_type", "rate_type_display", "object_type", "object_type_display", "customer_inn_number", "owner_inn_number", "tex_passport", "value_determined", "rate_goal", "property_rights", "form_ownership", "worked_hours", "chassi", "need_delivering", "location", "location_name", "status", "status_display", "user", "created_at", "updated_at", ] ordering = ["-created_at"] action_permission_classes = {} action_serializer_class = { "list": ListEvaluationrequestSerializer, "retrieve": RetrieveEvaluationrequestSerializer, "create": CreateEvaluationrequestSerializer, } def serializer_context(self): return self.serializer_class(context={"request": self.request}) def get_queryset(self): return EvaluationrequestModel.objects.filter( user=self.request.user ).order_by("-created_at") @extend_schema(tags=["EvaluationRequest"]) class AdminEvaluationrequestView(BaseViewSetMixin, ModelViewSet): serializer_class = ListEvaluationrequestSerializer permission_classes = [IsAuthenticated] # pagination_class = RequestPagination filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter] filterset_class = EvaluationrequestFilter search_fields = [ "customer_inn_number", "owner_inn_number", "tex_passport", ] ordering_fields = [ "id", "rate_type", "rate_type_display", "object_type", "object_type_display", "customer_inn_number", "owner_inn_number", "tex_passport", "value_determined", "rate_goal", "property_rights", "form_ownership", "worked_hours", "chassi", "need_delivering", "location", "location_name", "status", "status_display", "user", "created_at", "updated_at", ] ordering = ["-created_at"] action_permission_classes = {} action_serializer_class = { "list": ListEvaluationrequestSerializer, "retrieve": RetrieveEvaluationrequestSerializer, "create": CreateEvaluationrequestSerializer, } def get_queryset(self): return EvaluationrequestModel.objects.select_related("value_determined", "rate_goal", "property_rights", "form_ownership", "user").order_by("-created_at") def serializer_context(self): return self.serializer_class(context={"request": self.request}) @extend_schema(tags=["EvaluationRequest"]) class EvaluationStatusChange(APIView): permission_classes = [IsAuthenticated] def post(self, request, pk): if request.user.role not in [RoleChoice.ADMIN, RoleChoice.SUPERUSER]: return Response({'detail': 'Forbidden'}, status=status.HTTP_403_FORBIDDEN) evaluation = get_object_or_404(EvaluationrequestModel, pk=pk) status_value = request.data.get('status') if not status_value: return Response({'detail': 'Status is required'}, status=status.HTTP_400_BAD_REQUEST) valid_statuses = [ RequestStatus.PENDING, RequestStatus.IN_PROGRESS, RequestStatus.COMPLETED, RequestStatus.REJECTED ] if status_value not in valid_statuses: return Response( {'detail': f'Invalid status. Must be one of: {valid_statuses}'}, status=status.HTTP_400_BAD_REQUEST ) evaluation.status = status_value evaluation.save() return Response({ 'success': True, 'status': evaluation.status, 'id': evaluation.pk }) @extend_schema(tags=["EvaluationRequest"]) class ArchiveEvaluationrequestView(GenericAPIView): permission_classes = [IsAuthenticated] def get_serializer_class(self): if self.request.method == "GET": return ListEvaluationrequestSerializer return ArchiveEvaluationrequestSerializer @extend_schema( tags=["EvaluationRequest"], summary="Get archived evaluation requests list", description=""" Returns only archived evaluation requests. This endpoint works like evaluation-request/, but only records with is_archive=True are returned. """, responses={200: ListEvaluationrequestSerializer(many=True)}, ) def get(self, request, *args, **kwargs): queryset = EvaluationrequestModel.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=["EvaluationRequest"], summary="Archive or unarchive evaluation request", description=""" Update archive status for evaluation request. - is_archive=true → archive - is_archive=false → remove from archive """, request=ArchiveEvaluationrequestSerializer, responses={ 200: OpenApiResponse( description="Archive status updated successfully" ), 400: OpenApiResponse( description="Validation error" ), 404: OpenApiResponse( description="Evaluation request 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( EvaluationrequestModel, 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 )