From b151d333d39c152b7b53c5657b75cd16cbe77e9e Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 28 Feb 2018 12:02:54 +0100 Subject: [PATCH] show who you're spawning for if it's not yourself on the spawn page --- jupyterhub/handlers/pages.py | 16 +++++++++------- jupyterhub/tests/test_pages.py | 11 +++++++++++ share/jupyterhub/templates/spawn.html | 13 ++++++++----- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/jupyterhub/handlers/pages.py b/jupyterhub/handlers/pages.py index 2a25ad29..ca4a3f13 100644 --- a/jupyterhub/handlers/pages.py +++ b/jupyterhub/handlers/pages.py @@ -88,11 +88,11 @@ class SpawnHandler(BaseHandler): Only enabled when Spawner.options_form is defined. """ @gen.coroutine - def _render_form(self, message=''): + def _render_form(self, message='', for_user=None): user = self.get_current_user() spawner_options_form = yield user.spawner.get_options_form() return self.render_template('spawn.html', - user=user, + for_user=for_user, spawner_options_form=spawner_options_form, error_message=message, url=self.request.uri, @@ -105,7 +105,7 @@ class SpawnHandler(BaseHandler): 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 not user.admin: raise web.HTTPError(403, "Only admins can spawn on behalf of other users") @@ -120,7 +120,7 @@ class SpawnHandler(BaseHandler): self.redirect(url) return if user.spawner.options_form: - form = yield self._render_form() + form = yield self._render_form(for_user=user) self.finish(form) else: # Explicit spawn request: clear _spawn_future @@ -135,7 +135,7 @@ class SpawnHandler(BaseHandler): @gen.coroutine def post(self, for_user=None): """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 not user.admin: 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) except Exception as e: 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 - self.set_login_cookie(user) + if current_user is user: + self.set_login_cookie(user) url = user.url next_url = self.get_argument('next', '') diff --git a/jupyterhub/tests/test_pages.py b/jupyterhub/tests/test_pages.py index ce7d3f68..0155e0e5 100644 --- a/jupyterhub/tests/test_pages.py +++ b/jupyterhub/tests/test_pages.py @@ -174,6 +174,17 @@ def test_spawn_page(app): 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 def test_spawn_form(app): with mock.patch.dict(app.users.settings, {'spawner_class': FormSpawner}): diff --git a/share/jupyterhub/templates/spawn.html b/share/jupyterhub/templates/spawn.html index a3060168..902a364d 100644 --- a/share/jupyterhub/templates/spawn.html +++ b/share/jupyterhub/templates/spawn.html @@ -7,11 +7,14 @@

Spawner options

- {% if error_message %} -

- Error: {{error_message}} -

- {% endif %} + {% if for_user and user.name != for_user.name -%} +

Spawning server for {{ for_user.name }}

+ {% endif -%} + {% if error_message -%} +

+ Error: {{error_message}} +

+ {% endif %}
{{spawner_options_form | safe}}