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)