n
This commit is contained in:
@@ -1,15 +1,31 @@
|
||||
from rest_framework import serializers
|
||||
from .models import Activity, ActivitySignup, Topic, Reply, TopicMedia, Announcement
|
||||
from shop.serializers import WeChatUserSerializer, ESP32ConfigSerializer, ServiceSerializer, VCCourseSerializer
|
||||
from .utils import get_current_wechat_user
|
||||
|
||||
class ActivitySerializer(serializers.ModelSerializer):
|
||||
display_banner_url = serializers.ReadOnlyField()
|
||||
signup_form_config = serializers.SerializerMethodField()
|
||||
current_signups = serializers.SerializerMethodField()
|
||||
has_signed_up = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Activity
|
||||
fields = '__all__'
|
||||
|
||||
def get_current_signups(self, obj):
|
||||
# 统计非取消状态的报名人数
|
||||
return obj.signups.exclude(status='cancelled').count()
|
||||
|
||||
def get_has_signed_up(self, obj):
|
||||
request = self.context.get('request')
|
||||
if not request:
|
||||
return False
|
||||
user = get_current_wechat_user(request)
|
||||
if user:
|
||||
return obj.signups.filter(user=user).exists()
|
||||
return False
|
||||
|
||||
def get_signup_form_config(self, obj):
|
||||
# 1. 优先使用 JSON 配置
|
||||
if obj.signup_form_config:
|
||||
|
||||
@@ -34,7 +34,9 @@ class ActivityViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
if ActivitySignup.objects.filter(activity=activity, user=user).exists():
|
||||
return Response({'error': '您已报名该活动'}, status=400)
|
||||
|
||||
if activity.signups.count() >= activity.max_participants:
|
||||
# Check limit (exclude cancelled)
|
||||
current_count = activity.signups.exclude(status='cancelled').count()
|
||||
if current_count >= activity.max_participants:
|
||||
return Response({'error': '活动名额已满'}, status=400)
|
||||
|
||||
# Get signup info
|
||||
|
||||
Reference in New Issue
Block a user