This is an initial implementation that only allows retrieval of all threads for a course and only returns an easily computed subset of the fields that are needed, in order to keep this change from getting too large. JIRA: MA-641
59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
"""
|
|
Discussion API pagination support
|
|
"""
|
|
from rest_framework.pagination import BasePaginationSerializer, NextPageField, PreviousPageField
|
|
|
|
|
|
class _PaginationSerializer(BasePaginationSerializer):
|
|
"""
|
|
A pagination serializer without the count field, because the Comments
|
|
Service does not return result counts
|
|
"""
|
|
next = NextPageField(source="*")
|
|
previous = PreviousPageField(source="*")
|
|
|
|
|
|
class _Page(object):
|
|
"""
|
|
Implements just enough of the django.core.paginator.Page interface to allow
|
|
PaginationSerializer to work.
|
|
"""
|
|
def __init__(self, object_list, page_num, num_pages):
|
|
"""
|
|
Create a new page containing the given objects, with the given page
|
|
number and number of pages
|
|
"""
|
|
self.object_list = object_list
|
|
self.page_num = page_num
|
|
self.num_pages = num_pages
|
|
|
|
def has_next(self):
|
|
"""Returns True if there is a page after this one, otherwise False"""
|
|
return self.page_num < self.num_pages
|
|
|
|
def has_previous(self):
|
|
"""Returns True if there is a page before this one, otherwise False"""
|
|
return self.page_num > 1
|
|
|
|
def next_page_number(self):
|
|
"""Returns the number of the next page"""
|
|
return self.page_num + 1
|
|
|
|
def previous_page_number(self):
|
|
"""Returns the number of the previous page"""
|
|
return self.page_num - 1
|
|
|
|
|
|
def get_paginated_data(request, results, page_num, per_page):
|
|
"""
|
|
Return a dict with the following values:
|
|
|
|
next: The URL for the next page
|
|
previous: The URL for the previous page
|
|
results: The results on this page
|
|
"""
|
|
return _PaginationSerializer(
|
|
instance=_Page(results, page_num, per_page),
|
|
context={"request": request}
|
|
).data
|