194 lines
6.0 KiB
Python
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
|
|
)
|