
This increases the speed of the site by not requiring the site and blog code to be imported on every request - just those that are relevant. It also splits the code into modules which are easier to work with.
58 lines
1.5 KiB
Python
58 lines
1.5 KiB
Python
from math import ceil
|
|
from werkzeug import import_string, cached_property
|
|
|
|
########################
|
|
# General helper methods
|
|
|
|
def get_for_page(items, page, per_page):
|
|
from_item = (page-1)*per_page
|
|
to_item = page*per_page
|
|
return items[from_item:to_item]
|
|
|
|
|
|
########################
|
|
# General helper classes
|
|
|
|
class LazyView(object):
|
|
def __init__(self, import_name):
|
|
self.__module__, self.__name__ = import_name.rsplit('.', 1)
|
|
self.import_name = import_name
|
|
|
|
@cached_property
|
|
def view(self):
|
|
return import_string(self.import_name)
|
|
|
|
def __call__(self, *args, **kwargs):
|
|
return self.view(*args, **kwargs)
|
|
|
|
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 iter_pages(self, left_edge=2, left_current=2,
|
|
right_current=5, right_edge=2):
|
|
last = 0
|
|
for num in xrange(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
|