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.
 
 
 
 

150 lines
4.3 KiB

from rest_framework import serializers
from apps.quiz.models import Quiz, Question, QuizParticipant, ParticipantAnswer
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):
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'
]
read_only_fields = ['course', 'course_title', '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 AdminQuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = [
'id',
'quiz',
'question',
'option1',
'option2',
'option3',
'option4',
'correct_answer',
'priority'
]
class AdminParticipantAnswerSerializer(serializers.ModelSerializer):
class Meta:
model = ParticipantAnswer
fields = ['id', 'question', 'option_num', 'at_time', 'answer_timing']
class AdminQuizParticipantSerializer(serializers.ModelSerializer):
user_name = serializers.CharField(source='user.fullname', read_only=True)
user_email = serializers.EmailField(source='user.email', read_only=True)
answers = AdminParticipantAnswerSerializer(many=True, 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',
'answers'
]
class AdminQuizAbsenteeSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'fullname', 'email']