feat: add filter and pagination to document api

This commit is contained in:
xoliqberdiyev
2026-04-03 16:41:39 +05:00
parent 091ddb39ed
commit be0c96b28a
2 changed files with 49 additions and 6 deletions

View File

@@ -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):

View File

@@ -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<auto_evaluation_id>\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")