diff --git a/jsc_custom/handler/share_handler.py b/jsc_custom/handler/share_handler.py index f8a0b5047dd98dd72a611c3235ab2d87132de3d6..ff7d0d9ea6cad8f12f77f9d508af41a95928e909 100644 --- a/jsc_custom/handler/share_handler.py +++ b/jsc_custom/handler/share_handler.py @@ -111,14 +111,13 @@ class ShareUserOptionsSpawnHandler(SpawnHandler): self.db.add(db_entry) self.db.commit() spawner.user_options = user_options - service = db_entry.user_options.get("service", "jupyterlab") spawner.user_options["share_id"] = secret spawner.orm_spawner.user_options = db_entry.user_options self.db.add(spawner.orm_spawner) self.db.commit() - url = url_path_join(self.hub.base_url, "home") - self.redirect(f"{url}?service={service}&row={spawner.name}") + url = url_path_join(self.hub.base_url, "start", user.name, spawner.name) + self.redirect(url) class R2DHandler(SpawnHandler): @@ -229,10 +228,8 @@ class R2DHandler(SpawnHandler): self.db.add(spawner.orm_spawner) self.db.commit() - url = url_path_join(self.hub.base_url, "home") - self.redirect( - f"{url}?service={user_options.get('service', 'jupyterlab')}&row={spawner.name}&start" - ) + url = url_path_join(self.hub.base_url, "start", user.name, spawner.name) + self.redirect(url) default_handlers.append((r"/share/user_options/([^/]+)", ShareUserOptionsSpawnHandler)) diff --git a/jsc_custom/handler/workshop_manage.py b/jsc_custom/handler/workshop_manage.py index d3b45aafc4cad6b01f0b3bd2e6be96ac525c625d..29b54fbe8fe0f3bbcf6fbb38f0ebe64020587067 100644 --- a/jsc_custom/handler/workshop_manage.py +++ b/jsc_custom/handler/workshop_manage.py @@ -118,5 +118,71 @@ class WorkshopHandler(SpawnHandler): self.finish(form) +class StartHandler(SpawnHandler): + async def _render_form(self, for_user, spawner): + url = url_path_join(self.base_url, "user", for_user.escaped_name, spawner.name) + auth_state = await for_user.get_auth_state() + return await self.render_template( + "start.html", + for_user=for_user, + auth_state=auth_state, + spawner=spawner, + url=url, + ) + + @web.authenticated + async def get(self, user_name, server_name=""): + for_user = user_name + + user = self.current_user + if for_user != user.name: + user = self.find_user(for_user) + if user is None: + raise web.HTTPError(404, f"No such user: {for_user}") + + if server_name: + if not self.allow_named_servers: + raise web.HTTPError(400, "Named servers are not enabled.") + + named_server_limit_per_user = ( + await self.get_current_user_named_server_limit() + ) + + if named_server_limit_per_user > 0 and server_name not in user.orm_spawners: + named_spawners = list(user.all_spawners(include_default=False)) + if named_server_limit_per_user <= len(named_spawners): + raise web.HTTPError( + 400, + f"User {user.name} already has the maximum of {named_server_limit_per_user} named servers." + " One must be deleted before a new server can be created", + ) + + if not self.allow_named_servers and user.running: + url = self.get_next_url(user, default=user.server_url("")) + self.log.info("User is running: %s", user.name) + self.redirect(url) + return + + spawner = user.get_spawner(server_name, replace_failed=True) + self.db.refresh(spawner.orm_spawner) + + # spawner is active, redirect back to get progress, etc. + if spawner.ready: + self.log.info("Server %s is already running", spawner._log_name) + next_url = self.get_next_url(user, default=user.server_url(server_name)) + self.redirect(next_url) + return + + elif spawner.active: + pending_url = self._get_pending_url(user, server_name) + self.log.info("Server %s is already active", spawner._log_name) + self.redirect(pending_url) + return + + form = await self._render_form(user, spawner=spawner.orm_spawner) + self.finish(form) + + default_handlers.append((r"/workshopmanager", WorkshopManageHandler)) default_handlers.append((r"/workshops/([^/]+)", WorkshopHandler)) +default_handlers.append((r"/start/([^/]+)/([^/]+)", StartHandler))