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.
61 lines
1.7 KiB
61 lines
1.7 KiB
from ajaxdatatable.admin import AjaxDatatable
|
|
from django.contrib import admin
|
|
from django.db.models import F, Q
|
|
from django.contrib.admin import SimpleListFilter
|
|
from django.utils.translation import gettext_lazy as _
|
|
from apps.quiz.models import QuizParticipant, ParticipantAnswer
|
|
from apps.account.models import User
|
|
import datetime
|
|
|
|
|
|
class ParticipantAnswerInline(admin.StackedInline):
|
|
model = ParticipantAnswer
|
|
|
|
readonly_fields = (
|
|
'_correct_answer', 'question', 'at_time', 'answer_timing',
|
|
)
|
|
|
|
def _correct_answer(self, obj):
|
|
return obj.correct_answer
|
|
|
|
def has_add_permission(self, request, obj):
|
|
return False
|
|
|
|
def has_delete_permission(self, request, obj=None):
|
|
return False
|
|
|
|
def get_queryset(self, request):
|
|
return super().get_queryset(request).annotate(correct_answer=F('question__correct_answer'))
|
|
|
|
|
|
|
|
|
|
class UserEmailFilter(SimpleListFilter):
|
|
title = _('User Email')
|
|
parameter_name = 'user_email'
|
|
|
|
def lookups(self, request, model_admin):
|
|
users = User.objects.all()
|
|
return [(user.email, user.email) for user in users]
|
|
|
|
def queryset(self, request, queryset):
|
|
if self.value():
|
|
email = self.value().replace('%40', '@')
|
|
return queryset.filter(user__email=email)
|
|
return queryset
|
|
|
|
|
|
@admin.register(QuizParticipant)
|
|
class ParticipantAdmin(AjaxDatatable):
|
|
inlines = [ParticipantAnswerInline]
|
|
search_fields = ['user__username', 'user__fullname']
|
|
list_display = ['quiz', 'user', 'started_at', 'ended_at', 'total_timing', 'question_score', 'timing_score',
|
|
'total_score']
|
|
latest_by = 'started_at'
|
|
list_filter = ['started_at', 'ended_at', 'quiz__status', UserEmailFilter]
|
|
|
|
|
|
|
|
|
|
|
|
|