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.
130 lines
4.2 KiB
130 lines
4.2 KiB
from rest_framework import serializers
|
|
|
|
from apps.course.access import user_has_course_access
|
|
from apps.course.models.course import get_localized_field
|
|
from apps.quiz.models import Question, Quiz, QuizParticipant
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class QuizListSerializer(serializers.ModelSerializer):
|
|
is_complated = serializers.SerializerMethodField()
|
|
permission = serializers.SerializerMethodField()
|
|
title = serializers.SerializerMethodField()
|
|
description = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Quiz
|
|
fields = ['id', 'title', 'description', 'permission', 'each_question_timing', 'is_complated']
|
|
|
|
def get_title(self, obj):
|
|
request = self.context.get('request')
|
|
lang = getattr(request, 'LANGUAGE_CODE', None) or 'en'
|
|
return get_localized_field(lang, obj.title)
|
|
|
|
def get_description(self, obj):
|
|
request = self.context.get('request')
|
|
lang = getattr(request, 'LANGUAGE_CODE', None) or 'en'
|
|
return get_localized_field(lang, obj.description)
|
|
|
|
def get_permission(self, obj):
|
|
request = self.context.get('request')
|
|
if not request or not request.user.is_authenticated:
|
|
return False
|
|
user = request.user
|
|
|
|
course = obj.course
|
|
if not course:
|
|
course_lesson = obj.lesson_computed
|
|
if course_lesson:
|
|
course = course_lesson.course
|
|
|
|
if not course:
|
|
return False
|
|
|
|
if not user_has_course_access(user, course):
|
|
return False
|
|
|
|
participated = QuizParticipant.objects.filter(user=user, quiz=obj).exists()
|
|
return not participated
|
|
|
|
def get_is_complated(self, obj):
|
|
request = self.context.get('request')
|
|
if not request or not request.user.is_authenticated:
|
|
return False
|
|
user = request.user
|
|
return QuizParticipant.objects.filter(user=user, quiz=obj).exists()
|
|
|
|
|
|
|
|
|
|
|
|
class QuestionSerializer(serializers.ModelSerializer):
|
|
options = serializers.SerializerMethodField()
|
|
question = serializers.SerializerMethodField()
|
|
|
|
def get_question(self, obj):
|
|
request = self.context.get('request')
|
|
lang = getattr(request, 'LANGUAGE_CODE', None) or 'en'
|
|
return get_localized_field(lang, obj.question)
|
|
|
|
def get_options(self, obj) -> list:
|
|
request = self.context.get('request')
|
|
lang = getattr(request, 'LANGUAGE_CODE', None) or 'en'
|
|
return [
|
|
{
|
|
'id': i,
|
|
'title': get_localized_field(lang, getattr(obj, f"option{i}"))
|
|
} for i in range(1, 5)
|
|
]
|
|
|
|
|
|
class Meta:
|
|
model = Question
|
|
fields = ['id', 'question', 'options', 'correct_answer']
|
|
|
|
|
|
class QuizSerializer(serializers.ModelSerializer):
|
|
lesson = serializers.SerializerMethodField()
|
|
questions = QuestionSerializer(many=True)
|
|
permission = serializers.SerializerMethodField()
|
|
title = serializers.SerializerMethodField()
|
|
description = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Quiz
|
|
fields = ['id', 'permission', 'lesson', 'lesson_number', 'title', 'description', 'each_question_timing', 'questions']
|
|
|
|
def get_title(self, obj):
|
|
request = self.context.get('request')
|
|
lang = getattr(request, 'LANGUAGE_CODE', None) or 'en'
|
|
return get_localized_field(lang, obj.title)
|
|
|
|
def get_description(self, obj):
|
|
request = self.context.get('request')
|
|
lang = getattr(request, 'LANGUAGE_CODE', None) or 'en'
|
|
return get_localized_field(lang, obj.description)
|
|
|
|
def get_lesson(self, obj):
|
|
computed = obj.lesson_computed
|
|
return computed.id if computed else None
|
|
|
|
def get_permission(self, obj):
|
|
request = self.context.get('request')
|
|
if not request or not request.user.is_authenticated:
|
|
return False
|
|
user = request.user
|
|
|
|
course = obj.course
|
|
if not course:
|
|
course_lesson = obj.lesson_computed
|
|
if course_lesson:
|
|
course = course_lesson.course
|
|
|
|
if not course:
|
|
return False
|
|
|
|
return user_has_course_access(user, course)
|