from django.db.models import Q from rest_framework.authentication import TokenAuthentication from rest_framework.decorators import action from rest_framework.parsers import FormParser, JSONParser, MultiPartParser from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet from apps.account.permissions import IsSuperAdmin from utils.pagination import StandardResultsSetPagination from .models import Article, ArticleCategory, ArticleContent from .serializers_admin import ( AdminArticleCategorySerializer, AdminArticleContentSerializer, AdminArticleDetailSerializer, AdminArticleListSerializer, ) class AdminArticleCategoryViewSet(ReadOnlyModelViewSet): serializer_class = AdminArticleCategorySerializer permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] pagination_class = None def get_queryset(self): return ArticleCategory.objects.all().order_by("order", "title") class AdminArticleViewSet(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 AdminArticleListSerializer return AdminArticleDetailSerializer def get_queryset(self): queryset = Article.objects.all().prefetch_related("categories") 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) | Q(content__icontains=search_query) ) category_id = self.request.query_params.get("category") if category_id and category_id != "all": queryset = queryset.filter(categories__id=category_id) status_filter = self.request.query_params.get("status") if status_filter in {"true", "false"}: queryset = queryset.filter(status=status_filter == "true") return queryset.distinct().order_by("-created_at") class AdminArticleContentViewSet(ModelViewSet): serializer_class = AdminArticleContentSerializer permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] parser_classes = (JSONParser, MultiPartParser, FormParser) def get_queryset(self): queryset = ArticleContent.objects.all().prefetch_related("parts__text_sections") article_id = self.request.query_params.get("article_id") if article_id: queryset = queryset.filter(article_id=article_id) return queryset.order_by("priority", "created_at") @action(detail=False, methods=["post"]) def reorder(self, request): content_ids = request.data.get("content_ids", []) if not content_ids: return Response({"error": "content_ids list is required"}, status=400) for index, content_id in enumerate(content_ids, start=1): ArticleContent.objects.filter(id=content_id).update(priority=index) return Response({"status": "success"})