This commit is contained in:
A'zamov Samandar
2025-12-06 21:50:28 +05:00
parent 3aa20fdaa1
commit f5766aa319
140 changed files with 2376 additions and 1582 deletions

View File

@@ -1,2 +1,2 @@
from .home_api import * # noqa
from .ad import * # noqa
from .home_api import *
from .ad import *

View File

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

View File

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