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 from apps.course.models.course import get_localized_field def get_request_lang(serializer_instance): request = serializer_instance.context.get('request') return getattr(request, 'LANGUAGE_CODE', None) or 'en' class AdminCourseSerializer(serializers.ModelSerializer): class Meta: model = Course fields = ['id', 'title'] def to_representation(self, instance): ret = super().to_representation(instance) lang = get_request_lang(self) ret['title'] = get_localized_field(lang, instance.title) return ret class AdminCourseLessonSerializer(serializers.ModelSerializer): title = serializers.SerializerMethodField() class Meta: model = CourseLesson fields = ['id', 'title'] ref_name = 'QuizAdminCourseLesson' def get_title(self, obj): lang = get_request_lang(self) raw_title = obj.title or (obj.lesson.title if obj.lesson else []) return get_localized_field(lang, raw_title) 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): if not obj.course: return None lang = get_request_lang(self) return get_localized_field(lang, obj.course.title) def get_lesson_title(self, obj): if not obj.lesson: return None lang = get_request_lang(self) raw_title = obj.lesson.title or (obj.lesson.lesson.title if obj.lesson.lesson else None) return get_localized_field(lang, raw_title) 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): if not obj.course: return None lang = get_request_lang(self) return get_localized_field(lang, obj.course.title) def get_lesson_title(self, obj): if not obj.lesson: return None lang = get_request_lang(self) raw_title = obj.lesson.title or (obj.lesson.lesson.title if obj.lesson.lesson else None) return get_localized_field(lang, raw_title) 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']