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.
72 lines
2.9 KiB
72 lines
2.9 KiB
from django.contrib import admin
|
|
from django.db.models import Count
|
|
from django.utils.safestring import mark_safe
|
|
from django.urls import reverse
|
|
|
|
from unfold.admin import ModelAdmin
|
|
from unfold.decorators import display
|
|
|
|
from apps.course.models import CourseLesson
|
|
from apps.quiz.models import Quiz
|
|
from apps.quiz.admin.question import QuestionAdminInline
|
|
from utils.admin import project_admin_site
|
|
|
|
|
|
|
|
class QuizAdmin(ModelAdmin):
|
|
search_fields = ['title', 'lesson__title']
|
|
list_display = ['title', 'description', 'lesson', 'each_question_timing', 'status_display', 'questions_display']
|
|
list_filter = ['each_question_timing', 'status']
|
|
inlines = [QuestionAdminInline]
|
|
compressed_fields = True
|
|
|
|
|
|
def get_queryset(self, request):
|
|
queryset = super().get_queryset(request).annotate(
|
|
questions_count=Count('questions')
|
|
)
|
|
|
|
# اولویت اول: staff یا admin - دسترسی کامل
|
|
if (request.user.is_staff or
|
|
request.user.has_role('admin') or
|
|
request.user.has_role('super_admin')):
|
|
return queryset
|
|
|
|
# اولویت دوم: professor - فقط کوئیزهای دورههای خود
|
|
if request.user.has_role('professor'):
|
|
return queryset.filter(lesson__course__professor=request.user)
|
|
|
|
return queryset.none()
|
|
|
|
def get_form(self, request, obj=None, **kwargs):
|
|
form = super().get_form(request, obj, **kwargs)
|
|
|
|
# محدود کردن انتخاب lesson بر اساس سطح دسترسی کاربر
|
|
if (request.user.is_staff or
|
|
request.user.has_role('admin') or
|
|
request.user.has_role('super_admin')):
|
|
# اولویت اول: staff یا admin - دسترسی کامل
|
|
form.base_fields['lesson'].queryset = CourseLesson.objects.all()
|
|
elif request.user.has_role('professor'):
|
|
# اولویت دوم: professor - فقط CourseLesson های دورههای خود
|
|
form.base_fields['lesson'].queryset = CourseLesson.objects.filter(course__professor=request.user)
|
|
else:
|
|
# سایر کاربران - عدم دسترسی
|
|
form.base_fields['lesson'].queryset = CourseLesson.objects.none()
|
|
|
|
form.base_fields['lesson'].widget.can_add_related = False
|
|
|
|
return form
|
|
|
|
@display(description='Status', ordering='status')
|
|
def status_display(self, obj):
|
|
if obj.status:
|
|
return mark_safe('<span class="unfold-badge unfold-badge--success">Active</span>')
|
|
return mark_safe('<span class="unfold-badge unfold-badge--warning">Inactive</span>')
|
|
|
|
@display(description='Questions', ordering='questions_count')
|
|
def questions_display(self, obj):
|
|
url = reverse('admin:quiz_question_changelist') + f'?quiz={obj.id}'
|
|
return mark_safe(f'<a href="{url}" class="unfold-link">Questions: {obj.questions_count}</a>')
|
|
|
|
project_admin_site.register(Quiz, QuizAdmin)
|