From 5a0e54ded028428b4542a3ad88990ca0b7e2c194 Mon Sep 17 00:00:00 2001 From: mortezaei Date: Mon, 16 Jun 2025 18:13:19 +0330 Subject: [PATCH] fix: optimize lesson completion counting with prefetching in serializers --- apps/course/serializers/course.py | 20 ++++++++++++++++++++ config/test_auth_middleware.py | 16 ++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/apps/course/serializers/course.py b/apps/course/serializers/course.py index 1ab64ca..6f5bbfa 100644 --- a/apps/course/serializers/course.py +++ b/apps/course/serializers/course.py @@ -248,6 +248,16 @@ class CourseDetailSerializer(serializers.ModelSerializer): def _get_completed_lessons_count(self, student, course): """Helper method to count completed lessons for the student in the given course.""" + # Use prefetched completions if available + if hasattr(course, 'lessons') and course.lessons.all(): + completed_count = 0 + for lesson in course.lessons.all(): + if hasattr(lesson, 'completions') and lesson.completions.all(): + if any(completion.student_id == student.id for completion in lesson.completions.all()): + completed_count += 1 + return completed_count + + # Fallback to direct query if not prefetched return LessonCompletion.objects.filter( student=student, course_lesson__course=course @@ -323,6 +333,16 @@ class MyCourseListSerializer(serializers.ModelSerializer): def _get_completed_lessons_count(self, student, course): """Helper method to count completed lessons for the student in the given course.""" + # Use prefetched completions if available + if hasattr(course, 'lessons') and course.lessons.all(): + completed_count = 0 + for lesson in course.lessons.all(): + if hasattr(lesson, 'completions') and lesson.completions.all(): + if any(completion.student_id == student.id for completion in lesson.completions.all()): + completed_count += 1 + return completed_count + + # Fallback to direct query if not prefetched return LessonCompletion.objects.filter( student=student, course_lesson__course=course diff --git a/config/test_auth_middleware.py b/config/test_auth_middleware.py index 9460fa2..df97a61 100644 --- a/config/test_auth_middleware.py +++ b/config/test_auth_middleware.py @@ -10,10 +10,10 @@ def test_auth_middleware(get_response): """ def middleware(request): - # if "/admin/" not in request.path and request.META.get('HTTP_AUTHORIZATION') is None: - # if request.user.is_authenticated and request.user.is_staff: - # token, _ = Token.objects.get_or_create(user=request.user) - # request.META['HTTP_AUTHORIZATION'] = "Token " + token.key + if "/admin/" not in request.path and request.META.get('HTTP_AUTHORIZATION') is None: + if request.user.is_authenticated and request.user.is_staff: + token, _ = Token.objects.get_or_create(user=request.user) + request.META['HTTP_AUTHORIZATION'] = "Token " + token.key # if "/swagger" in request.path or "/redoc" in request.path: @@ -23,10 +23,10 @@ def test_auth_middleware(get_response): # t, _ = Token.objects.get_or_create(user=user) # request.META['HTTP_AUTHORIZATION'] = f"Token {t}" - user = User.objects.filter(email="muhammadamin.ghorbani@gmail.com").first() - if user: - t, _ = Token.objects.get_or_create(user=user) - request.META['HTTP_AUTHORIZATION'] = f"Token {t}" + # user = User.objects.filter(email="muhammadamin.ghorbani@gmail.com").first() + # if user: + # t, _ = Token.objects.get_or_create(user=user) + # request.META['HTTP_AUTHORIZATION'] = f"Token {t}" return get_response(request)