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.
 
 
 
 

224 lines
7.5 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
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', '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']