show who you're spawning for if it's not yourself

on the spawn page
This commit is contained in:
Min RK
2018-02-28 12:02:54 +01:00
parent 304c005a85
commit b151d333d3
3 changed files with 28 additions and 12 deletions

View File

@@ -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', '')

View File

@@ -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}):

View File

@@ -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>