diff --git a/core/apps/evaluation/urls.py b/core/apps/evaluation/urls.py index 03382b3..a530b3c 100644 --- a/core/apps/evaluation/urls.py +++ b/core/apps/evaluation/urls.py @@ -28,6 +28,7 @@ from .views import ( AutoEvaluationRemoveAppraisersView, DidoxCompanyInfoAPIView, TechPassportAPIView, + EvaluationStatusChange, ) router = DefaultRouter() @@ -71,4 +72,6 @@ urlpatterns = [ TechPassportAPIView.as_view(), name="tech-passport" ), + path("evaluation-request//change-status/", EvaluationStatusChange.as_view(), + name="evaluation-change-status"), ] diff --git a/core/apps/evaluation/views/request.py b/core/apps/evaluation/views/request.py index a1c7a72..1548049 100644 --- a/core/apps/evaluation/views/request.py +++ b/core/apps/evaluation/views/request.py @@ -1,3 +1,5 @@ +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 @@ -5,6 +7,9 @@ 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 @@ -13,6 +18,7 @@ from core.apps.evaluation.serializers.request import ( ListEvaluationrequestSerializer, RetrieveEvaluationrequestSerializer, ) +from core.apps.evaluation.choices.request import RequestStatus # class RequestPagination(PageNumberPagination): @@ -128,3 +134,41 @@ class AdminEvaluationrequestView(BaseViewSetMixin, ModelViewSet): 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 + }) \ No newline at end of file