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.
 
 
 
 

85 lines
2.4 KiB

from rest_framework import serializers
from apps.course.access import user_has_course_access
from apps.quiz.models import Question, Quiz, QuizParticipant
class QuizListSerializer(serializers.ModelSerializer):
is_complated = serializers.SerializerMethodField()
permission = serializers.SerializerMethodField()
class Meta:
model = Quiz
fields = ['id', 'title', 'description', 'permission', 'each_question_timing', 'is_complated']
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_lesson = obj.lesson
if not course_lesson:
return False
course = course_lesson.course
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()
def get_options(self, obj) -> list:
return [
{
'id': i,
'title': 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.PrimaryKeyRelatedField(read_only=True)
questions = QuestionSerializer(many=True)
permission = serializers.SerializerMethodField()
class Meta:
model = Quiz
fields = ['id', 'permission', 'lesson', 'title', 'description', 'each_question_timing', 'questions']
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_lesson = obj.lesson
if not course_lesson:
return False
course = course_lesson.course
return user_has_course_access(user, course)