Skip to content

Instantly share code, notes, and snippets.

@ego008
Last active January 7, 2016 07:10
Show Gist options
  • Save ego008/5a01d90f7bc283fab1fc to your computer and use it in GitHub Desktop.
Save ego008/5a01d90f7bc283fab1fc to your computer and use it in GitHub Desktop.
from math import ceil
class Pagination(object):
"""A Pagination object to be used for querying and displaying pagination links on frontend
Example usage:
>>> p = Pagination(total=15, per_page=5, current_page=1, side_page_num=3)
>>> p.start
0
>>> p.pages
[1, 2, 3]
>>> p.next_page
2
>>> p.current_page = 2
>>> p.prev_page
1
>>> p.next_page
3
>>> p.start
5
:copyright: (c) 2013 James Morris http://jmoz.co.uk.
:update: (c) 2015 Jackwei https://github.com/ego008
"""
def __init__(self, total=None, per_page=100, current_page=1, side_page_num=3):
"""init with total number of items in your set, how many you want per_page, and set the current_page you are on"""
self.total = total
self.per_page = per_page
self.current_page = current_page
self.side_page_num = side_page_num
def __repr__(self):
return str(self.__dict__)
@property
def total_pages(self):
"""The number of pages this pagination can have due to the total and per_page, e.g. total 10, per_page 5 = 2 total_pages
Cast to float so result is float, round up, then back to int
"""
return int(ceil(float(self.total) / self.per_page))
@property
def pages(self):
"""Returns list of integers of pages e.g. for 3 pages [1,2,3]"""
if 0 < self.current_page <= self.total_pages:
show_page_num = self.side_page_num * 2 + 1
from_page = self.current_page - self.side_page_num
if from_page < 1:
from_page = 1
to_page = from_page + show_page_num - 1
if to_page > self.total_pages:
to_page = self.total_pages
if to_page >= show_page_num and (to_page - from_page) < (show_page_num - 1):
from_page = to_page - show_page_num + 1
return range(from_page, to_page+1)
return []
@property
def next_page(self):
"""The page number after the current_page or None"""
return self._get_page_offset(+1)
@property
def prev_page(self):
"""The page number before the current_page or None"""
return self._get_page_offset(-1)
def _get_page_offset(self, offset):
"""Give an offset, +1 or -1 and the page number around the current_page will be returned
So if we are on current_page 2 and pass +1 we get 3, if we pass -1 we get 1. Or None if not valid
"""
try:
return self.pages[self.pages.index(self.current_page + offset)]
except ValueError:
return None
@property
def start(self):
"""The starting offset used when querying"""
return self.current_page * self.per_page - self.per_page
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment