Add campaigns/ Add supervisor/ Add messaging features/ Separate SMS

This commit is contained in:
2026-08-25 03:39:41 +03:30
parent 80298b47b1
commit a9200772a3
27 changed files with 2337 additions and 49 deletions

View File

View File

View File

@@ -0,0 +1,68 @@
"""
گروهِ Supervisor رو (اگه از قبل نبود) می‌سازه و *فقط* پرمیشنِ استانداردِ
view_* رو، دقیقاً روی همون چهار مدلی که صفحه‌ی /admin/supervisor/ بهشون
لینک می‌ده، بهش می‌ده: accounts.User، payment.Order، payment.Transaction،
subscription.Subscription. هیچ پرمیشنِ add/change/delete‌ای ست نمی‌شه.
اجرا (یک‌بار، بعد از migrate):
python manage.py setup_supervisor_group
idempotent است: هر بار که دوباره اجرا بشه، مجموعه‌ی پرمیشن‌های گروه رو
دقیقاً با همین لیست sync می‌کنه (group.permissions.set)، یعنی اگه کسی
دستی یک پرمیشنِ change/delete به این گروه اضافه کرده باشه، اجرای دوباره‌ی
این دستور خودش رو تصحیح می‌کنه.
پرمیشن‌های view_* توسطِ خودِ جنگو، بعد از migrate کاملِ هر اپ، اتوماتیک
ساخته می‌شن (django.contrib.auth's post_migrate signal)؛ برای همین این
منطق در یک management command جداگونه‌ست، نه یک data migration — چون در
لحظه‌ی اجرای یک data migration ممکنه اون پرمیشن‌ها هنوز ساخته نشده باشن.
"""
from django.contrib.auth.models import Group, Permission
from django.core.management.base import BaseCommand
from accounts.admin import SUPERVISOR_GROUP_NAME
SUPERVISOR_VIEW_PERMISSIONS = [
('accounts', 'user'),
('payment', 'order'),
('payment', 'transaction'),
('subscription', 'subscription'),
]
class Command(BaseCommand):
help = (
'گروهِ Supervisor رو می‌سازه/sync می‌کنه و فقط پرمیشنِ view_* رو '
'روی User/Order/Transaction/Subscription بهش می‌ده (بدونِ '
'add/change/delete). idempotent است.'
)
def handle(self, *args, **options):
group, created = Group.objects.get_or_create(name=SUPERVISOR_GROUP_NAME)
permissions = []
missing = []
for app_label, model_name in SUPERVISOR_VIEW_PERMISSIONS:
codename = f'view_{model_name}'
try:
permissions.append(
Permission.objects.get(content_type__app_label=app_label, codename=codename)
)
except Permission.DoesNotExist:
missing.append(f'{app_label}.{codename}')
group.permissions.set(permissions)
if created:
self.stdout.write(self.style.SUCCESS(f'گروهِ "{SUPERVISOR_GROUP_NAME}" ساخته شد.'))
else:
self.stdout.write(f'گروهِ "{SUPERVISOR_GROUP_NAME}" از قبل وجود داشت؛ پرمیشن‌ها sync شدن.')
self.stdout.write(
f'{len(permissions)} پرمیشنِ view-only به گروه اختصاص داده شد (بدونِ add/change/delete).'
)
if missing:
self.stderr.write(
'این پرمیشن‌ها پیدا نشدن (migrate کامل اجرا شده؟): ' + ', '.join(missing)
)