You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

114 lines
4.0 KiB

"""
Middleware برای محدود کردن دسترسی به admin panel
"""
from django.shortcuts import redirect
from django.urls import reverse
from django.contrib import messages
from django.utils.translation import gettext_lazy as _
class AdminAccessMiddleware:
"""Middleware برای کنترل دسترسی به admin panel"""
def __init__(self, get_response):
self.get_response = get_response
# مدل‌هایی که استادان نباید به آنها دسترسی داشته باشند
self.restricted_models = [
'user',
'professoruser',
'studentuser',
'clientuser',
'transaction',
'transactionparticipant',
'book',
'bookcollection',
'article',
'podcast',
'chat',
'roommessage',
'hadis',
'hadiscategory',
'globalpreference',
'coursecategory',
]
# URL patterns که استادان نباید به آنها دسترسی داشته باشند
self.restricted_urls = [
'/admin/account/',
'/admin/transaction/',
'/admin/library/',
'/admin/article/',
'/admin/podcast/',
'/admin/chat/',
'/admin/hadis/',
'/admin/dynamic_preferences/',
'/admin/course/coursecategory/',
]
def __call__(self, request):
# بررسی دسترسی قبل از پردازش request
if self.should_restrict_access(request):
return self.handle_restricted_access(request)
response = self.get_response(request)
return response
def should_restrict_access(self, request):
"""آیا باید دسترسی محدود شود؟"""
# فقط برای admin URLs
if not request.path.startswith('/admin/'):
return False
# اولویت اول: staff یا admin - دسترسی کامل بدون محدودیت
if (request.user.is_authenticated and
(request.user.is_staff or
request.user.has_role('admin') or
request.user.has_role('super_admin'))):
return False
# اگر کاربر احراز هویت نشده، دسترسی ندارد
if not request.user.is_authenticated:
return True
# اگر کاربر استاد نیست، دسترسی ندارد
if not (request.user.is_authenticated and request.user.has_role('professor')):
return True
# برای استادان: بررسی URL های محدود شده
for restricted_url in self.restricted_urls:
if request.path.startswith(restricted_url):
return True
# برای استادان: بررسی مدل‌های محدود شده
path_parts = request.path.strip('/').split('/')
if len(path_parts) >= 3: # admin/app/model/
app_name = path_parts[1]
model_name = path_parts[2]
if model_name in self.restricted_models:
return True
return False
def handle_restricted_access(self, request):
"""مدیریت دسترسی محدود شده"""
if not request.user.is_authenticated:
return redirect('admin:login')
# اگر کاربر استاد است، در همان admin panel می‌ماند
if request.user.is_authenticated and request.user.has_role('professor'):
# فقط پیام می‌دهیم که دسترسی محدود است
messages.info(
request,
_('You have limited access as a professor.')
)
# به صفحه اصلی admin هدایت می‌کنیم
return redirect('/admin/')
# سایر کاربران
messages.error(
request,
_('You do not have permission to access this page.')
)
return redirect('admin:login')