250 lines
7.7 KiB
Python
250 lines
7.7 KiB
Python
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
|
|
) |