69 lines
3.1 KiB
Python
69 lines
3.1 KiB
Python
"""
|
||
گروهِ 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)
|
||
)
|