mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-09 11:03:00 +00:00
Adding python-paginate package and using it to paginate admin panel
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
@@ -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
|
@@ -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">
|
||||||
|
Reference in New Issue
Block a user