diff --git a/jupyterhub/handlers/pages.py b/jupyterhub/handlers/pages.py index 0bcca7a6..20052b35 100644 --- a/jupyterhub/handlers/pages.py +++ b/jupyterhub/handlers/pages.py @@ -10,7 +10,6 @@ from datetime import datetime from http.client import responses from jinja2 import TemplateNotFound -from python_paginate.web.tornado_paginate import Pagination from tornado import gen from tornado import web from tornado.httputil import url_concat @@ -404,15 +403,7 @@ class AdminHandler(BaseHandler): @web.authenticated @admin_only async def get(self): - DEFAULT_PER_PAGE = 100 - page, per_page, offset = Pagination.get_page_args(self) - _per_page = self.get_arguments("per_page") - # No arg called per_page in the URL, - # avoiding default value from the python-paginate lib - # https://github.com/lixxu/python-paginate/blob/master/python_paginate/web/tornado_paginate.py#L23 - if per_page == 10 and len(_per_page) == 0: - per_page = DEFAULT_PER_PAGE available = {'name', 'admin', 'running', 'last_activity'} default_sort = ['admin', 'name'] @@ -472,8 +463,6 @@ class AdminHandler(BaseHandler): pagination = Pagination( url=self.request.uri, total=total, - record_name='users', - display_msg='Displaying {record_name} {start} - {end}. Total {record_name}: {total}', page=page, per_page=per_page, ) @@ -619,6 +608,63 @@ class HealthCheckHandler(BaseHandler): def get(self, *args): self.finish() +class Pagination(BaseHandler): + + _page_name = 'page' + _per_page_name = 'per_page' + _default_page = 1 + _default_per_page = 100 + _max_per_page = 250 + _record_name='users' + _display_msg='Displaying {record_name} {start} - {end}. Total {record_name}: {total}' + + def __init__(self, *args, **kwargs): + """Detail parameters remark. + **url**: current request url + **page**: current page + **per_page**: how many records displayed on one page. By default 100 + **total**: total records for pagination + **display_msg**: text for pagation information + **record_name**: record name showed in pagination information + """ + self.page = kwargs.get(self._page_name, 1) + + if self.per_page > self._max_per_page: + self.per_page = self._max_per_page + + self.total = int(kwargs.get('total', 0)) + self.display_msg = kwargs.get('display_msg', self._display_msg) + + self.record_name = kwargs.get('record_name', self._record_name) + self.url = kwargs.get('url') or self.get_url() + self.init_values() + + def init_values(self): + self._cached = {} + self.skip = (self.page - 1) * self.per_page + pages = divmod(self.total, self.per_page) + self.total_pages = pages[0] + 1 if pages[1] else pages[0] + + self.has_prev = self.page > 1 + self.has_next = self.page < self.total_pages + + @classmethod + def get_page_args(self, handler): + self.page = handler.get_argument(self._page_name, self._default_page) + self.per_page = handler.get_argument(self._per_page_name, self._default_per_page) + try: + self.per_page = int(self.per_page) + if self.per_page > self._max_per_page: + self.per_page = self._max_per_page + except: + self.per_page = self._default_per_page + + try: + self.page = int(self.page) + except: + self.page = self._default_page + + return self.page, self.per_page, self.per_page * (self.page - 1) default_handlers = [ (r'/', RootHandler), diff --git a/requirements.txt b/requirements.txt index 74215f5a..825fd409 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,6 @@ pamela prometheus_client>=0.0.21 psutil>=5.6.5; sys_platform == 'win32' python-dateutil -python-paginate requests SQLAlchemy>=1.1 tornado>=5.0