Browse Source

fix: optimize lesson completion counting with prefetching in serializers

master
mortezaei 11 months ago
parent
commit
5a0e54ded0
  1. 20
      apps/course/serializers/course.py
  2. 16
      config/test_auth_middleware.py

20
apps/course/serializers/course.py

@ -248,6 +248,16 @@ class CourseDetailSerializer(serializers.ModelSerializer):
def _get_completed_lessons_count(self, student, course): def _get_completed_lessons_count(self, student, course):
"""Helper method to count completed lessons for the student in the given 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( return LessonCompletion.objects.filter(
student=student, student=student,
course_lesson__course=course course_lesson__course=course
@ -323,6 +333,16 @@ class MyCourseListSerializer(serializers.ModelSerializer):
def _get_completed_lessons_count(self, student, course): def _get_completed_lessons_count(self, student, course):
"""Helper method to count completed lessons for the student in the given 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( return LessonCompletion.objects.filter(
student=student, student=student,
course_lesson__course=course course_lesson__course=course

16
config/test_auth_middleware.py

@ -10,10 +10,10 @@ def test_auth_middleware(get_response):
""" """
def middleware(request): 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: # 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) # t, _ = Token.objects.get_or_create(user=user)
# request.META['HTTP_AUTHORIZATION'] = f"Token {t}" # 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) return get_response(request)

Loading…
Cancel
Save