This commit is contained in:
2026-02-12 22:00:17 +08:00
parent dc845d46e1
commit 6e26f66338
2 changed files with 19 additions and 1 deletions

View File

@@ -1,15 +1,31 @@
from rest_framework import serializers from rest_framework import serializers
from .models import Activity, ActivitySignup, Topic, Reply, TopicMedia, Announcement from .models import Activity, ActivitySignup, Topic, Reply, TopicMedia, Announcement
from shop.serializers import WeChatUserSerializer, ESP32ConfigSerializer, ServiceSerializer, VCCourseSerializer from shop.serializers import WeChatUserSerializer, ESP32ConfigSerializer, ServiceSerializer, VCCourseSerializer
from .utils import get_current_wechat_user
class ActivitySerializer(serializers.ModelSerializer): class ActivitySerializer(serializers.ModelSerializer):
display_banner_url = serializers.ReadOnlyField() display_banner_url = serializers.ReadOnlyField()
signup_form_config = serializers.SerializerMethodField() signup_form_config = serializers.SerializerMethodField()
current_signups = serializers.SerializerMethodField()
has_signed_up = serializers.SerializerMethodField()
class Meta: class Meta:
model = Activity model = Activity
fields = '__all__' 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): def get_signup_form_config(self, obj):
# 1. 优先使用 JSON 配置 # 1. 优先使用 JSON 配置
if obj.signup_form_config: if obj.signup_form_config:

View File

@@ -34,7 +34,9 @@ class ActivityViewSet(viewsets.ReadOnlyModelViewSet):
if ActivitySignup.objects.filter(activity=activity, user=user).exists(): if ActivitySignup.objects.filter(activity=activity, user=user).exists():
return Response({'error': '您已报名该活动'}, status=400) 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) return Response({'error': '活动名额已满'}, status=400)
# Get signup info # Get signup info