From c1bb4402f1e309c4e6a0cd49208751a9da574a11 Mon Sep 17 00:00:00 2001 From: noraiz-anwar Date: Thu, 27 Dec 2018 19:27:36 +0500 Subject: [PATCH 1/2] Add basic pagination in video upload page --- edxval/api.py | 24 +++++++++++++++++++---- edxval/tests/test_api.py | 42 +++++++++++++++++++++++++++++++--------- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/edxval/api.py b/edxval/api.py index f482974e..6d3087f6 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -8,6 +8,7 @@ from uuid import uuid4 from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.core.paginator import Paginator from django.core.files.base import ContentFile from fs import open_fs from fs.errors import ResourceNotFound @@ -630,19 +631,32 @@ def get_url_for_profile(edx_video_id, profile): return get_urls_for_profiles(edx_video_id, [profile])[profile] -def _get_videos_for_filter(video_filter, sort_field=None, sort_dir=SortDirection.asc): +def _get_videos_for_filter(video_filter, sort_field=None, sort_dir=SortDirection.asc, pagination_conf=None): """ Returns a generator expression that contains the videos found, sorted by the given field and direction, with ties broken by edx_video_id to ensure a total order. """ videos = Video.objects.filter(**video_filter) + paginator_context = {} + if sort_field: # Refining by edx_video_id ensures a total order videos = videos.order_by(sort_field.value, "edx_video_id") if sort_dir == SortDirection.desc: videos = videos.reverse() - return (VideoSerializer(video).data for video in videos) + + if pagination_conf: + videos_per_page = pagination_conf.get('videos_per_page') + paginator = Paginator(videos, videos_per_page) + videos = paginator.page(pagination_conf.get('page_number')) + paginator_context = { + 'current_page': videos.number, + 'total_pages': videos.paginator.num_pages, + 'items_on_one_page':videos_per_page + } + + return (VideoSerializer(video).data for video in videos), paginator_context def get_course_video_ids_with_youtube_profile(course_ids=None, offset=None, limit=None): @@ -684,7 +698,7 @@ def get_course_video_ids_with_youtube_profile(course_ids=None, offset=None, limi return course_videos_with_yt_profile -def get_videos_for_course(course_id, sort_field=None, sort_dir=SortDirection.asc): +def get_videos_for_course(course_id, sort_field=None, sort_dir=SortDirection.asc, pagination_conf=None): """ Returns an iterator of videos for the given course id. @@ -702,6 +716,7 @@ def get_videos_for_course(course_id, sort_field=None, sort_dir=SortDirection.asc {'courses__course_id': unicode(course_id), 'courses__is_hidden': False}, sort_field, sort_dir, + pagination_conf, ) @@ -736,11 +751,12 @@ def get_videos_for_ids( given field and direction, with ties broken by edx_video_id to ensure a total order """ - return _get_videos_for_filter( + videos, __ = _get_videos_for_filter( {"edx_video_id__in":edx_video_ids}, sort_field, sort_dir, ) + return videos def get_video_info_for_course_and_profiles(course_id, profiles): diff --git a/edxval/tests/test_api.py b/edxval/tests/test_api.py index 470174cc..45722088 100644 --- a/edxval/tests/test_api.py +++ b/edxval/tests/test_api.py @@ -674,24 +674,45 @@ def setUp(self): def test_get_videos_for_course(self): """ - Tests retrieving videos for a course id + Tests retrieving all videos for a course id """ - videos = list(api.get_videos_for_course(self.course_id)) + videos, pagination_context = api.get_videos_for_course(self.course_id) + videos = list(videos) self.assertEqual(len(videos), 1) + self.assertEqual(pagination_context, {}) self.assertEqual(videos[0]['edx_video_id'], constants.VIDEO_DICT_FISH['edx_video_id']) - videos = list(api.get_videos_for_course('unknown')) + videos, __ = api.get_videos_for_course('unknown') + videos = list(videos) self.assertEqual(len(videos), 0) + def test_get_paginated_videos_for_course(self): + """ + Test retrieving paginated videos for a course id + """ + pagination_conf = { + 'page_number':1, + 'videos_per_page':1 + } + videos, pagination_context = api.get_videos_for_course( + self.course_id, + pagination_conf=pagination_conf + ) + videos = list(videos) + self.assertEqual(len(videos), 1) + self.assertNotEqual(pagination_context, {}) + + def test_get_videos_for_course_sort(self): """ Tests retrieving videos for a course id according to sort """ def api_func(_expected_ids, sort_field, sort_direction): - return api.get_videos_for_course( + videos, __ = api.get_videos_for_course( self.course_id, sort_field, sort_direction, - ) + ) + return videos self.check_sort_params_of_api(api_func) @ddt @@ -2070,12 +2091,14 @@ def test_remove_video_for_course(self): Tests video removal for a course """ # we have one video for this course - videos = list(api.get_videos_for_course(self.course_id)) + videos, __ = api.get_videos_for_course(self.course_id) + videos = list(videos) self.assertEqual(len(videos), 1) # remove the video and verify that video is removed from correct course api.remove_video_for_course(self.course_id, self.edx_video_id) - videos = list(api.get_videos_for_course(self.course_id)) + videos, __ = api.get_videos_for_course(self.course_id) + videos = list(videos) self.assertEqual(len(videos), 0) # verify that CourseVideo related object exists(soft removal) for removed video @@ -2083,7 +2106,8 @@ def test_remove_video_for_course(self): self.assertEqual(course_video.is_hidden, True) # verify that video still exists for other course - videos = list(api.get_videos_for_course('other-course')) + videos, __ = api.get_videos_for_course('other-course') + videos = list(videos) self.assertEqual(len(videos), 1) # verify that video for other course has the correct info @@ -2197,7 +2221,7 @@ def test_get_videos_for_course(self): """ Verify that `get_videos_for_course` api function has correct course_video_image_url. """ - video_data_generator = api.get_videos_for_course(self.course_id) + video_data_generator, __ = api.get_videos_for_course(self.course_id) video_data = list(video_data_generator)[0] self.assertEqual(video_data['courses'][0]['test-course'], self.image_url) From 09c5d6fd0def4fbd909565a5dffb61a04dc0ec86 Mon Sep 17 00:00:00 2001 From: noraiz-anwar Date: Fri, 4 Jan 2019 13:34:49 +0500 Subject: [PATCH 2/2] Update version to 0.1.25 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7b6d9050..3d8c5fd8 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ def load_requirements(*requirements_paths): return list(requirements) -VERSION = '0.1.24' +VERSION = '0.1.25' if sys.argv[-1] == 'tag': print("Tagging the version on github:")