n
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user