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 import status from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet 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.request import ( CreateEvaluationrequestSerializer, ListEvaluationrequestSerializer, RetrieveEvaluationrequestSerializer, ) # 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 })