SHARE
TWEET

Untitled

a guest Jul 21st, 2019 69 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import os
  2.  
  3. from math import ceil
  4. from flask import abort, request
  5.  
  6.  
  7. class Pagination:
  8.     def __init__(self, query=None, page=None, per_page=None, total=None, items=None):
  9.         self.query = query
  10.         self.page = page
  11.         self.per_page = per_page
  12.         self.total = total
  13.         self.items = items
  14.  
  15.     @property
  16.     def pages(self):
  17.         if self.per_page == 0 or self.total is None:
  18.             pages = 0
  19.         else:
  20.             pages = int(ceil(self.total / float(self.per_page)))
  21.         return pages
  22.  
  23.     def prev(self, error_out=False):
  24.         assert self.query is not None, 'a query object is required ' \
  25.                                        'for this method to work'
  26.         return self.query.paginate(self.page - 1, self.per_page, error_out)
  27.  
  28.     @property
  29.     def prev_num(self):
  30.         if not self.has_prev:
  31.             return None
  32.         return self.page - 1
  33.  
  34.     @property
  35.     def has_prev(self):
  36.         return self.page > 1
  37.  
  38.     def next(self, error_out=False):
  39.         assert self.query is not None, 'a query object is required ' \
  40.                                        'for this method to work'
  41.         return self.query.paginate(self.page + 1, self.per_page, error_out)
  42.  
  43.     @property
  44.     def has_next(self):
  45.         return self.page < self.pages
  46.  
  47.     @property
  48.     def next_num(self):
  49.         if not self.has_next:
  50.             return None
  51.         return self.page + 1
  52.  
  53.     def iter_pages(self, left_edge=2, left_current=2,
  54.                    right_current=5, right_edge=2):
  55.         last = 0
  56.         for num in range(1, self.pages + 1):
  57.             if num <= left_edge or \
  58.                     (self.page - left_current - 1 < num < self.page + right_current) or \
  59.                     num > self.pages - right_edge:
  60.                 if last + 1 != num:
  61.                     yield None
  62.                 yield num
  63.                 last = num
  64.  
  65.     @classmethod
  66.     def paginate(cls, obj=None, page=None, per_page=None, error_out=True, max_per_page=None, count=True):
  67.         """:param obj: Query Object E.g User.query"""
  68.         if obj:
  69.             if request:
  70.                 if page is None:
  71.                     try:
  72.                         page = int(request.args.get('page', 1))
  73.                     except (TypeError, ValueError):
  74.                         if error_out:
  75.                             abort(404)
  76.                         page = 1
  77.                 if per_page is None:
  78.                     try:
  79.                         per_page = int(request.args.get('per_page', 20))
  80.                     except (TypeError, ValueError):
  81.                         if error_out:
  82.                             os.abort(404)
  83.                         per_page = 20
  84.             else:
  85.                 if page is None:
  86.                     page = 1
  87.                 if per_page is None:
  88.                     per_page = 20
  89.             if max_per_page is not None:
  90.                 per_page = min(per_page, max_per_page)
  91.             if page < 1:
  92.                 if error_out:
  93.                     abort(404)
  94.                 else:
  95.                     page = 1
  96.             if per_page < 0:
  97.                 if error_out:
  98.                     abort(404)
  99.                 else:
  100.                     per_page = 20
  101.             items = obj.limit(per_page).offset((page - 1) * per_page).all()
  102.             if not items and page != 1 and error_out:
  103.                 abort(404)
  104.             if not count:
  105.                 total = None
  106.             elif page == 1 and len(items) < per_page:
  107.                 total = len(items)
  108.             else:
  109.                 total = obj.order_by(None).count()
  110.             return Pagination(obj, page, per_page, total, items)
  111.         return None
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top