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.
119 lines
3.2 KiB
119 lines
3.2 KiB
from rest_framework import serializers
|
|
from apps.quiz.models import Quiz, Question, QuizParticipant
|
|
from apps.course.models import Course, CourseLesson
|
|
from apps.account.models import User
|
|
|
|
|
|
class AdminCourseSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Course
|
|
fields = ['id', 'title']
|
|
|
|
|
|
class AdminCourseLessonSerializer(serializers.ModelSerializer):
|
|
title = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = CourseLesson
|
|
fields = ['id', 'title']
|
|
|
|
def get_title(self, obj):
|
|
if obj.title:
|
|
return obj.title
|
|
if obj.lesson:
|
|
return obj.lesson.title
|
|
return f"Lesson {obj.id}"
|
|
|
|
|
|
class AdminQuizListSerializer(serializers.ModelSerializer):
|
|
questions_count = serializers.SerializerMethodField()
|
|
participants_count = serializers.SerializerMethodField()
|
|
course_title = serializers.SerializerMethodField()
|
|
lesson_title = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Quiz
|
|
fields = [
|
|
'id',
|
|
'title',
|
|
'description',
|
|
'each_question_timing',
|
|
'status',
|
|
'course',
|
|
'course_title',
|
|
'lesson',
|
|
'lesson_title',
|
|
'questions_count',
|
|
'participants_count'
|
|
]
|
|
|
|
def get_questions_count(self, obj):
|
|
return obj.questions.count()
|
|
|
|
def get_participants_count(self, obj):
|
|
return obj.participants.count()
|
|
|
|
def get_course_title(self, obj):
|
|
return obj.course.title if obj.course else None
|
|
|
|
def get_lesson_title(self, obj):
|
|
if not obj.lesson:
|
|
return None
|
|
return obj.lesson.title or (obj.lesson.lesson.title if obj.lesson.lesson else None)
|
|
|
|
|
|
class AdminQuizDetailSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Quiz
|
|
fields = [
|
|
'id',
|
|
'title',
|
|
'description',
|
|
'each_question_timing',
|
|
'status',
|
|
'course',
|
|
'lesson'
|
|
]
|
|
read_only_fields = ['course'] # Set automatically on save based on lesson.course
|
|
|
|
|
|
class AdminQuestionSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Question
|
|
fields = [
|
|
'id',
|
|
'quiz',
|
|
'question',
|
|
'option1',
|
|
'option2',
|
|
'option3',
|
|
'option4',
|
|
'correct_answer',
|
|
'priority'
|
|
]
|
|
|
|
|
|
class AdminQuizParticipantSerializer(serializers.ModelSerializer):
|
|
user_name = serializers.CharField(source='user.fullname', read_only=True)
|
|
user_email = serializers.EmailField(source='user.email', read_only=True)
|
|
|
|
class Meta:
|
|
model = QuizParticipant
|
|
fields = [
|
|
'id',
|
|
'user_id',
|
|
'user_name',
|
|
'user_email',
|
|
'started_at',
|
|
'ended_at',
|
|
'total_timing',
|
|
'question_score',
|
|
'timing_score',
|
|
'total_score'
|
|
]
|
|
|
|
|
|
class AdminQuizAbsenteeSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = ['id', 'fullname', 'email']
|