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.
216 lines
7.2 KiB
216 lines
7.2 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_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)
|
|
|
|
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)
|
|
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_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)
|
|
|
|
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)
|
|
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']
|