Browse Source

fix: ensure completed lessons count does not exceed total lessons in CourseDetailSerializer

master
mortezaei 11 months ago
parent
commit
eb2028290e
  1. 25
      apps/course/serializers/course.py

25
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):

Loading…
Cancel
Save