Adding python-paginate package and using it to paginate admin panel

This commit is contained in:
Juan Cruz-Benito
2020-02-13 18:35:17 +01:00
parent bc7bb5076f
commit 3d0da4f25a
3 changed files with 32 additions and 3 deletions

View File

@@ -12,7 +12,8 @@ from http.client import responses
from jinja2 import TemplateNotFound from jinja2 import TemplateNotFound
from tornado import gen from tornado import gen
from tornado import web from tornado import web
from tornado.httputil import url_concat from tornado.httputil import url_concat, urlparse
from python_paginate.web.tornado_paginate import Pagination
from .. import __version__ from .. import __version__
from .. import orm from .. import orm
@@ -402,6 +403,15 @@ class AdminHandler(BaseHandler):
@web.authenticated @web.authenticated
@admin_only @admin_only
async def get(self): 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
if per_page==10 and len(_per_page)==0:
per_page = DEFAULT_PER_PAGE
available = {'name', 'admin', 'running', 'last_activity'} available = {'name', 'admin', 'running', 'last_activity'}
default_sort = ['admin', 'name'] default_sort = ['admin', 'name']
mapping = {'running': orm.Spawner.server_id} mapping = {'running': orm.Spawner.server_id}
@@ -442,7 +452,7 @@ class AdminHandler(BaseHandler):
# get User.col.desc() order objects # get User.col.desc() order objects
ordered = [getattr(c, o)() for c, o in zip(cols, orders)] ordered = [getattr(c, o)() for c, o in zip(cols, orders)]
users = self.db.query(orm.User).outerjoin(orm.Spawner).order_by(*ordered) users = self.db.query(orm.User).outerjoin(orm.Spawner).order_by(*ordered).limit(per_page).offset(offset)
users = [self._user_from_orm(u) for u in users] users = [self._user_from_orm(u) for u in users]
from itertools import chain from itertools import chain
@@ -450,9 +460,16 @@ class AdminHandler(BaseHandler):
for u in users: for u in users:
running.extend(s for s in u.spawners.values() if s.active) running.extend(s for s in u.spawners.values() if s.active)
total = self.db.query(orm.User.id).count()
pagination = Pagination(url=self.request.uri, total=total, record_name='users',
display_msg = 'Displaying {record_name} <b>{start} - {end}</b>. Total {record_name}: {total}',
page=page, per_page=per_page)
auth_state = await self.current_user.get_auth_state() auth_state = await self.current_user.get_auth_state()
html = self.render_template( html = self.render_template(
'admin.html', 'admin.html',
request=self.request,
current_user=self.current_user, current_user=self.current_user,
auth_state=auth_state, auth_state=auth_state,
admin_access=self.settings.get('admin_access', False), admin_access=self.settings.get('admin_access', False),
@@ -462,6 +479,7 @@ class AdminHandler(BaseHandler):
allow_named_servers=self.allow_named_servers, allow_named_servers=self.allow_named_servers,
named_server_limit_per_user=self.named_server_limit_per_user, named_server_limit_per_user=self.named_server_limit_per_user,
server_version='{} {}'.format(__version__, self.version_hash), server_version='{} {}'.format(__version__, self.version_hash),
pagination=pagination
) )
self.finish(html) self.finish(html)

View File

@@ -13,3 +13,4 @@ requests
SQLAlchemy>=1.1 SQLAlchemy>=1.1
tornado>=5.0 tornado>=5.0
traitlets>=4.3.2 traitlets>=4.3.2
python-paginate

View File

@@ -18,11 +18,12 @@
{% block main %} {% block main %}
<div class="container"> <div class="container">
{{ pagination.info|safe }}
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
{% block thead %} {% block thead %}
{{ th("User (%i)" % users|length, 'name') }} {{ th("User", 'name') }}
{{ th("Admin", 'admin') }} {{ th("Admin", 'admin') }}
{{ th("Last Activity", 'last_activity') }} {{ th("Last Activity", 'last_activity') }}
{{ th("Running (%i)" % running|length, 'running', colspan=2) }} {{ th("Running (%i)" % running|length, 'running', colspan=2) }}
@@ -102,6 +103,15 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% if pagination.links %}
<tfoot>
<tr>
<th colspan="2">
<div class="ui right floated pagination menu">{{ pagination.links|safe }}</div>
</th>
</tr>
</tfoot>
{% endif %}
</div> </div>
<div class="container-fluid navbar-default small version_footer"> <div class="container-fluid navbar-default small version_footer">
<div class="navbar-text"> <div class="navbar-text">