Paginate listing users and groups

This commit is contained in:
Nathan Barber
2021-04-09 16:57:32 -04:00
parent 2ff6d2b36c
commit 2fa331bd36
3 changed files with 23 additions and 2 deletions

1
.gitignore vendored
View File

@@ -29,3 +29,4 @@ htmlcov
pip-wheel-metadata pip-wheel-metadata
docs/source/reference/metrics.rst docs/source/reference/metrics.rst
oldest-requirements.txt oldest-requirements.txt
jupyterhub-proxy.pid

View File

@@ -37,7 +37,17 @@ class GroupListAPIHandler(_GroupAPIHandler):
@admin_only @admin_only
def get(self): def get(self):
"""List groups""" """List groups"""
data = [self.group_model(g) for g in self.db.query(orm.Group)] offset = self.get_argument("offset", None)
limit = self.get_argument("limit", None)
groups_query = self.db.query(orm.Group)
if offset is not None or limit is not None:
offset = 0 if not offset else int(offset)
limit = None if not limit else int(limit)
groups_query = groups_query.offset(offset).limit(limit)
data = [self.group_model(g) for g in groups_query]
self.write(json.dumps(data)) self.write(json.dumps(data))
@admin_only @admin_only
@@ -76,7 +86,8 @@ class GroupAPIHandler(_GroupAPIHandler):
@admin_only @admin_only
def get(self, name): def get(self, name):
group = self.find_group(name) group = self.find_group(name)
self.write(json.dumps(self.group_model(group))) group_model = self.group_model(group)
self.write(json.dumps(group_model))
@admin_only @admin_only
async def post(self, name): async def post(self, name):

View File

@@ -55,6 +55,8 @@ class UserListAPIHandler(APIHandler):
@admin_only @admin_only
def get(self): def get(self):
state_filter = self.get_argument("state", None) state_filter = self.get_argument("state", None)
offset = self.get_argument("offset", None)
limit = self.get_argument("limit", None)
# post_filter # post_filter
post_filter = None post_filter = None
@@ -95,11 +97,18 @@ class UserListAPIHandler(APIHandler):
# no filter, return all users # no filter, return all users
query = self.db.query(orm.User) query = self.db.query(orm.User)
# Apply offset and limit for request pagination
if offset is not None or limit is not None:
offset = 0 if not offset else int(offset)
limit = None if not limit else int(limit)
query = query.offset(offset).limit(limit)
data = [ data = [
self.user_model(u, include_servers=True, include_state=True) self.user_model(u, include_servers=True, include_state=True)
for u in query for u in query
if (post_filter is None or post_filter(u)) if (post_filter is None or post_filter(u))
] ]
self.write(json.dumps(data)) self.write(json.dumps(data))
@admin_only @admin_only