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() title_i18n = serializers.JSONField(source='title', read_only=True) description_i18n = serializers.JSONField(source='description', read_only=True) class Meta: model = Quiz fields = [ 'id', 'title', 'title_i18n', 'description', 'description_i18n', 'each_question_timing', 'status', 'course', 'course_title', 'lesson', 'lesson_number', '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): lesson = obj.lesson_computed if not lesson: return None lang = get_request_lang(self) raw_title = lesson.title or (lesson.lesson.title if lesson.lesson else None) return get_localized_field(lang, raw_title) def to_representation(self, instance): ret = super().to_representation(instance) lang = get_request_lang(self) ret['title'] = get_localized_field(lang, instance.title) ret['description'] = get_localized_field(lang, instance.description) computed = instance.lesson_computed ret['lesson'] = computed.id if computed else None return ret class AdminQuizDetailSerializer(serializers.ModelSerializer): questions_count = serializers.SerializerMethodField() participants_count = serializers.SerializerMethodField() course_title = serializers.SerializerMethodField() lesson_title = serializers.SerializerMethodField() title_i18n = serializers.JSONField(source='title', read_only=True) description_i18n = serializers.JSONField(source='description', read_only=True) class Meta: model = Quiz fields = [ 'id', 'title', 'title_i18n', 'description', 'description_i18n', 'each_question_timing', 'status', 'course', 'course_title', 'lesson', 'lesson_number', 'lesson_title', 'questions_count', 'participants_count' ] read_only_fields = ['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): lesson = obj.lesson_computed if not lesson: return None lang = get_request_lang(self) raw_title = lesson.title or (lesson.lesson.title if lesson.lesson else None) return get_localized_field(lang, raw_title) def to_representation(self, instance): ret = super().to_representation(instance) lang = get_request_lang(self) ret['title'] = get_localized_field(lang, instance.title) ret['description'] = get_localized_field(lang, instance.description) computed = instance.lesson_computed ret['lesson'] = computed.id if computed else None return ret class AdminQuestionSerializer(serializers.ModelSerializer): question_i18n = serializers.JSONField(source='question', read_only=True) option1_i18n = serializers.JSONField(source='option1', read_only=True) option2_i18n = serializers.JSONField(source='option2', read_only=True) option3_i18n = serializers.JSONField(source='option3', read_only=True) option4_i18n = serializers.JSONField(source='option4', read_only=True) class Meta: model = Question fields = [ 'id', 'quiz', 'question', 'question_i18n', 'option1', 'option1_i18n', 'option2', 'option2_i18n', 'option3', 'option3_i18n', 'option4', 'option4_i18n', 'correct_answer', 'priority' ] def _get_localized_value(self, value): lang = get_request_lang(self) return get_localized_field(lang, value) def to_representation(self, instance): ret = super().to_representation(instance) ret['question'] = self._get_localized_value(instance.question) ret['option1'] = self._get_localized_value(instance.option1) ret['option2'] = self._get_localized_value(instance.option2) ret['option3'] = self._get_localized_value(instance.option3) ret['option4'] = self._get_localized_value(instance.option4) return ret 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']