Skip to content

Commit

Permalink
Merge pull request #165 from edx/noraiz/EDUCATOR-3566
Browse files Browse the repository at this point in the history
Add basic pagination in video upload page
  • Loading branch information
noraiz-anwar authored Jan 4, 2019
2 parents 6771a50 + 09c5d6f commit bfc48ea
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 14 deletions.
24 changes: 20 additions & 4 deletions edxval/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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.
Expand All @@ -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,
)


Expand Down Expand Up @@ -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):
Expand Down
42 changes: 33 additions & 9 deletions edxval/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -2070,20 +2091,23 @@ 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
course_video = CourseVideo.objects.get(course_id=self.course_id, video__edx_video_id=self.edx_video_id)
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
Expand Down Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:")
Expand Down

0 comments on commit bfc48ea

Please sign in to comment.