depicts/depicts/pager.py

48 lines
1.3 KiB
Python

from math import ceil
from flask import request, url_for
class Pagination(object):
def __init__(self, page, per_page, total_count):
self.page = page
self.per_page = per_page
self.total_count = total_count
@property
def pages(self):
return int(ceil(self.total_count / float(self.per_page)))
@property
def has_prev(self):
return self.page > 1
@property
def has_next(self):
return self.page < self.pages
def slice(self, items):
first = ((self.page - 1) * self.per_page)
last = self.page * self.per_page
return items[first:last]
def iter_pages(self, left_edge=2, left_current=6,
right_current=6, right_edge=2):
last = 0
for num in range(1, self.pages + 1):
if num <= left_edge or \
(num > self.page - left_current - 1 and \
num < self.page + right_current) or \
num > self.pages - right_edge:
if last + 1 != num:
yield None
yield num
last = num
def url_for_other_page(page):
args = request.view_args.copy()
args.update(request.args)
args['page'] = page
return url_for(request.endpoint, **args)
def init_pager(app):
app.jinja_env.globals['url_for_other_page'] = url_for_other_page