From 3a08c81ff3e2ba87bceb403cdb90b31139b92df4 Mon Sep 17 00:00:00 2001 From: komoliddin Date: Thu, 23 Apr 2026 12:23:55 +0500 Subject: [PATCH] Add is_archive field to EvaluationRequest model. Write apis for update is_archive and list archived requests --- .../0032_evaluationrequestmodel_is_archive.py | 18 +++++ core/apps/evaluation/models/request.py | 4 + .../serializers/request/EvaluationRequest.py | 5 ++ core/apps/evaluation/urls.py | 2 + core/apps/evaluation/views/request.py | 78 ++++++++++++++++++- 5 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 core/apps/evaluation/migrations/0032_evaluationrequestmodel_is_archive.py diff --git a/core/apps/evaluation/migrations/0032_evaluationrequestmodel_is_archive.py b/core/apps/evaluation/migrations/0032_evaluationrequestmodel_is_archive.py new file mode 100644 index 0000000..edb3779 --- /dev/null +++ b/core/apps/evaluation/migrations/0032_evaluationrequestmodel_is_archive.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.4 on 2026-04-23 07:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('evaluation', '0031_remove_autoevaluationmodel_object_location_city_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='evaluationrequestmodel', + name='is_archive', + field=models.BooleanField(default=False, verbose_name='is archive'), + ), + ] diff --git a/core/apps/evaluation/models/request.py b/core/apps/evaluation/models/request.py index baf6c14..a26c7d0 100644 --- a/core/apps/evaluation/models/request.py +++ b/core/apps/evaluation/models/request.py @@ -118,6 +118,10 @@ class EvaluationrequestModel(AbstractBaseModel): choices=RequestStatus.choices, default=RequestStatus.PENDING, ) + is_archive = models.BooleanField( + verbose_name=_("is archive"), + default=False, + ) def __str__(self): return f"Requests #{self.pk} — {self.get_rate_type_display()}" diff --git a/core/apps/evaluation/serializers/request/EvaluationRequest.py b/core/apps/evaluation/serializers/request/EvaluationRequest.py index 368af46..3554f9b 100644 --- a/core/apps/evaluation/serializers/request/EvaluationRequest.py +++ b/core/apps/evaluation/serializers/request/EvaluationRequest.py @@ -55,6 +55,7 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer): "user", "created_at", "updated_at", + "is_archive", ] def get_location(self, obj): @@ -183,3 +184,7 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer): validated_data["location_name"] = str(location_name) validated_data["user"] = self.context["request"].user return super().create(validated_data) + +class ArchiveEvaluationrequestSerializer(serializers.Serializer): + id = serializers.IntegerField(required=True) + is_archive = serializers.BooleanField(required=True) \ No newline at end of file diff --git a/core/apps/evaluation/urls.py b/core/apps/evaluation/urls.py index a530b3c..969ddde 100644 --- a/core/apps/evaluation/urls.py +++ b/core/apps/evaluation/urls.py @@ -29,6 +29,7 @@ from .views import ( DidoxCompanyInfoAPIView, TechPassportAPIView, EvaluationStatusChange, + ArchiveEvaluationrequestView, ) router = DefaultRouter() @@ -74,4 +75,5 @@ urlpatterns = [ ), path("evaluation-request//change-status/", EvaluationStatusChange.as_view(), name="evaluation-change-status"), + path("evaluation-request/archive/", ArchiveEvaluationrequestView.as_view(), name="evaluation-request-archive"), ] diff --git a/core/apps/evaluation/views/request.py b/core/apps/evaluation/views/request.py index 1548049..0675d6a 100644 --- a/core/apps/evaluation/views/request.py +++ b/core/apps/evaluation/views/request.py @@ -17,8 +17,11 @@ 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): @@ -171,4 +174,77 @@ class EvaluationStatusChange(APIView): 'success': True, 'status': evaluation.status, 'id': evaluation.pk - }) \ No newline at end of file + }) + +@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 + ) \ No newline at end of file