Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.58 KB | None | 0 0
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement