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_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() 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.PrimaryKeyRelatedField(read_only=True) questions = QuestionSerializer(many=True) permission = serializers.SerializerMethodField() title = serializers.SerializerMethodField() description = serializers.SerializerMethodField() class Meta: model = Quiz fields = ['id', 'permission', 'lesson', '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_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)