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 Lesson 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') ) if request.user.groups.filter(name="Professor Group").exists(): return queryset.filter(lesson__course__professor=request.user) return queryset def get_form(self, request, obj=None, **kwargs): form = super().get_form(request, obj, **kwargs) if obj is None: form.base_fields['lesson'].queryset = ( Lesson.objects.all() if request.user.is_staff else Lesson.objects.filter(course__professor=request.user) ) 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('Active') return mark_safe('Inactive') @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'Questions: {obj.questions_count}') project_admin_site.register(Quiz, QuizAdmin)