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']