From 6e26f663387c9e8a4799accba49b9e89c0c1d285 Mon Sep 17 00:00:00 2001 From: Therainclouds <245141853@qq.com> Date: Thu, 12 Feb 2026 22:00:17 +0800 Subject: [PATCH] n --- backend/community/serializers.py | 16 ++++++++++++++++ backend/community/views.py | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/backend/community/serializers.py b/backend/community/serializers.py index a1f5724..33539ba 100644 --- a/backend/community/serializers.py +++ b/backend/community/serializers.py @@ -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: diff --git a/backend/community/views.py b/backend/community/views.py index e9f9a88..c854d72 100644 --- a/backend/community/views.py +++ b/backend/community/views.py @@ -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