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