Files
chengshishouce/city-manual/backend/regions/views.py

108 lines
4.0 KiB
Python
Raw Normal View History

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')