from rest_framework import serializers <<<<<<< HEAD from apps.course.models import Lesson, Participant, LessonCompletion from apps.quiz.serializers import QuizListSerializer class LessonSerializer(serializers.ModelSerializer): is_complated = serializers.SerializerMethodField() quizs = serializers.SerializerMethodField() permission = serializers.SerializerMethodField() class Meta: model = Lesson fields = ['id', 'title', 'priority', 'is_active', 'permission','duration', 'content_type', 'content_file', 'video_link', 'is_complated', 'quizs'] ======= from apps.course.models import Lesson, CourseLesson, Participant, LessonCompletion from apps.quiz.serializers import QuizListSerializer class LessonSerializer(serializers.ModelSerializer): class Meta: model = Lesson fields = ['id', 'title', 'content_type', 'content_file', 'video_link', 'duration'] class CourseLessonSerializer(serializers.ModelSerializer): is_complated = serializers.SerializerMethodField() quizs = serializers.SerializerMethodField() permission = serializers.SerializerMethodField() content_type = serializers.CharField(source='lesson.content_type', read_only=True) content_file = serializers.FileField(source='lesson.content_file', read_only=True) video_link = serializers.CharField(source='lesson.video_link', read_only=True) duration = serializers.IntegerField(source='lesson.duration', read_only=True) class Meta: model = CourseLesson fields = ['id', 'title', 'priority', 'is_active', 'permission', 'duration', 'content_type', 'content_file', 'video_link', 'is_complated', 'quizs'] >>>>>>> develop def get_permission(self, obj): if student := self._get_authenticated_user(): if not self._is_participant(student, obj.course): return False return True return False def _get_authenticated_user(self): """Helper method to retrieve the authenticated user from the context.""" request = self.context.get('request') return request.user if request and request.user.is_authenticated else None def _is_participant(self, student, course): """Helper method to check if a student is a participant in the given course.""" return Participant.objects.filter(student=student, course=course).exists() def get_is_complated(self, obj): request = self.context.get('request') if not request or not request.user.is_authenticated: <<<<<<< HEAD return False user = request.user ======= return False user = request.user # Use prefetched completions if available if hasattr(obj, 'completions') and obj.completions.all(): return any(completion.student_id == user.id for completion in obj.completions.all()) # Fallback to direct queries >>>>>>> develop is_participant = Participant.objects.filter( student=user, course=obj.course ).exists() <<<<<<< HEAD if not is_participant: return False return LessonCompletion.objects.filter( student=user, lesson=obj ).exists() def get_quizs(self, obj): quizzes = obj.quizzes.all() # استفاده از related_name 'quizzes' برای دسترسی به کوییزهای درس if quizzes.exists(): return QuizListSerializer(quizzes, many=True, context=self.context).data return None ======= if not is_participant: return False return LessonCompletion.objects.filter( student=user, course_lesson=obj ).exists() def get_quizs(self, obj): # Now quizzes are directly related to CourseLesson # print(f'--> type:{type(obj)} obj:{obj.quizzes.all()}') quizzes = obj.quizzes.all() if hasattr(obj, 'quizzes') else [] if quizzes: return QuizListSerializer(quizzes, many=True, context=self.context).data return None >>>>>>> develop