# django from django.db.models.base import transaction from django.shortcuts import get_object_or_404 # django core from django_core.mixins import BaseViewSetMixin # django filters from django_filters.rest_framework import DjangoFilterBackend # swagger from drf_spectacular.utils import extend_schema # rest framework from rest_framework import status, filters, generics, permissions, views, viewsets from rest_framework.response import Response # core apps from core.apps.accounts.choices import RoleChoice from core.apps.evaluation.choices.request import RequestStatus from core.apps.evaluation.filters.request import EvaluationrequestFilter from core.apps.evaluation.models import EvaluationrequestModel from core.apps.evaluation.serializers import request as serializers @extend_schema(tags=["EvaluationRequest"]) class EvaluationrequestView(BaseViewSetMixin, viewsets.ModelViewSet): serializer_class = serializers.ListEvaluationrequestSerializer permission_classes = [permissions.IsAuthenticated] filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.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": serializers.ListEvaluationrequestSerializer, "retrieve": serializers.RetrieveEvaluationrequestSerializer, "create": serializers.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, is_archive=False ).order_by("-created_at") @extend_schema(tags=["EvaluationRequest"]) class AdminEvaluationrequestView(BaseViewSetMixin, viewsets.ModelViewSet): serializer_class = serializers.ListEvaluationrequestSerializer permission_classes = [permissions.IsAuthenticated] filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.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": serializers.ListEvaluationrequestSerializer, "retrieve": serializers.RetrieveEvaluationrequestSerializer, "create": serializers.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(views.APIView): permission_classes = [permissions.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 RequestEvaluationArchivedListAPIView(generics.ListAPIView): permission_classes = [permissions.IsAuthenticated] serializer_class = serializers.ListEvaluationrequestSerializer def get_queryset(self): return EvaluationrequestModel.objects.filter(is_archived=True) @extend_schema(tags=["EvaluationRequest"]) class RequestEvaluationArchiveAPIView(views.APIView): permission_classes = [permissions.IsAuthenticated] @transaction.atomic def post(self, request, pk): req_evaluation = get_object_or_404(EvaluationrequestModel, pk=pk) req_evaluation.is_archive = request.data["is_archived"] req_evaluation.save() return Response( { "success": True, "status": req_evaluation.status, "id": req_evaluation.pk }, status=status.HTTP_200_OK )