Files
MathApp/accounts/management/commands/setup_supervisor_group.py

69 lines
3.1 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
گروهِ 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)
)