Files
backend/core/apps/api/views/ad/ad.py
A'zamov Samandar f5766aa319 update
2025-12-06 21:50:28 +05:00

71 lines
2.3 KiB
Python

from rest_framework.viewsets import ReadOnlyModelViewSet
from rest_framework.permissions import AllowAny
from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiParameter
from django_core.mixins import BaseViewSetMixin
from core.apps.api.models import AdModel
from django_filters.rest_framework import DjangoFilterBackend
from core.apps.api.filters import AdFilter
from core.apps.api.serializers.ad.ad import (
AdListSerializer,
AdDetailSerializer,
AdCreateSerializer,
)
@extend_schema_view(
list=extend_schema(
summary="List all ads",
description="Get paginated list of all available ads with filtering options",
tags=["Ads"],
parameters=[
OpenApiParameter(
name="category",
description="Filter by category ID",
required=False,
type=int
),
OpenApiParameter(
name="min_price",
description="Minimum price filter",
required=False,
type=float
),
OpenApiParameter(
name="max_price",
description="Maximum price filter",
required=False,
type=float
),
]
),
retrieve=extend_schema(
summary="Get ad details",
description="Get detailed information about a specific ad including images, variants, and options",
tags=["Ads"]
),
)
class AdViewSet(BaseViewSetMixin, ReadOnlyModelViewSet):
"""
ViewSet for viewing and managing ads.
list: Get list of all available ads with filtering
retrieve: Get detailed information about a specific ad
"""
queryset = AdModel.objects.select_related(
"category", "user", "plan"
).prefetch_related(
"images", "variants", "options", "tags"
).filter(is_available=True).order_by("-created_at")
serializer_class = AdListSerializer
permission_classes = [AllowAny]
filter_backends = [DjangoFilterBackend]
filterset_class = AdFilter
def get_serializer_class(self):
if self.action == "retrieve":
return AdDetailSerializer
elif self.action == "create":
return AdCreateSerializer
return AdListSerializer