You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

87 lines
3.3 KiB

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"})