update
This commit is contained in:
@@ -1,2 +1,2 @@
|
||||
from .home_api import * # noqa
|
||||
from .ad import * # noqa
|
||||
from .home_api import *
|
||||
from .ad import *
|
||||
|
||||
@@ -1,43 +1,70 @@
|
||||
from rest_framework.viewsets import ReadOnlyModelViewSet
|
||||
from rest_framework.permissions import AllowAny
|
||||
from drf_spectacular.utils import extend_schema
|
||||
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 (
|
||||
FullListAdSerializer,
|
||||
RetrieveAdSerializer,
|
||||
CreateAdSerializer,
|
||||
AdListSerializer,
|
||||
AdDetailSerializer,
|
||||
AdCreateSerializer,
|
||||
)
|
||||
|
||||
|
||||
@extend_schema(tags=["Ads"])
|
||||
class AdsView(BaseViewSetMixin, ReadOnlyModelViewSet):
|
||||
queryset = AdModel.objects.all().order_by("-created_at")
|
||||
serializer_class = FullListAdSerializer
|
||||
@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
|
||||
|
||||
action_permission_classes = {}
|
||||
action_serializer_class = {
|
||||
"list": FullListAdSerializer,
|
||||
"retrieve": RetrieveAdSerializer,
|
||||
"create": CreateAdSerializer,
|
||||
}
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
queryset = self.filter_queryset(self.get_queryset())
|
||||
page = self.paginate_queryset(queryset)
|
||||
|
||||
if page is not None:
|
||||
data = {"ads": page}
|
||||
serializer = FullListAdSerializer(data, context={"request": request})
|
||||
return self.get_paginated_response(serializer.data)
|
||||
|
||||
data = {"ads": queryset}
|
||||
serializer = FullListAdSerializer(data, context={"request": request})
|
||||
response = self.get_paginated_response(serializer.data)
|
||||
|
||||
return response
|
||||
def get_serializer_class(self):
|
||||
if self.action == "retrieve":
|
||||
return AdDetailSerializer
|
||||
elif self.action == "create":
|
||||
return AdCreateSerializer
|
||||
return AdListSerializer
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
from rest_framework.viewsets import ReadOnlyModelViewSet
|
||||
from rest_framework.permissions import AllowAny
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from drf_spectacular.utils import extend_schema, extend_schema_view
|
||||
from django_core.mixins import BaseViewSetMixin
|
||||
from core.apps.api.models import AdModel
|
||||
from core.apps.api.serializers.ad.home_api import (
|
||||
ListHomeAdSerializer,
|
||||
CreateHomeAdSerializer,
|
||||
RetrieveHomeAdSerializer,
|
||||
from core.apps.api.serializers.ad.home_api import HomeAdListSerializer
|
||||
|
||||
|
||||
@extend_schema_view(
|
||||
list=extend_schema(
|
||||
summary="Get home page ads",
|
||||
description="Get optimized list of ads for home page (latest 20 ads)",
|
||||
tags=["Home"]
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@extend_schema(tags=["Home Ad Api"])
|
||||
class HomeAdApiView(BaseViewSetMixin, ReadOnlyModelViewSet):
|
||||
queryset = AdModel.objects.all()
|
||||
serializer_class = ListHomeAdSerializer
|
||||
class HomeAdViewSet(BaseViewSetMixin, ReadOnlyModelViewSet):
|
||||
"""
|
||||
ViewSet for home page ads - optimized for performance
|
||||
|
||||
Returns latest 20 available ads without pagination
|
||||
"""
|
||||
queryset = AdModel.objects.select_related(
|
||||
"category", "user"
|
||||
).filter(
|
||||
is_available=True
|
||||
).order_by("-created_at")[:20]
|
||||
|
||||
serializer_class = HomeAdListSerializer
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
action_permission_classes = {}
|
||||
action_serializer_class = {
|
||||
"list": ListHomeAdSerializer,
|
||||
"retrieve": RetrieveHomeAdSerializer,
|
||||
"create": CreateHomeAdSerializer,
|
||||
}
|
||||
pagination_class = None # Disable pagination for home page
|
||||
|
||||
Reference in New Issue
Block a user