from django.shortcuts import get_object_or_404 from django_core.mixins import BaseViewSetMixin from drf_spectacular.utils import extend_schema, OpenApiParameter from rest_framework.exceptions import NotFound, PermissionDenied from rest_framework.permissions import AllowAny from rest_framework.viewsets import ReadOnlyModelViewSet, ModelViewSet from rest_framework.parsers import FormParser, MultiPartParser from rest_framework.decorators import action from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend from core.apps.evaluation.models import DocumentModel, ValuationDocumentModel, AutoEvaluationModel from core.apps.evaluation.serializers.document import ( CreateDocumentSerializer, CreateValuationdocumentSerializer, ListDocumentSerializer, ListValuationdocumentSerializer, RetrieveDocumentSerializer, RetrieveValuationdocumentSerializer, ) @extend_schema(tags=["ValuationDocument"]) class ValuationDocumentView(BaseViewSetMixin, ReadOnlyModelViewSet): queryset = ValuationDocumentModel.objects.all() serializer_class = ListValuationdocumentSerializer permission_classes = [AllowAny] action_permission_classes = {} action_serializer_class = { "list": ListValuationdocumentSerializer, "retrieve": RetrieveValuationdocumentSerializer, "create": CreateValuationdocumentSerializer, } @extend_schema(tags=["Document"]) class DocumentView(BaseViewSetMixin, ModelViewSet): queryset = DocumentModel.objects.all() serializer_class = ListDocumentSerializer permission_classes = [AllowAny] parser_classes = [FormParser, MultiPartParser] filter_backends = [DjangoFilterBackend] action_permission_classes = {} action_serializer_class = { "list": ListDocumentSerializer, "retrieve": RetrieveDocumentSerializer, "create": CreateDocumentSerializer, } @extend_schema( summary="Auto evaluation documents.", description="get auto evaluation documents.", parameters=[ OpenApiParameter( name="page", type=int, description="Page number" ), OpenApiParameter( name="page_size", type=int, description="Page size" ), OpenApiParameter( name="search", type=str, description="Search query" ), OpenApiParameter( name="category_id", type=str, description="Filter by category ID" ), ] ) @action(methods=["GET"], detail=False, url_path=r"auto_evaluation/(?P\d+)") def auto_evaluation(self, request, auto_evaluation_id=None): try: search = request.query_params.get("search", "") category_id = request.query_params.get("category_id", "") auto_evaluation = get_object_or_404(AutoEvaluationModel, id=auto_evaluation_id) documents = DocumentModel.objects.filter(auto_evaluation=auto_evaluation) if search: documents = documents.filter(title__icontains=search) if category_id: documents = documents.filter(category_id=category_id) page = self.paginate_queryset(documents) if page is not None: serializer = ListDocumentSerializer(page, many=True, context={"request": request}) return self.get_paginated_response(serializer.data) serializer = ListDocumentSerializer(documents, many=True, context={"request": request}) return Response(serializer.data) except AutoEvaluationModel.DoesNotExist: raise NotFound("Auto evaluation not found") except Exception as e: raise PermissionDenied(e)