""" گروهِ 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) )