from django.db.models import Q from rest_framework.authentication import TokenAuthentication from rest_framework.parsers import FormParser, JSONParser, MultiPartParser from rest_framework.permissions import IsAuthenticated from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet from apps.account.permissions import IsSuperAdmin from utils.pagination import StandardResultsSetPagination from .models import Podcast, PodcastCollection, PodcastCategory from .serializers_admin import ( AdminPodcastCategorySerializer, AdminPodcastCollectionSerializer, AdminPodcastDetailSerializer, AdminPodcastListSerializer, ) class AdminPodcastCategoryViewSet(ReadOnlyModelViewSet): serializer_class = AdminPodcastCategorySerializer permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] pagination_class = None def get_queryset(self): return PodcastCategory.objects.all().order_by("title") class AdminPodcastCollectionViewSet(ReadOnlyModelViewSet): serializer_class = AdminPodcastCollectionSerializer permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] pagination_class = None def get_queryset(self): return PodcastCollection.objects.all().order_by("display_position", "order", "title") class AdminPodcastViewSet(ModelViewSet): permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] pagination_class = StandardResultsSetPagination parser_classes = (MultiPartParser, FormParser, JSONParser) def get_serializer_class(self): if self.action == "list": return AdminPodcastListSerializer return AdminPodcastDetailSerializer def get_queryset(self): queryset = Podcast.objects.all().prefetch_related("categories", "collections") search_query = self.request.query_params.get("search") if search_query: queryset = queryset.filter( Q(title__icontains=search_query) | Q(slug__icontains=search_query) | Q(description__icontains=search_query) ) status_filter = self.request.query_params.get("status") if status_filter in {"true", "false"}: queryset = queryset.filter(status=status_filter == "true") category_id = self.request.query_params.get("category") if category_id and category_id != "all": queryset = queryset.filter(categories__id=category_id) collection_id = self.request.query_params.get("collection") if collection_id and collection_id != "all": queryset = queryset.filter(collections__id=collection_id) return queryset.distinct().order_by("-created_at")