mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-17 23:13:00 +00:00
make user.running a method
accept server names
This commit is contained in:
@@ -93,7 +93,7 @@ class APIHandler(BaseHandler):
|
||||
'name': user.name,
|
||||
'admin': user.admin,
|
||||
'groups': [ g.name for g in user.groups ],
|
||||
'server': user.url if user.running else None,
|
||||
'server': user.url if user.running('') else None,
|
||||
'pending': None,
|
||||
'last_activity': user.last_activity.isoformat(),
|
||||
}
|
||||
@@ -105,7 +105,7 @@ class APIHandler(BaseHandler):
|
||||
# TODO: named servers
|
||||
servers = model['servers'] = {}
|
||||
for name, spawner in user.spawners.items():
|
||||
if False and user.running(name):
|
||||
if user.running(name):
|
||||
servers[name] = s = {'name': name}
|
||||
if spawner._spawn_pending:
|
||||
s['pending'] = 'spawn'
|
||||
|
@@ -148,7 +148,7 @@ class UserAPIHandler(APIHandler):
|
||||
raise web.HTTPError(400, "Cannot delete yourself!")
|
||||
if user.spawner._stop_pending:
|
||||
raise web.HTTPError(400, "%s's server is in the process of stopping, please wait." % name)
|
||||
if user.running:
|
||||
if user.running(''):
|
||||
yield self.stop_single_user(user)
|
||||
if user.spawner._stop_pending:
|
||||
raise web.HTTPError(400, "%s's server is in the process of stopping, please wait." % name)
|
||||
@@ -185,7 +185,7 @@ class UserServerAPIHandler(APIHandler):
|
||||
@admin_or_self
|
||||
def post(self, name):
|
||||
user = self.find_user(name)
|
||||
if user.running:
|
||||
if user.running(''):
|
||||
# include notify, so that a server that died is noticed immediately
|
||||
state = yield user.spawner.poll_and_notify()
|
||||
if state is None:
|
||||
@@ -203,7 +203,7 @@ class UserServerAPIHandler(APIHandler):
|
||||
if user.spawner._stop_pending:
|
||||
self.set_status(202)
|
||||
return
|
||||
if not user.running:
|
||||
if not user.running(''):
|
||||
raise web.HTTPError(400, "%s's server is not running" % name)
|
||||
# include notify, so that a server that died is noticed immediately
|
||||
status = yield user.spawner.poll_and_notify()
|
||||
@@ -240,8 +240,8 @@ class UserNamedServerAPIHandler(APIHandler):
|
||||
if spawner._stop_pending:
|
||||
self.set_status(202)
|
||||
return
|
||||
#if not user.running:
|
||||
# raise web.HTTPError(400, "%s's server is not running" % name)
|
||||
if not user.running(name):
|
||||
raise web.HTTPError(400, "%s's server is not running" % name)
|
||||
# include notify, so that a server that died is noticed immediately
|
||||
status = yield spawner.poll_and_notify()
|
||||
if status is not None:
|
||||
@@ -268,8 +268,6 @@ class UserAdminAccessAPIHandler(APIHandler):
|
||||
user = self.find_user(name)
|
||||
if user is None:
|
||||
raise web.HTTPError(404)
|
||||
if not user.running:
|
||||
raise web.HTTPError(400, "%s's server is not running" % name)
|
||||
|
||||
|
||||
default_handlers = [
|
||||
|
@@ -54,7 +54,7 @@ class LoginHandler(BaseHandler):
|
||||
user = self.get_current_user()
|
||||
if user:
|
||||
if not next_url:
|
||||
if user.running:
|
||||
if user.running(''):
|
||||
next_url = user.url
|
||||
else:
|
||||
next_url = self.hub.base_url
|
||||
|
@@ -45,7 +45,7 @@ class RootHandler(BaseHandler):
|
||||
return
|
||||
user = self.get_current_user()
|
||||
if user:
|
||||
if user.running:
|
||||
if user.running(''):
|
||||
url = user.url
|
||||
self.log.debug("User is running: %s", url)
|
||||
self.set_login_cookie(user) # set cookie
|
||||
@@ -64,7 +64,7 @@ class HomeHandler(BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
user = self.get_current_user()
|
||||
if user.running:
|
||||
if user.running(''):
|
||||
# trigger poll_and_notify event in case of a server that died
|
||||
yield user.spawner.poll_and_notify()
|
||||
html = self.render_template('home.html',
|
||||
@@ -94,7 +94,7 @@ class SpawnHandler(BaseHandler):
|
||||
def get(self):
|
||||
"""GET renders form for spawning with user-specified options"""
|
||||
user = self.get_current_user()
|
||||
if user.running:
|
||||
if not self.allow_named_servers and user.running(''):
|
||||
url = user.url
|
||||
self.log.debug("User is running: %s", url)
|
||||
self.redirect(url)
|
||||
@@ -110,7 +110,7 @@ class SpawnHandler(BaseHandler):
|
||||
def post(self):
|
||||
"""POST spawns with user-specified options"""
|
||||
user = self.get_current_user()
|
||||
if user.running:
|
||||
if not self.allow_named_servers and user.running(''):
|
||||
url = user.url
|
||||
self.log.warning("User is already running: %s", url)
|
||||
self.redirect(url)
|
||||
|
@@ -31,7 +31,6 @@ def db():
|
||||
user = orm.User(
|
||||
name=getuser(),
|
||||
)
|
||||
user.servers.append(orm.Server())
|
||||
_db.add(user)
|
||||
_db.commit()
|
||||
return _db
|
||||
|
@@ -161,7 +161,7 @@ def test_spawn_fails(db, io_loop):
|
||||
with pytest.raises(RuntimeError) as exc:
|
||||
io_loop.run_sync(user.spawn)
|
||||
assert user.server is None
|
||||
assert not user.running
|
||||
assert not user.running('')
|
||||
|
||||
|
||||
def test_groups(db):
|
||||
|
@@ -18,7 +18,7 @@ def test_singleuser_auth(app, io_loop):
|
||||
# login, start the server
|
||||
cookies = app.login_user('nandy')
|
||||
user = app.users['nandy']
|
||||
if not user.running:
|
||||
if not user.running(''):
|
||||
io_loop.run_sync(user.spawn)
|
||||
url = public_url(app, user)
|
||||
|
||||
@@ -52,7 +52,7 @@ def test_disable_user_config(app, io_loop):
|
||||
cookies = app.login_user('nandy')
|
||||
user = app.users['nandy']
|
||||
# stop spawner, if running:
|
||||
if user.running:
|
||||
if user.running(''):
|
||||
print("stopping")
|
||||
io_loop.run_sync(user.stop)
|
||||
# start with new config:
|
||||
|
@@ -149,11 +149,12 @@ class User(HasTraits):
|
||||
self.spawners = _SpawnerDict(self._new_spawner)
|
||||
# load existing named spawners
|
||||
for name in self.orm_spawners:
|
||||
self.log.debug("Loading spawner %s:%s", self.name, name)
|
||||
self.spawners[name] = self._new_spawner(name)
|
||||
|
||||
def _new_spawner(self, name):
|
||||
"""Create a new spawner"""
|
||||
self.log.debug("Creating Spawner for %s:%s", self.name, name)
|
||||
|
||||
orm_spawner = self.orm_spawners.get(name)
|
||||
if orm_spawner is None:
|
||||
orm_spawner = orm.Spawner(user=self.orm_user, name=name)
|
||||
@@ -202,11 +203,12 @@ class User(HasTraits):
|
||||
|
||||
def __repr__(self):
|
||||
return repr(self.orm_user)
|
||||
|
||||
@property
|
||||
def running(self):
|
||||
|
||||
def running(self, name):
|
||||
"""property for whether a user has a running server"""
|
||||
spawner = self.spawner
|
||||
if name not in self.spawners:
|
||||
return False
|
||||
spawner = self.spawners[name]
|
||||
if spawner._spawn_pending or spawner._stop_pending:
|
||||
return False # server is not running if spawn or stop is still pending
|
||||
if spawner.server is None:
|
||||
@@ -222,12 +224,11 @@ class User(HasTraits):
|
||||
"""My name, escaped for use in URLs, cookies, etc."""
|
||||
return quote(self.name, safe='@')
|
||||
|
||||
@property
|
||||
def proxy_spec(self):
|
||||
def proxy_spec(self, name=''):
|
||||
if self.settings.get('subdomain_host'):
|
||||
return self.domain + self.base_url
|
||||
return url_path_join(self.domain, self.base_url, name)
|
||||
else:
|
||||
return self.base_url
|
||||
return url_path_join(self.base_url, name)
|
||||
|
||||
@property
|
||||
def domain(self):
|
||||
|
@@ -44,12 +44,12 @@
|
||||
<td class="admin-col col-sm-2">{% if u.admin %}admin{% endif %}</td>
|
||||
<td class="time-col col-sm-3">{{u.last_activity.isoformat() + 'Z'}}</td>
|
||||
<td class="server-col col-sm-2 text-center">
|
||||
<span class="stop-server btn btn-xs btn-danger {% if not u.running %}hidden{% endif %}">stop server</span>
|
||||
<span class="start-server btn btn-xs btn-success {% if u.running %}hidden{% endif %}">start server</span>
|
||||
<span class="stop-server btn btn-xs btn-danger {% if not u.running('') %}hidden{% endif %}">stop server</span>
|
||||
<span class="start-server btn btn-xs btn-success {% if u.running('') %}hidden{% endif %}">start server</span>
|
||||
</td>
|
||||
<td class="server-col col-sm-1 text-center">
|
||||
{% if admin_access %}
|
||||
<span class="access-server btn btn-xs btn-success {% if not u.running %}hidden{% endif %}">access server</span>
|
||||
<span class="access-server btn btn-xs btn-success {% if not u.running('') %}hidden{% endif %}">access server</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="edit-col col-sm-1 text-center">
|
||||
|
Reference in New Issue
Block a user