feat: 城市手册后端完成 - 用户/区域/内容/服务/审核系统
This commit is contained in:
107
city-manual/backend/regions/views.py
Normal file
107
city-manual/backend/regions/views.py
Normal file
@@ -0,0 +1,107 @@
|
||||
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')
|
||||
Reference in New Issue
Block a user