some improve

This commit is contained in:
javad committed 2026-10-27 11:49:09 +03:30
1 parent fa73a734a0
commit 2e5d0bcdd3
17 files changed
+1512 -226

No files matched your search

@@ -0,0 +1,113 @@
"""افزودن نوع پیامک ``install_created`` («ثبت نصب — اقدام از نوع نصب»).
**این مهاجرت هیچ دادهٔ موجودی را تغییر نمی‌دهد.** سه کار انجام می‌شود:
۱. ``choices`` سه فیلد ``sms_type`` (قالب، تنظیم مشتری، صف) به ۸ نوع گسترش
می‌یابد تا مقدار جدید در پنل/اعتبارسنجی معتبر باشد. ``AlterField`` فقط
متادیتای ستون را عوض می‌کند و به ارزش ردیف‌ها دست نمی‌زند.
۲. **فقط** یک قالب تازه برای نوع جدید ساخته می‌شود (``get_or_create``): اگر از
قبل وجود داشته باشد، هیچ فیلدی از آن بازنویسی نمی‌شود.
* ``is_enabled=True`` ⇒ از پنل قالب‌ها دیده/ویرایش شود.
* ``auto_send=False`` (صریح) ⇒ در صف «در انتظار تأیید» می‌ماند تا مدیر خودش
تأیید/ارسال کند؛ هیچ پیامکی ناخواسته ارسال نمی‌شود.
۳. قالب‌های هفت نوع قبلی حتی لمس هم نمی‌شوند: در این فایل هیچ ``update``/``save``
روی آن‌ها وجود ندارد.
متغیرهای متنی همان ``{name}`` و ``{date}`` هستند؛ نیازی به تغییر ساختار نیست.
"""
from django.db import migrations, models
SMS_TYPE_CHOICES = [
("welcome", "خوش‌آمدگویی (ایجاد مشتری)"),
("survey", "نظرسنجی پس از ثبت فاکتور"),
("cheque_registration", "یادآوری تأمین موجودی چک"),
("visit", "یادآوری بازدید خدمات دستگاه"),
("visit_created", "ثبت بازدید (اقدام از نوع بازدید)"),
("install_created", "ثبت نصب (اقدام از نوع نصب)"),
("payment_thanks", "تشکر از پرداخت"),
("nesiye_due", "یادآوری سررسید نسیه"),
]
NEW_SMS_TYPE = "install_created"
# قالب پیش‌فرض نوع جدید. متن مشابه «ثبت بازدید» است تا لحن پیام‌ها یکدست بماند.
INSTALL_TEMPLATE = {
"title": "ثبت نصب",
"text": "{name} عزیز، نصب شما برای تاریخ {date} ثبت شد. "
"از همکاری شما سپاسگزاریم.",
"is_enabled": True,
# خاموش: پیامک در «در انتظار تأیید» می‌ماند (رفتار پیش‌فرض امن پروژه).
"auto_send": False,
"offset_days": 0,
"repeat_interval_days": None,
"repeat_interval_months": None,
}
def seed_install_template(apps, schema_editor):
"""ایجاد قالب «ثبت نصب» اگر وجود ندارد (اجرای دوباره بی‌خطر است).
``get_or_create`` عمداً بدون هیچ ``update`` است: قالب‌های موجود (هر هفت نوع
قبلی) و حتی خودِ ``install_created`` اگر از قبل باشد، دست‌نخورده می‌مانند.
"""
SMSTemplate = apps.get_model("admin_panel", "SMSTemplate")
SMSTemplate.objects.get_or_create(
sms_type=NEW_SMS_TYPE,
defaults={
"title": INSTALL_TEMPLATE["title"],
"text": INSTALL_TEMPLATE["text"],
"is_enabled": INSTALL_TEMPLATE["is_enabled"],
"auto_send": INSTALL_TEMPLATE["auto_send"],
"offset_days": INSTALL_TEMPLATE["offset_days"],
"repeat_interval_days": INSTALL_TEMPLATE["repeat_interval_days"],
"repeat_interval_months": INSTALL_TEMPLATE["repeat_interval_months"],
},
)
def drop_install_template(apps, schema_editor):
"""بازگشت: فقط ردیف‌های همان نوع جدید حذف می‌شوند.
سایر قالب‌ها و تنظیم‌های مشتری دست نمی‌خورند.
"""
apps.get_model("admin_panel", "SMSTemplate").objects.filter(
sms_type=NEW_SMS_TYPE,
).delete()
apps.get_model("admin_panel", "CustomerSMSSetting").objects.filter(
sms_type=NEW_SMS_TYPE,
).delete()
class Migration(migrations.Migration):
dependencies = [
("admin_panel", "0080_action_soft_delete"),
]
operations = [
migrations.AlterField(
model_name="smstemplate",
name="sms_type",
field=models.CharField(
choices=SMS_TYPE_CHOICES, max_length=40, unique=True,
verbose_name="نوع پیامک",
),
),
migrations.AlterField(
model_name="customersmssetting",
name="sms_type",
field=models.CharField(
choices=SMS_TYPE_CHOICES, max_length=40, verbose_name="نوع پیامک",
),
),
migrations.AlterField(
model_name="smsqueue",
name="sms_type",
field=models.CharField(
blank=True, choices=SMS_TYPE_CHOICES, default="", max_length=40,
verbose_name="نوع",
),
),
migrations.RunPython(seed_install_template, drop_install_template),
]