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 .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:

View File

@@ -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