Files
backend-v1/core/apps/evaluation/views/request.py
xoliqberdiyev a6e0fca165 fix 500 error
2026-04-27 16:59:21 +05:00

194 lines
6.0 KiB
Python

# 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
).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
)