From 182b1fc25b8e0cc0c9a4a8a242ff6d06ff190d3f Mon Sep 17 00:00:00 2001 From: hajorg Date: Wed, 4 Oct 2023 18:01:51 +0100 Subject: [PATCH 1/4] feat: add endpoint to fetch course video ids --- edxval/__init__.py | 2 +- edxval/api.py | 15 +++++++++++++++ edxval/tests/test_api.py | 12 ++++++++++++ edxval/tests/test_views.py | 25 +++++++++++++++++++++++++ edxval/urls.py | 3 +++ edxval/views.py | 19 ++++++++++++++++++- 6 files changed, 74 insertions(+), 2 deletions(-) diff --git a/edxval/__init__.py b/edxval/__init__.py index 3b310695..ef90434f 100644 --- a/edxval/__init__.py +++ b/edxval/__init__.py @@ -2,4 +2,4 @@ init """ -__version__ = '2.4.3' +__version__ = '2.4.4' diff --git a/edxval/api.py b/edxval/api.py index ad25090a..4ceaa052 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -777,6 +777,21 @@ def get_transcript_details_for_course(course_id): return course_transcripts_data +def get_video_ids_for_course(course_id): + """ + Gets video_ids for a course. + + Args: + course_id (String) + + Returns: + (list): Returns all the edx_video_id's for a course + """ + + course_videos = CourseVideo.objects.filter(course_id=course_id).select_related('video') + video_ids = [cv.video.edx_video_id for cv in course_videos] + return video_ids + def remove_video_for_course(course_id, edx_video_id): """ diff --git a/edxval/tests/test_api.py b/edxval/tests/test_api.py index 12c88a11..5165098d 100644 --- a/edxval/tests/test_api.py +++ b/edxval/tests/test_api.py @@ -749,6 +749,18 @@ def api_func(_expected_ids, sort_field, sort_direction): return videos self.check_sort_params_of_api(api_func) + def test_get_video_ids_for_course(self): + + course_transcript = api.get_video_ids_for_course(self.course_id) + + self.assertEqual(len(course_transcript), 1) + + def test_get_video_ids_for_course_no_course_videos(self): + + course_transcript = api.get_video_ids_for_course('this-is-not-a-course-id') + + self.assertEqual(len(course_transcript), 0) + @ddt class GetYouTubeProfileVideosTest(TestCase): diff --git a/edxval/tests/test_views.py b/edxval/tests/test_views.py index 2e89402f..1c2bda2d 100644 --- a/edxval/tests/test_views.py +++ b/edxval/tests/test_views.py @@ -1127,3 +1127,28 @@ def test_successful_response(self): mock_transcript_details.assert_called_once_with(course_id) self.assertEqual(response.status_code, status.HTTP_200_OK) + + +class CourseVideoIDsViewTest(APIAuthTestCase): + """ + CourseVideoIDsViewTest Tests. + """ + base_url = 'course-transcripts' + + def test_successful_response(self): + """ + Test succesful response from view + """ + with patch( + 'edxval.views.get_video_ids_for_course' + ) as mock_video_ids: + # Simulate a return value when the function is called. + mock_video_ids.return_value = [] + course_id = 'course-v1:edx+1+2023_05' + url = reverse('course-video-ids', args=[course_id]) + response = self.client.get(url) + + # Verify the function was called once with course_id + mock_video_ids.assert_called_once_with(course_id) + + self.assertEqual(response.status_code, status.HTTP_200_OK) diff --git a/edxval/urls.py b/edxval/urls.py index e020ebd0..6c700c8d 100644 --- a/edxval/urls.py +++ b/edxval/urls.py @@ -28,6 +28,9 @@ path('videos/video-images/update/', views.VideoImagesView.as_view(), name='update-video-images' ), + path('videos//video_ids/', views.CourseVideoIDsView.as_view(), + name='course-video-ids' + ), ] if getattr(settings, 'PROVIDER_STATES_SETUP_VIEW_URL', None): diff --git a/edxval/views.py b/edxval/views.py index 1d5584d1..1e2c4f4b 100644 --- a/edxval/views.py +++ b/edxval/views.py @@ -14,7 +14,7 @@ from rest_framework.response import Response from rest_framework.views import APIView -from edxval.api import create_or_update_video_transcript, get_transcript_details_for_course +from edxval.api import create_or_update_video_transcript, get_transcript_details_for_course, get_video_ids_for_course from edxval.models import ( LIST_MAX_ITEMS, CourseVideo, @@ -192,6 +192,23 @@ def get(self, _request, course_id): return Response(status=status.HTTP_200_OK, data=course_data) +class CourseVideoIDsView(APIView): + """ + A view to get video ids related to a course_id. + """ + authentication_classes = (JwtAuthentication, SessionAuthentication) + + def get(self, _, course_id): + """ + Returns all video_ids for a course when given a course_id. + """ + if not course_id: + return Response(status=status.HTTP_400_BAD_REQUEST, data={'message': 'course_id param required'}) + + video_ids = get_video_ids_for_course(course_id) + return Response(status=status.HTTP_200_OK, data=video_ids) + + class VideoStatusView(APIView): """ A Video View to update the status of a video. From 063f7f79bf2adb3b721e9e2fbd0ee916a2a7f592 Mon Sep 17 00:00:00 2001 From: hajorg Date: Wed, 4 Oct 2023 19:27:35 +0100 Subject: [PATCH 2/4] fix: resolve lint issue --- edxval/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/edxval/api.py b/edxval/api.py index 4ceaa052..978c5f47 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -777,6 +777,7 @@ def get_transcript_details_for_course(course_id): return course_transcripts_data + def get_video_ids_for_course(course_id): """ Gets video_ids for a course. @@ -787,7 +788,6 @@ def get_video_ids_for_course(course_id): Returns: (list): Returns all the edx_video_id's for a course """ - course_videos = CourseVideo.objects.filter(course_id=course_id).select_related('video') video_ids = [cv.video.edx_video_id for cv in course_videos] return video_ids From 03f11c22a1fa643616011d361911722305beec62 Mon Sep 17 00:00:00 2001 From: hajorg Date: Thu, 5 Oct 2023 15:05:03 +0100 Subject: [PATCH 3/4] feat: update course video_ids endpoint url --- edxval/urls.py | 2 +- edxval/views.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/edxval/urls.py b/edxval/urls.py index 6c700c8d..607968ea 100644 --- a/edxval/urls.py +++ b/edxval/urls.py @@ -28,7 +28,7 @@ path('videos/video-images/update/', views.VideoImagesView.as_view(), name='update-video-images' ), - path('videos//video_ids/', views.CourseVideoIDsView.as_view(), + path('videos/courses//video_ids', views.CourseVideoIDsView.as_view(), name='course-video-ids' ), ] diff --git a/edxval/views.py b/edxval/views.py index 1e2c4f4b..167e224d 100644 --- a/edxval/views.py +++ b/edxval/views.py @@ -202,9 +202,6 @@ def get(self, _, course_id): """ Returns all video_ids for a course when given a course_id. """ - if not course_id: - return Response(status=status.HTTP_400_BAD_REQUEST, data={'message': 'course_id param required'}) - video_ids = get_video_ids_for_course(course_id) return Response(status=status.HTTP_200_OK, data=video_ids) From c61a74b0a297b44866655fa5481c97b8e3c37e46 Mon Sep 17 00:00:00 2001 From: hajorg Date: Thu, 5 Oct 2023 17:23:31 +0100 Subject: [PATCH 4/4] feat: replace _ with - in video ids path --- edxval/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/edxval/urls.py b/edxval/urls.py index 607968ea..97a05d18 100644 --- a/edxval/urls.py +++ b/edxval/urls.py @@ -28,7 +28,7 @@ path('videos/video-images/update/', views.VideoImagesView.as_view(), name='update-video-images' ), - path('videos/courses//video_ids', views.CourseVideoIDsView.as_view(), + path('videos/courses//video-ids', views.CourseVideoIDsView.as_view(), name='course-video-ids' ), ]