sms 活动短信
All checks were successful
Deploy to Server / deploy (push) Successful in 24s

This commit is contained in:
jeremygan2021
2026-02-23 17:36:25 +08:00
parent 6b1fd43ec6
commit 21c1d6a22a
5 changed files with 61 additions and 6 deletions

View File

@@ -30,14 +30,14 @@ class TopicMediaInline(TabularInline):
@admin.register(Activity)
class ActivityAdmin(ModelAdmin):
list_display = ('title', 'banner_display', 'start_time', 'location', 'signup_count', 'is_active', 'auto_confirm', 'created_at')
list_filter = ('is_active', 'auto_confirm', 'start_time')
list_display = ('title', 'banner_display', 'start_time', 'location', 'signup_count', 'is_visible', 'is_active', 'auto_confirm', 'created_at')
list_filter = ('is_visible', 'is_active', 'auto_confirm', 'start_time')
search_fields = ('title', 'location')
inlines = [ActivitySignupInline]
fieldsets = (
('基本信息', {
'fields': ('title', 'description', 'banner', 'banner_url', 'is_active', 'auto_confirm')
'fields': ('title', 'description', 'banner', 'banner_url', 'is_visible', 'is_active', 'auto_confirm')
}),
('费用与时间', {
'fields': ('is_paid', 'price', 'start_time', 'end_time', 'location'),

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.1 on 2026-02-23 09:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('community', '0011_activity_auto_confirm_alter_activitysignup_status'),
]
operations = [
migrations.AddField(
model_name='activity',
name='is_visible',
field=models.BooleanField(default=True, help_text='关闭后将不在前端列表页显示', verbose_name='是否显示'),
),
]

View File

@@ -19,6 +19,7 @@ class Activity(models.Model):
price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="报名费用")
is_active = models.BooleanField(default=True, verbose_name="是否启用")
is_visible = models.BooleanField(default=True, verbose_name="是否显示", help_text="关闭后将不在前端列表页显示")
auto_confirm = models.BooleanField(default=False, verbose_name="无需审核", help_text="开启后,付费活动支付成功或免费活动报名后直接显示报名成功,不需要审核")
# 常用报名信息开关

View File

@@ -19,7 +19,7 @@ class ActivityViewSet(viewsets.ReadOnlyModelViewSet):
"""
社区活动接口
"""
queryset = Activity.objects.filter(is_active=True).order_by('-created_at')
queryset = Activity.objects.filter(is_active=True, is_visible=True).order_by('-created_at')
serializer_class = ActivitySerializer
def retrieve(self, request, *args, **kwargs):
@@ -198,6 +198,32 @@ class ActivityViewSet(viewsets.ReadOnlyModelViewSet):
signup_info=signup_info,
status=status_val
)
# Send SMS for free activity signup (if confirmed)
if status_val == 'confirmed':
try:
from shop.sms_utils import notify_user_activity_signup_success
# Mock an order object for the SMS template
# The template expects: customer_name, wechat_user, phone_number
class MockOrder:
def __init__(self, user, signup_info):
# Ensure we get the name and phone from signup_info first
# signup_info keys might vary, let's try common ones
self.customer_name = signup_info.get('name') or signup_info.get('username') or user.nickname or "用户"
self.wechat_user = user
self.phone_number = signup_info.get('phone') or signup_info.get('mobile') or user.phone_number or ""
mock_order = MockOrder(user, signup_info)
# Check if we have a valid phone number before sending
if mock_order.phone_number:
notify_user_activity_signup_success(mock_order, signup)
else:
print(f"Skipping SMS for signup {signup.id}: No phone number found")
except Exception as e:
print(f"发送免费活动报名短信失败: {str(e)}")
serializer = ActivitySignupSerializer(signup)
return Response(serializer.data, status=201)

View File

@@ -123,6 +123,16 @@ def notify_user_activity_signup_success(order, signup):
# 4. address
address = signup.activity.location or "线上活动"
# 5. Handle phone number format (remove +86 or spaces if any)
phone_number = str(order.phone_number) if order.phone_number else ""
if phone_number:
phone_number = phone_number.replace("+86", "").replace(" ", "").strip()
# Ensure phone number is valid (11 digits)
if not phone_number or len(phone_number) != 11 or not phone_number.isdigit():
print(f"无效的手机号: {phone_number}, 跳过短信发送")
return
params = {
"user_nick": user_nick or "用户",
"unit_name": unit_name,
@@ -130,5 +140,5 @@ def notify_user_activity_signup_success(order, signup):
"address": address
}
print(f"准备发送活动报名成功通知: {order.phone_number}")
send_sms(order.phone_number, "SMS_501990528", params)
print(f"准备发送活动报名成功通知: {phone_number}")
send_sms(phone_number, "SMS_501990528", params)