from rest_framework import viewsets, permissions from rest_framework.pagination import PageNumberPagination from rest_framework.response import Response from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi from chunyu_project.common_schemas import success_response from .models import Changelog from .serializers import ChangelogSerializer class ChangelogPagination(PageNumberPagination): page_size = 10 page_size_query_param = 'page_size' max_page_size = 100 def get_paginated_response(self, data): return Response({ 'code': 10000, 'message': 'Success', 'data': { 'count': self.page.paginator.count, 'next': self.get_next_link(), 'previous': self.get_previous_link(), 'results': data, } }) class ChangelogViewSet(viewsets.ModelViewSet): """更新日志 ViewSet""" queryset = Changelog.objects.filter(is_published=True) serializer_class = ChangelogSerializer permission_classes = [permissions.AllowAny] pagination_class = ChangelogPagination http_method_names = ['get'] def get_queryset(self): queryset = Changelog.objects.filter(is_published=True) update_type = self.request.query_params.get('update_type') if update_type: queryset = queryset.filter(update_type=update_type) return queryset.order_by('-published_at') @swagger_auto_schema( tags=['更新日志'], operation_summary='获取更新日志列表', operation_description='获取已发布的更新日志列表,支持分页和按类型筛选', manual_parameters=[ openapi.Parameter('update_type', openapi.IN_QUERY, description='更新类型筛选: new_feature/improvement/bug_fix/other', type=openapi.TYPE_STRING), openapi.Parameter('page', openapi.IN_QUERY, description='页码', type=openapi.TYPE_INTEGER), openapi.Parameter('page_size', openapi.IN_QUERY, description='每页数量', type=openapi.TYPE_INTEGER), ], responses={200: success_response} ) def list(self, request, *args, **kwargs): return super().list(request, *args, **kwargs) @swagger_auto_schema( tags=['更新日志'], operation_summary='获取更新日志详情', operation_description='获取指定更新日志的详细信息', manual_parameters=[ openapi.Parameter('pk', openapi.IN_PATH, description='更新日志ID', type=openapi.TYPE_INTEGER, required=True), ], responses={200: success_response} ) def retrieve(self, request, *args, **kwargs): return super().retrieve(request, *args, **kwargs)