""" 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')