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