""" Base admin classes برای استادان """ from django.contrib import admin from django.contrib.admin import ModelAdmin from django.utils.translation import gettext_lazy as _ from unfold.admin import ModelAdmin as UnfoldModelAdmin class ProfessorBaseAdmin(UnfoldModelAdmin): """Base admin class برای استادان""" def has_module_permission(self, request): """آیا کاربر می‌تواند این ماژول را ببیند؟""" # چک کردن احراز هویت if not request.user.is_authenticated: return False # اولویت اول: staff یا admin if request.user.is_staff or request.user.has_role('admin') or request.user.has_role('super_admin'): return True # اولویت دوم: professor return request.user.has_role('professor') def has_view_permission(self, request, obj=None): """آیا می‌تواند مشاهده کند؟""" # چک کردن احراز هویت if not request.user.is_authenticated: return False # اولویت اول: staff یا admin - دسترسی کامل if request.user.is_staff or request.user.has_role('admin') or request.user.has_role('super_admin'): return True # اولویت دوم: professor - دسترسی محدود if request.user.has_role('professor'): if obj is None: return True return self.can_access_object(request.user, obj) return False def has_add_permission(self, request): """آیا می‌تواند اضافه کند؟""" # چک کردن احراز هویت if not request.user.is_authenticated: return False # اولویت اول: staff یا admin - دسترسی کامل if request.user.is_staff or request.user.has_role('admin') or request.user.has_role('super_admin'): return True # اولویت دوم: professor return request.user.has_role('professor') def has_change_permission(self, request, obj=None): """آیا می‌تواند تغییر دهد؟""" # چک کردن احراز هویت if not request.user.is_authenticated: return False # اولویت اول: staff یا admin - دسترسی کامل if request.user.is_staff or request.user.has_role('admin') or request.user.has_role('super_admin'): return True # اولویت دوم: professor - دسترسی محدود if request.user.has_role('professor'): if obj is None: return True return self.can_access_object(request.user, obj) return False def has_delete_permission(self, request, obj=None): """آیا می‌تواند حذف کند؟""" # چک کردن احراز هویت if not request.user.is_authenticated: return False # اولویت اول: staff یا admin - دسترسی کامل if request.user.is_staff or request.user.has_role('admin') or request.user.has_role('super_admin'): return True # اولویت دوم: professor - دسترسی محدود if request.user.has_role('professor'): if obj is None: return True return self.can_access_object(request.user, obj) return False def can_access_object(self, user, obj): """آیا کاربر می‌تواند به این object دسترسی داشته باشد؟""" # این method باید در subclass ها override شود return True def get_queryset(self, request): """فیلتر کردن queryset بر اساس دسترسی کاربر""" qs = super().get_queryset(request) # چک کردن احراز هویت if not request.user.is_authenticated: return qs.none() # اولویت اول: staff یا admin - دسترسی کامل if request.user.is_staff or request.user.has_role('admin') or request.user.has_role('super_admin'): return qs # اولویت دوم: professor - دسترسی محدود if request.user.has_role('professor'): return self.filter_queryset_for_professor(request, qs) return qs.none() def filter_queryset_for_professor(self, request, queryset): """فیلتر کردن queryset برای استاد""" # این method باید در subclass ها override شود return queryset class CourseRelatedAdmin(ProfessorBaseAdmin): """Base admin برای مدل‌هایی که به Course مرتبط هستند""" def can_access_object(self, user, obj): """چک کردن دسترسی بر اساس Course""" course = self.get_course_from_object(obj) if course: return user.can_manage_course(course) return False def filter_queryset_for_professor(self, request, queryset): """فیلتر کردن بر اساس دوره‌های استاد""" return queryset.filter(course__professor=request.user) def get_course_from_object(self, obj): """دریافت Course از object""" # این method باید در subclass ها override شود if hasattr(obj, 'course'): return obj.course return None class DirectCourseAdmin(ProfessorBaseAdmin): """Admin برای خود مدل Course""" def can_access_object(self, user, obj): """چک کردن دسترسی به Course""" return user.can_manage_course(obj) def filter_queryset_for_professor(self, request, queryset): """فقط دوره‌های خود استاد""" return queryset.filter(professor=request.user) class AttachmentGlossaryBaseAdmin(ProfessorBaseAdmin): """Base admin برای Attachment و Glossary""" def can_access_object(self, user, obj): """چک کردن دسترسی - فقط اگر در دوره‌های استاد استفاده شده""" # چک کنیم که آیا این attachment/glossary در دوره‌های استاد استفاده شده return self.is_used_in_professor_courses(user, obj) def filter_queryset_for_professor(self, request, queryset): """فیلتر کردن بر اساس استفاده در دوره‌های استاد""" return self.filter_by_professor_usage(request.user, queryset) def is_used_in_professor_courses(self, user, obj): """آیا در دوره‌های استاد استفاده شده؟""" # باید در subclass ها پیاده‌سازی شود return True def filter_by_professor_usage(self, user, queryset): """فیلتر کردن بر اساس استفاده در دوره‌های استاد""" # باید در subclass ها پیاده‌سازی شود return queryset class CertificateBaseAdmin(ProfessorBaseAdmin): """Base admin برای Certificate""" def can_access_object(self, user, obj): """چک کردن دسترسی به Certificate""" # فقط certificate های دانش‌آموزان دوره‌های خودش if hasattr(obj, 'course') and obj.course: return user.can_manage_course(obj.course) return False def filter_queryset_for_professor(self, request, queryset): """فقط certificate های دانش‌آموزان دوره‌های استاد""" return queryset.filter(course__professor=request.user)