Add campaigns/ Add supervisor/ Add messaging features/ Separate SMS
This commit is contained in:
28
campaigns/migrations/0001_initial.py
Normal file
28
campaigns/migrations/0001_initial.py
Normal file
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 5.2.17 on 2026-08-24 16:52
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='MessageCampaign',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=150)),
|
||||
('body', models.TextField()),
|
||||
('channel', models.CharField(choices=[('sms', 'پیامک'), ('in_app', 'اعلان داخل\u200cاپ')], max_length=10)),
|
||||
('target_filter', models.JSONField(blank=True, default=dict)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['-created_at'],
|
||||
},
|
||||
),
|
||||
]
|
||||
29
campaigns/migrations/0002_campaigndelivery.py
Normal file
29
campaigns/migrations/0002_campaigndelivery.py
Normal file
@@ -0,0 +1,29 @@
|
||||
# Generated by Django 5.2.17 on 2026-08-24 00:00
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('campaigns', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CampaignDelivery',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('user_id', models.IntegerField(db_index=True)),
|
||||
('channel', models.CharField(choices=[('sms', 'پیامک'), ('in_app', 'اعلان داخل\u200cاپ')], max_length=10)),
|
||||
('status', models.CharField(choices=[('pending', 'در انتظار'), ('sent', 'ارسال شد'), ('failed', 'ناموفق')], default='pending', max_length=10)),
|
||||
('error_message', models.CharField(blank=True, max_length=300)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('campaign', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='deliveries', to='campaigns.messagecampaign')),
|
||||
],
|
||||
options={
|
||||
'ordering': ['-created_at'],
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,30 @@
|
||||
# Generated manually for the campaign-delivery concurrency fix.
|
||||
#
|
||||
# اضافهکردنِ یک partial/conditional unique index روی
|
||||
# CampaignDelivery(campaign, user_id, channel) که فقط رکوردهایی با
|
||||
# status در ('pending', 'sent') رو محدود میکنه. رکوردهای failed از
|
||||
# این constraint مستثنا هستن تا رفتارِ retryِ فعلی (ساختنِ رکوردِ
|
||||
# pendingِ جدید بعد از یک تلاشِ ناموفق) بدونِ تغییر بمونه.
|
||||
#
|
||||
# این migration فقط یک constraint اضافه میکنه؛ هیچ فیلد/مدلِ جدیدی
|
||||
# نمیسازه و به دیتای موجود دست نمیزنه.
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('campaigns', '0002_campaigndelivery'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddConstraint(
|
||||
model_name='campaigndelivery',
|
||||
constraint=models.UniqueConstraint(
|
||||
condition=models.Q(status__in=['pending', 'sent']),
|
||||
fields=('campaign', 'user_id', 'channel'),
|
||||
name='campaigns_one_active_delivery_per_user_channel',
|
||||
),
|
||||
),
|
||||
]
|
||||
0
campaigns/migrations/__init__.py
Normal file
0
campaigns/migrations/__init__.py
Normal file
Reference in New Issue
Block a user