From be0c96b28ad837a88a1dce3dcd85ce922f2ccbee Mon Sep 17 00:00:00 2001 From: xoliqberdiyev Date: Fri, 3 Apr 2026 16:41:39 +0500 Subject: [PATCH] feat: add filter and pagination to document api --- .../serializers/document/Document.py | 17 ++++++++- core/apps/evaluation/views/document.py | 38 ++++++++++++++++--- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/core/apps/evaluation/serializers/document/Document.py b/core/apps/evaluation/serializers/document/Document.py index 18d4e38..49bde23 100644 --- a/core/apps/evaluation/serializers/document/Document.py +++ b/core/apps/evaluation/serializers/document/Document.py @@ -21,9 +21,24 @@ class BaseDocumentSerializer(serializers.ModelSerializer): class ListDocumentSerializer(BaseDocumentSerializer): class Meta(BaseDocumentSerializer.Meta): ... - + def get_document(self, obj): + request = self.context.get("request") + if obj.document: + if request: + return request.build_absolute_uri(obj.document.url) + return obj.document.url + return None + class RetrieveDocumentSerializer(BaseDocumentSerializer): class Meta(BaseDocumentSerializer.Meta): ... + + def get_document(self, obj): + request = self.context.get("request") + if obj.document: + if request: + return request.build_absolute_uri(obj.document.url) + return obj.document.url + return None class CreateDocumentSerializer(BaseDocumentSerializer): diff --git a/core/apps/evaluation/views/document.py b/core/apps/evaluation/views/document.py index 977e835..062836a 100644 --- a/core/apps/evaluation/views/document.py +++ b/core/apps/evaluation/views/document.py @@ -1,12 +1,13 @@ from django.shortcuts import get_object_or_404 from django_core.mixins import BaseViewSetMixin -from drf_spectacular.utils import extend_schema +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 ( @@ -39,7 +40,7 @@ class DocumentView(BaseViewSetMixin, ModelViewSet): serializer_class = ListDocumentSerializer permission_classes = [AllowAny] parser_classes = [FormParser, MultiPartParser] - + filter_backends = [DjangoFilterBackend] action_permission_classes = {} action_serializer_class = { "list": ListDocumentSerializer, @@ -47,17 +48,44 @@ class DocumentView(BaseViewSetMixin, ModelViewSet): "create": CreateDocumentSerializer, } - @extend_schema(summary="Auto evaluation documents.", description="get auto evaluation documents.") + @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) + serializer = ListDocumentSerializer(page, many=True, context={"request": request}) return self.get_paginated_response(serializer.data) - serializer = ListDocumentSerializer(documents, many=True) + serializer = ListDocumentSerializer(documents, many=True, context={"request": request}) return Response(serializer.data) except AutoEvaluationModel.DoesNotExist: raise NotFound("Auto evaluation not found")