mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-15 14:03:02 +00:00
show who you're spawning for if it's not yourself
on the spawn page
This commit is contained in:
@@ -88,11 +88,11 @@ class SpawnHandler(BaseHandler):
|
|||||||
Only enabled when Spawner.options_form is defined.
|
Only enabled when Spawner.options_form is defined.
|
||||||
"""
|
"""
|
||||||
@gen.coroutine
|
@gen.coroutine
|
||||||
def _render_form(self, message=''):
|
def _render_form(self, message='', for_user=None):
|
||||||
user = self.get_current_user()
|
user = self.get_current_user()
|
||||||
spawner_options_form = yield user.spawner.get_options_form()
|
spawner_options_form = yield user.spawner.get_options_form()
|
||||||
return self.render_template('spawn.html',
|
return self.render_template('spawn.html',
|
||||||
user=user,
|
for_user=for_user,
|
||||||
spawner_options_form=spawner_options_form,
|
spawner_options_form=spawner_options_form,
|
||||||
error_message=message,
|
error_message=message,
|
||||||
url=self.request.uri,
|
url=self.request.uri,
|
||||||
@@ -105,7 +105,7 @@ class SpawnHandler(BaseHandler):
|
|||||||
|
|
||||||
or triggers spawn via redirect if there is no form.
|
or triggers spawn via redirect if there is no form.
|
||||||
"""
|
"""
|
||||||
user = self.get_current_user()
|
user = current_user = self.get_current_user()
|
||||||
if for_user is not None and for_user != user.name:
|
if for_user is not None and for_user != user.name:
|
||||||
if not user.admin:
|
if not user.admin:
|
||||||
raise web.HTTPError(403, "Only admins can spawn on behalf of other users")
|
raise web.HTTPError(403, "Only admins can spawn on behalf of other users")
|
||||||
@@ -120,7 +120,7 @@ class SpawnHandler(BaseHandler):
|
|||||||
self.redirect(url)
|
self.redirect(url)
|
||||||
return
|
return
|
||||||
if user.spawner.options_form:
|
if user.spawner.options_form:
|
||||||
form = yield self._render_form()
|
form = yield self._render_form(for_user=user)
|
||||||
self.finish(form)
|
self.finish(form)
|
||||||
else:
|
else:
|
||||||
# Explicit spawn request: clear _spawn_future
|
# Explicit spawn request: clear _spawn_future
|
||||||
@@ -135,7 +135,7 @@ class SpawnHandler(BaseHandler):
|
|||||||
@gen.coroutine
|
@gen.coroutine
|
||||||
def post(self, for_user=None):
|
def post(self, for_user=None):
|
||||||
"""POST spawns with user-specified options"""
|
"""POST spawns with user-specified options"""
|
||||||
user = self.get_current_user()
|
user = current_user = self.get_current_user()
|
||||||
if for_user is not None and for_user != user.name:
|
if for_user is not None and for_user != user.name:
|
||||||
if not user.admin:
|
if not user.admin:
|
||||||
raise web.HTTPError(403, "Only admins can spawn on behalf of other users")
|
raise web.HTTPError(403, "Only admins can spawn on behalf of other users")
|
||||||
@@ -161,9 +161,11 @@ class SpawnHandler(BaseHandler):
|
|||||||
yield self.spawn_single_user(user, options=options)
|
yield self.spawn_single_user(user, options=options)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.log.error("Failed to spawn single-user server with form", exc_info=True)
|
self.log.error("Failed to spawn single-user server with form", exc_info=True)
|
||||||
self.finish(self._render_form(str(e)))
|
form = yield self._render_form(message=str(e), for_usr=user)
|
||||||
|
self.finish(form)
|
||||||
return
|
return
|
||||||
self.set_login_cookie(user)
|
if current_user is user:
|
||||||
|
self.set_login_cookie(user)
|
||||||
url = user.url
|
url = user.url
|
||||||
|
|
||||||
next_url = self.get_argument('next', '')
|
next_url = self.get_argument('next', '')
|
||||||
|
@@ -174,6 +174,17 @@ def test_spawn_page(app):
|
|||||||
assert FormSpawner.options_form in r.text
|
assert FormSpawner.options_form in r.text
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.gen_test
|
||||||
|
def test_spawn_page_admin(app):
|
||||||
|
with mock.patch.dict(app.users.settings, {'spawner_class': FormSpawner}):
|
||||||
|
cookies = yield app.login_user('admin')
|
||||||
|
u = add_user(app.db, app=app, name='melanie')
|
||||||
|
r = yield get_page('spawn/' + u.name, app, cookies=cookies)
|
||||||
|
assert r.url.endswith('/spawn/' + u.name)
|
||||||
|
assert FormSpawner.options_form in r.text
|
||||||
|
assert "Spawning server for {}".format(u.name) in r.text
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.gen_test
|
@pytest.mark.gen_test
|
||||||
def test_spawn_form(app):
|
def test_spawn_form(app):
|
||||||
with mock.patch.dict(app.users.settings, {'spawner_class': FormSpawner}):
|
with mock.patch.dict(app.users.settings, {'spawner_class': FormSpawner}):
|
||||||
|
@@ -7,11 +7,14 @@
|
|||||||
<h1>Spawner options</h1>
|
<h1>Spawner options</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="row col-sm-offset-2 col-sm-8">
|
<div class="row col-sm-offset-2 col-sm-8">
|
||||||
{% if error_message %}
|
{% if for_user and user.name != for_user.name -%}
|
||||||
<p class="spawn-error-msg text-danger">
|
<p>Spawning server for {{ for_user.name }}</p>
|
||||||
Error: {{error_message}}
|
{% endif -%}
|
||||||
</p>
|
{% if error_message -%}
|
||||||
{% endif %}
|
<p class="spawn-error-msg text-danger">
|
||||||
|
Error: {{error_message}}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
<form enctype="multipart/form-data" id="spawn_form" action="{{url}}" method="post" role="form">
|
<form enctype="multipart/form-data" id="spawn_form" action="{{url}}" method="post" role="form">
|
||||||
{{spawner_options_form | safe}}
|
{{spawner_options_form | safe}}
|
||||||
<br>
|
<br>
|
||||||
|
Reference in New Issue
Block a user