from rest_framework import viewsets, permissions, status from rest_framework.response import Response from rest_framework.decorators import action from django.utils import timezone from .models import Region, ModeratorApplication, ModeratorPermission, ModeratorSupport from .serializers import RegionSerializer, RegionDetailSerializer, ModeratorApplicationSerializer, ModeratorPermissionSerializer class RegionViewSet(viewsets.ModelViewSet): queryset = Region.objects.filter(is_active=True) serializer_class = RegionSerializer permission_classes = [permissions.AllowAny] def get_serializer_class(self): if self.action == 'retrieve': return RegionDetailSerializer return RegionSerializer @action(detail=False, methods=['get']) def provinces(self, request): provinces = Region.objects.filter(level='province', is_active=True) serializer = self.get_serializer(provinces, many=True) return Response(serializer.data) @action(detail=True, methods=['get']) def children(self, request, pk=None): region = self.get_object() children = region.children.filter(is_active=True) serializer = self.get_serializer(children, many=True) return Response(serializer.data) class ModeratorApplicationViewSet(viewsets.ModelViewSet): queryset = ModeratorApplication.objects.all() serializer_class = ModeratorApplicationSerializer permission_classes = [permissions.IsAuthenticatedOrReadOnly] def perform_create(self, serializer): application = serializer.save(applicant=self.request.user) # 设置默认截止时间为 7 天后 application.deadline = timezone.now() + timezone.timedelta(days=7) application.save() @action(detail=True, methods=['post']) def support(self, request, pk=None): application = self.get_object() user = request.user # 检查是否已经支持过 if ModeratorSupport.objects.filter(supporter=user, application=application).exists(): return Response({'detail': '已经支持过该申请'}, status=status.HTTP_400_BAD_REQUEST) # 创建支持记录 ModeratorSupport.objects.create(supporter=user, application=application) application.support_count += 1 application.save() return Response({'support_count': application.support_count}) @action(detail=True, methods=['post']) def approve(self, request, pk=None): application = self.get_object() user = request.user # 检查权限 if not user.is_staff: return Response({'detail': '没有权限'}, status=status.HTTP_403_FORBIDDEN) application.status = 'approved' application.reviewer = user application.reviewed_at = timezone.now() application.save() # 创建版主权限 ModeratorPermission.objects.create( moderator=application.applicant, region=application.region, rank=self._get_rank_by_level(application.region.level) ) return Response({'detail': '申请已批准'}) @action(detail=True, methods=['post']) def reject(self, request, pk=None): application = self.get_object() user = request.user if not user.is_staff: return Response({'detail': '没有权限'}, status=status.HTTP_403_FORBIDDEN) application.status = 'rejected' application.reviewer = user application.reviewed_at = timezone.now() application.review_comment = request.data.get('comment', '') application.save() return Response({'detail': '申请已拒绝'}) def _get_rank_by_level(self, level): rank_map = { 'province': 'general', 'city': 'colonel', 'county': 'lieutenant', 'town': 'soldier', 'village': 'soldier', } return rank_map.get(level, 'soldier')