Add campaigns/ Add supervisor/ Add messaging features/ Separate SMS
This commit is contained in:
0
accounts/management/commands/__init__.py
Normal file
0
accounts/management/commands/__init__.py
Normal file
68
accounts/management/commands/setup_supervisor_group.py
Normal file
68
accounts/management/commands/setup_supervisor_group.py
Normal 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)
|
||||
)
|
||||
Reference in New Issue
Block a user