71 lines
2.3 KiB
Python
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
|