From d5658df5dc80fd608ad016b33bd77a3398446b72 Mon Sep 17 00:00:00 2001 From: Paulo Viadanna Date: Thu, 19 Feb 2026 17:08:06 -0300 Subject: [PATCH 1/4] fix: prefetch video_image when getting a video --- edxval/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/edxval/api.py b/edxval/api.py index 8f26114a..33e39575 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -576,9 +576,10 @@ def _get_video(edx_video_id): """ try: encoded_videos = EncodedVideo.objects.select_related("profile") + course_videos = CourseVideo.objects.select_related("video_image") return Video.objects \ .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ - .prefetch_related("courses") \ + .prefetch_related(Prefetch("courses", queryset=course_videos)) \ .get(edx_video_id=edx_video_id) except Video.DoesNotExist as no_video_error: error_message = f"Video not found for edx_video_id: {edx_video_id}" From 35eb7f2f39e30a8d03e4540908797db7dad515d7 Mon Sep 17 00:00:00 2001 From: Paulo Viadanna Date: Wed, 20 May 2026 11:37:36 -0300 Subject: [PATCH 2/4] fix: prefetch encoded_videos when getting a video --- edxval/api.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/edxval/api.py b/edxval/api.py index 33e39575..e476d72f 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -686,7 +686,12 @@ def _get_videos_for_filter(video_filter, sort_field=None, sort_dir=SortDirection the given field and direction, with ties broken by edx_video_id to ensure a total order. """ - videos = Video.objects.filter(**video_filter) + video_image = CourseVideo.objects.select_related("video_image") + encoded_videos = EncodedVideo.objects.select_related("profile") + videos = Video.objects \ + .prefetch_related(Prefetch("courses", queryset=video_image)) \ + .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ + .filter(**video_filter) paginator_context = {} if sort_field: From 28d75cd1d576fe1c00dbeaedccf06b7b633be2a0 Mon Sep 17 00:00:00 2001 From: Paulo Viadanna Date: Mon, 25 May 2026 09:21:53 -0300 Subject: [PATCH 3/4] refactor: extract video queryset with prefetch --- edxval/__init__.py | 2 +- edxval/api.py | 28 ++++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/edxval/__init__.py b/edxval/__init__.py index 96b7b278..18647d2c 100644 --- a/edxval/__init__.py +++ b/edxval/__init__.py @@ -2,4 +2,4 @@ init """ -__version__ = '5.0.0' +__version__ = '5.0.1' diff --git a/edxval/api.py b/edxval/api.py index e476d72f..67c9c862 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -568,6 +568,20 @@ def create_profile(profile_name): raise ValCannotCreateError(err.message_dict) from err +def _get_video_qset(prefetch_related=False): + """ + Get a Video queryset, optionally prefetching encoded video and course information. + """ + video_qset = Video.objects + if prefetch_related: + encoded_videos = EncodedVideo.objects.select_related("profile") + course_videos = CourseVideo.objects.select_related("video_image") + video_qset = video_qset \ + .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ + .prefetch_related(Prefetch("courses", queryset=course_videos)) + return video_qset + + def _get_video(edx_video_id): """ Get a Video instance, prefetching encoded video and course information. @@ -575,12 +589,7 @@ def _get_video(edx_video_id): Raises ValVideoNotFoundError if the video cannot be retrieved. """ try: - encoded_videos = EncodedVideo.objects.select_related("profile") - course_videos = CourseVideo.objects.select_related("video_image") - return Video.objects \ - .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ - .prefetch_related(Prefetch("courses", queryset=course_videos)) \ - .get(edx_video_id=edx_video_id) + return _get_video_qset(prefetch_related=True).get(edx_video_id=edx_video_id) except Video.DoesNotExist as no_video_error: error_message = f"Video not found for edx_video_id: {edx_video_id}" raise ValVideoNotFoundError(error_message) from no_video_error @@ -686,12 +695,7 @@ def _get_videos_for_filter(video_filter, sort_field=None, sort_dir=SortDirection the given field and direction, with ties broken by edx_video_id to ensure a total order. """ - video_image = CourseVideo.objects.select_related("video_image") - encoded_videos = EncodedVideo.objects.select_related("profile") - videos = Video.objects \ - .prefetch_related(Prefetch("courses", queryset=video_image)) \ - .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ - .filter(**video_filter) + videos = _get_video_qset(prefetch_related=True).filter(**video_filter) paginator_context = {} if sort_field: From 83938237f0d2e73b0a4491c160e8b507edb3e268 Mon Sep 17 00:00:00 2001 From: Paulo Viadanna Date: Wed, 24 Jun 2026 17:03:13 -0300 Subject: [PATCH 4/4] refactor: simplify _get_video_qset --- edxval/api.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/edxval/api.py b/edxval/api.py index 67c9c862..78ecf55b 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -568,18 +568,15 @@ def create_profile(profile_name): raise ValCannotCreateError(err.message_dict) from err -def _get_video_qset(prefetch_related=False): +def _get_video_qset(): """ Get a Video queryset, optionally prefetching encoded video and course information. """ - video_qset = Video.objects - if prefetch_related: - encoded_videos = EncodedVideo.objects.select_related("profile") - course_videos = CourseVideo.objects.select_related("video_image") - video_qset = video_qset \ - .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ - .prefetch_related(Prefetch("courses", queryset=course_videos)) - return video_qset + encoded_videos = EncodedVideo.objects.select_related("profile") + course_videos = CourseVideo.objects.select_related("video_image") + return Video.objects \ + .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ + .prefetch_related(Prefetch("courses", queryset=course_videos)) def _get_video(edx_video_id): @@ -589,7 +586,7 @@ def _get_video(edx_video_id): Raises ValVideoNotFoundError if the video cannot be retrieved. """ try: - return _get_video_qset(prefetch_related=True).get(edx_video_id=edx_video_id) + return _get_video_qset().get(edx_video_id=edx_video_id) except Video.DoesNotExist as no_video_error: error_message = f"Video not found for edx_video_id: {edx_video_id}" raise ValVideoNotFoundError(error_message) from no_video_error @@ -695,7 +692,7 @@ def _get_videos_for_filter(video_filter, sort_field=None, sort_dir=SortDirection the given field and direction, with ties broken by edx_video_id to ensure a total order. """ - videos = _get_video_qset(prefetch_related=True).filter(**video_filter) + videos = _get_video_qset().filter(**video_filter) paginator_context = {} if sort_field: