108 lines
4.0 KiB
Python
108 lines
4.0 KiB
Python
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')
|