From eb2028290e424bb50d9c8aad3df2b06643f5f648 Mon Sep 17 00:00:00 2001 From: mortezaei Date: Mon, 16 Jun 2025 18:38:36 +0330 Subject: [PATCH] fix: ensure completed lessons count does not exceed total lessons in CourseDetailSerializer --- apps/course/serializers/course.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/apps/course/serializers/course.py b/apps/course/serializers/course.py index 6f5bbfa..a12a266 100644 --- a/apps/course/serializers/course.py +++ b/apps/course/serializers/course.py @@ -234,7 +234,10 @@ class CourseDetailSerializer(serializers.ModelSerializer): if student := self._get_authenticated_user(): if not self._is_participant(student, obj): return None - return self._get_completed_lessons_count(student, obj) + completed_count = self._get_completed_lessons_count(student, obj) + # Ensure completed count doesn't exceed total lessons count + total_lessons = self.get_lessons_count(obj) + return min(completed_count, total_lessons) return None def _is_participant(self, student, course): @@ -296,10 +299,11 @@ class CourseDetailSerializer(serializers.ModelSerializer): class MyCourseListSerializer(serializers.ModelSerializer): category = CourseCategorySerializer() thumbnail = serializers.SerializerMethodField() + lessons_count = serializers.SerializerMethodField() lessons_complated_count = serializers.SerializerMethodField() class Meta: - model = Course + model = Course fields = [ 'id', 'title', @@ -314,12 +318,25 @@ class MyCourseListSerializer(serializers.ModelSerializer): def get_thumbnail(self, obj): return get_thumbs(obj.thumbnail, self.context.get('request')) - + + def get_lessons_count(self, obj): + """Get the actual count of active lessons""" + # Use prefetched lessons if available + if hasattr(obj, 'lessons') and obj.lessons.all(): + lessons_count = sum(1 for lesson in obj.lessons.all() if lesson.is_active) + return max(lessons_count, obj.lessons_count) + # Fallback to direct query + lessons_count = obj.lessons.filter(is_active=True).count() + return max(lessons_count, obj.lessons_count) + def get_lessons_complated_count(self, obj): if student := self._get_authenticated_user(): if not self._is_participant(student, obj): return None - return self._get_completed_lessons_count(student, obj) + completed_count = self._get_completed_lessons_count(student, obj) + # Ensure completed count doesn't exceed total lessons count + total_lessons = self.get_lessons_count(obj) + return min(completed_count, total_lessons) return None def _is_participant(self, student, course):