جلوگیری از حذف کاربر admin در django

جلوگیری از حذف کاربر admin در django

Django در حالت عادی اجزاه همه کاربرها رو میده. خیلی راحت کاربر ادمین از داشبود مدیریت میتونه همه کاربرها رو انتخاب و حذف کنه 🙂

خب خوشبینانه حتما دلیل برای این مورد وجود داره که من نمیدونم. ولی خب این مورد برای ما مساله ساز شده بود.

مشتری ما که اطلاعات فنی زیادی نداره چند بار اشتباها برای حذف یوزرهای تستی که بعد از تحویل پروژه ایجاد کرده بود کل یوزرها رو انتخاب و حذف کرده بود. در این حالت براحتی از طریق ترمینال با دستور زیر میتونید یک یوزر admin ایجاد کنید.

python manage.py createsuperuser

حالا راهکار برای جلوگیری از بروز این مشکل چیه؟

تو django یه ویژگی بسیار کاربردی به نام signal وجود داره و کارش اینه که میتونه هوک بشه به یکسری رویدادهای از پیش تعیین شده یا رویدادهای کاستوم که خودمون تعریف میکنیم.
مثلا میتونیم هوک کنیم به رویداد pre_delete که توسط خود Django ایجاد شده.در این حالت میتونیم قبل از حذف رکورد/رکوردهای یک مدل مشخص یک پردازش انجام بدیم و در یک شرایط خاص (مثلا اینکه رکورد مورد نظر ما یک کاربر ادمین هستش) نذاریم action در حال اجرا به اتمام برسه (یوزر پاک بشه).

طبق مثالی که زدم برای جلوگیری از حذف کاربر admin میتونیم از سیگنال pre_delete استفاده کنیم.

قطعه کد زیر رو توی models.py اپلیکیشن users قرار بدید و در ادامه توضیح کد رو بخونید:

@receiver(pre_delete, sender=User)
def delete_user(sender, instance, **kwargs):
    if instance.is_superuser and instance.username == 'admin':
        raise PermissionDenied

تو خط اول متدمون رو هوک میکنیم به سیگنال pre_delete و مدل User رو به عنوان پارامتر sender معرفی می کنیم. یعنی مدل User رو چک کن و قبل از حذف هر ریکورد متد من رو یکبار اجرا کن.

پارامترهای sender که اینجا همون مدل User هستش و instance که رکورد در حال حذف هستش به متد ما پاس داده میشه.

در خط های بعد نام کاربری رو(به شرط سوپریوزر بودن) چک میکنیم و اگر برابر admin بود PermissionDenied میدیم که در نتیجه صفحه permission denied به کاربر نشون داده میشه.

خوش باشی دولوپر جان 🙂

دیدگاه‌تان را بنویسید: