Skip to content
This repository has been archived by the owner on Jan 28, 2020. It is now read-only.

Commit

Permalink
Implemented page_size parameter to allow users to set page size
Browse files Browse the repository at this point in the history
  • Loading branch information
George Schneeloch committed Sep 17, 2015
1 parent c026b37 commit 6175e31
Show file tree
Hide file tree
Showing 5 changed files with 218 additions and 3 deletions.
2 changes: 1 addition & 1 deletion lore/settings.py
Expand Up @@ -345,7 +345,7 @@ def get_var(name, default):
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'PAGE_SIZE': 20,
'DEFAULT_PAGINATION_CLASS': 'rest.pagination.LorePagination',
'UPLOADED_FILES_USE_URL': False,
}

Expand Down
16 changes: 16 additions & 0 deletions rest/pagination.py
@@ -0,0 +1,16 @@
"""
Pagination classes for Lore's REST API.
"""

from __future__ import unicode_literals

from rest_framework.pagination import PageNumberPagination


class LorePagination(PageNumberPagination):
"""
Pagination class for Lore's REST API.
"""
page_size = 20
page_size_query_param = 'page_size'
max_page_size = 1000
57 changes: 57 additions & 0 deletions rest/tests/test_misc.py
Expand Up @@ -4,20 +4,48 @@
from __future__ import unicode_literals

from rest_framework.status import (
HTTP_200_OK,
HTTP_404_NOT_FOUND,
)

from learningresources.models import LearningResourceType
from rest.tests.base import (
RESTTestCase,
API_BASE,
as_json,
)
from rest.pagination import LorePagination


class TestMisc(RESTTestCase):
"""
REST test
"""

def assert_page_size(self, page_size, expected_num_results):
"""
Helper function to assert len(results) == expected_num_results.
"""
num_types = LearningResourceType.objects.filter().count()

if page_size is None:
page_size_param = ""
else:
page_size_param = "?{query_param}={page_size}".format(
query_param=LorePagination.page_size_query_param,
page_size=page_size
)
resp = self.client.get(
"{api_base}learning_resource_types/{page_size_param}".format(
api_base=API_BASE,
page_size_param=page_size_param
)
)
self.assertEqual(resp.status_code, HTTP_200_OK)
resources = as_json(resp)
self.assertEqual(len(resources['results']), expected_num_results)
self.assertEqual(resources['count'], num_types)

def test_root(self):
"""
Test root of API
Expand Down Expand Up @@ -48,3 +76,32 @@ def test_root(self):
self.assertEqual(HTTP_404_NOT_FOUND, resp.status_code)
resp = self.client.options(API_BASE)
self.assertEqual(HTTP_404_NOT_FOUND, resp.status_code)

def test_pagination(self):
"""
Test page_size query parameter.
"""
types = [
LearningResourceType(name="type_{i}".format(i=i))
for i in range(LorePagination.max_page_size + 10)
]
LearningResourceType.objects.bulk_create(types)

self.assert_page_size(2, 2)
self.assert_page_size(10, 10)
self.assert_page_size(0, LorePagination.page_size)
self.assert_page_size(None, LorePagination.page_size)
self.assert_page_size("xyz", LorePagination.page_size)
self.assert_page_size(-1, LorePagination.page_size)
self.assert_page_size(
LorePagination.max_page_size + 1,
LorePagination.max_page_size
)
self.assert_page_size(
LorePagination.max_page_size,
LorePagination.max_page_size
)
self.assert_page_size(
LorePagination.max_page_size - 1,
LorePagination.max_page_size - 1
)
132 changes: 132 additions & 0 deletions ui/tests/test_repository_views.py
@@ -0,0 +1,132 @@
"""
Tests for repository views.
"""

from __future__ import unicode_literals

import json

from rest_framework.status import HTTP_201_CREATED

from learningresources.tests.base import LoreTestCase
from rest.pagination import LorePagination
from search.sorting import LoreSortingFields


class TestRepositoryViews(LoreTestCase):
"""
Tests for repository views.
"""

def assert_page_size(self, page_size, expected_page_size):
"""
Helper function to assert page size in context.
"""
if page_size is not None:
page_size_param = "?{query_param}={page_size}".format(
query_param=LorePagination.page_size_query_param,
page_size=page_size
)
else:
page_size_param = ""

resp = self.client.get(
"/repositories/{slug}/{page_size_param}".format(
slug=self.repo.slug,
page_size_param=page_size_param
)
)
self.assertEqual(
json.loads(resp.context['page_size_json']),
expected_page_size
)

def test_page_size(self):
"""
Test that page size context is set properly.
"""
self.assert_page_size(2, 2)
self.assert_page_size(10, 10)
self.assert_page_size(0, LorePagination.page_size)
self.assert_page_size(None, LorePagination.page_size)
self.assert_page_size("xyz", LorePagination.page_size)
self.assert_page_size(-1, LorePagination.page_size)
self.assert_page_size(
LorePagination.max_page_size + 1,
LorePagination.max_page_size
)
self.assert_page_size(
LorePagination.max_page_size,
LorePagination.max_page_size
)
self.assert_page_size(
LorePagination.max_page_size - 1,
LorePagination.max_page_size - 1
)

def test_repo(self):
"""
Test that repo is present.
"""
resp = self.client.get(
"/repositories/{slug}/".format(slug=self.repo.slug))
self.assertEqual(self.repo, resp.context['repo'])

def test_perms_on_cur_repo(self):
"""
Test that perms_on_cur_repo context is set.
"""
resp = self.client.get(
"/repositories/{slug}/".format(slug=self.repo.slug))
expected_perms = [
'manage_repo_users',
'add_edit_metadata',
'manage_taxonomy',
'view_repo',
'import_course'
]
self.assertEqual(
sorted(resp.context["perms_on_cur_repo"]),
sorted(expected_perms)
)

def test_exports(self):
"""
Test presence of exports.
"""
resp = self.client.get(
"/repositories/{slug}/".format(slug=self.repo.slug))
self.assertEqual(json.loads(resp.context["exports_json"]), [])

lid = self.repo.course_set.first().resources.first().id
resp = self.client.post(
"/api/v1/repositories/{slug}/"
"learning_resource_exports/{user}/".format(
slug=self.repo.slug,
user=self.user.username,
), {"id": lid})
self.assertEqual(resp.status_code, HTTP_201_CREATED)
resp = self.client.get(
"/repositories/{slug}/".format(slug=self.repo.slug))
self.assertEqual(json.loads(resp.context["exports_json"]), [lid])

def test_sorting_options(self):
"""
Test presence of sorting options.
"""

sortby = "nr_views"
resp = self.client.get(
"/repositories/{slug}/?sortby={sortby}".format(
slug=self.repo.slug,
sortby=sortby
)
)
self.assertEqual(
json.loads(resp.context["sorting_options_json"]),
{
"current": list(LoreSortingFields.get_sorting_option(sortby)),
"all": [list(x) for x in
LoreSortingFields.all_sorting_options_but(sortby)]
}
)
14 changes: 12 additions & 2 deletions ui/views.py
Expand Up @@ -34,7 +34,7 @@
StaticAsset,
STATIC_ASSET_PREFIX,
)
from lore.settings import REST_FRAMEWORK
from rest.pagination import LorePagination
from roles.permissions import RepoPermission
from search.sorting import LoreSortingFields
from taxonomy.models import Vocabulary, Term
Expand Down Expand Up @@ -209,12 +209,22 @@ def repository_view(request, repo_slug):
sortby_field)
}

try:
page_size = int(request.GET.get(LorePagination.page_size_query_param))
except (ValueError, KeyError, TypeError):
page_size = LorePagination.page_size

if page_size <= 0:
page_size = LorePagination.page_size
elif page_size > LorePagination.max_page_size:
page_size = LorePagination.max_page_size

context = {
"repo": repo,
"perms_on_cur_repo": get_perms(request.user, repo),
"sorting_options_json": json.dumps(sorting_options),
"exports_json": json.dumps(exports),
"page_size_json": json.dumps(REST_FRAMEWORK['PAGE_SIZE'])
"page_size_json": json.dumps(page_size)
}

return render(
Expand Down

0 comments on commit 6175e31

Please sign in to comment.