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.
 
 

181 lines
7.5 KiB

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