2017-09-09 23:10:52 +00:00
|
|
|
from flask import current_app
|
2018-10-10 08:20:17 +00:00
|
|
|
from werkzeug.datastructures import MultiDict
|
2017-09-09 23:10:52 +00:00
|
|
|
|
2017-09-20 10:57:00 +00:00
|
|
|
from alerta.exceptions import ApiError
|
2017-09-09 23:10:52 +00:00
|
|
|
|
|
|
|
|
2018-09-15 22:07:50 +00:00
|
|
|
class Page:
|
2017-09-09 23:10:52 +00:00
|
|
|
|
2019-08-10 21:14:11 +00:00
|
|
|
def __init__(self, page: int = 1, page_size: int = None, items: int = 0) -> None:
|
2017-09-09 23:10:52 +00:00
|
|
|
|
|
|
|
self.page = page
|
|
|
|
self.page_size = page_size or current_app.config['DEFAULT_PAGE_SIZE']
|
|
|
|
self.items = items
|
|
|
|
|
|
|
|
if items and self.page > self.pages or self.page < 1:
|
2018-09-15 22:20:53 +00:00
|
|
|
raise ApiError('page out of range: 1-%s' % self.pages, 416)
|
2017-09-09 23:10:52 +00:00
|
|
|
|
|
|
|
@staticmethod
|
2018-10-10 08:20:17 +00:00
|
|
|
def from_params(params: MultiDict, items: int) -> 'Page':
|
2017-09-09 23:10:52 +00:00
|
|
|
# page, page-size, limit (deprecated)
|
|
|
|
page = params.get('page', 1, int)
|
|
|
|
limit = params.get('limit', 0, int)
|
2017-12-01 23:14:04 +00:00
|
|
|
page_size = params.get('page-size', limit, int)
|
2017-09-09 23:10:52 +00:00
|
|
|
|
|
|
|
return Page(page, page_size, items)
|
|
|
|
|
|
|
|
@property
|
2018-10-10 08:20:17 +00:00
|
|
|
def pages(self) -> int:
|
2017-09-09 23:10:52 +00:00
|
|
|
return ((self.items - 1) // self.page_size) + 1
|
|
|
|
|
|
|
|
@property
|
2018-10-10 08:20:17 +00:00
|
|
|
def has_more(self) -> bool:
|
2017-09-09 23:10:52 +00:00
|
|
|
return self.page < self.pages
|