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.
120 lines
4.4 KiB
120 lines
4.4 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:
|
|
# Redirect to admin login page using direct URL path
|
|
from django.utils.translation import get_language
|
|
language = get_language() or 'en'
|
|
return redirect(f'/{language}/admin/login/?next={request.path}')
|
|
|
|
# اگر کاربر استاد است، در همان 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.')
|
|
)
|
|
# Redirect to admin login page using direct URL path
|
|
from django.utils.translation import get_language
|
|
language = get_language() or 'en'
|
|
return redirect(f'/{language}/admin/login/?next={request.path}')
|