mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-07 10:04:07 +00:00
move static resources to share/jupyterhub
from share/jupyter/hub to be consistent with use of etc/jupyterhub etc.
This commit is contained in:
18
MANIFEST.in
18
MANIFEST.in
@@ -18,15 +18,15 @@ graft docs
|
||||
prune docs/node_modules
|
||||
|
||||
# prune some large unused files from components
|
||||
prune share/jupyter/hub/static/components/bootstrap/dist/css
|
||||
exclude share/jupyter/hub/static/components/bootstrap/dist/fonts/*.svg
|
||||
prune share/jupyter/hub/static/components/font-awesome/css
|
||||
prune share/jupyter/hub/static/components/font-awesome/scss
|
||||
exclude share/jupyter/hub/static/components/font-awesome/fonts/*.svg
|
||||
prune share/jupyter/hub/static/components/jquery/external
|
||||
prune share/jupyter/hub/static/components/jquery/src
|
||||
prune share/jupyter/hub/static/components/moment/lang
|
||||
prune share/jupyter/hub/static/components/moment/min
|
||||
prune share/jupyterhub/static/components/bootstrap/dist/css
|
||||
exclude share/jupyterhub/static/components/bootstrap/dist/fonts/*.svg
|
||||
prune share/jupyterhub/static/components/font-awesome/css
|
||||
prune share/jupyterhub/static/components/font-awesome/scss
|
||||
exclude share/jupyterhub/static/components/font-awesome/fonts/*.svg
|
||||
prune share/jupyterhub/static/components/jquery/external
|
||||
prune share/jupyterhub/static/components/jquery/src
|
||||
prune share/jupyterhub/static/components/moment/lang
|
||||
prune share/jupyterhub/static/components/moment/min
|
||||
|
||||
# Patterns to exclude from any directory
|
||||
global-exclude *~
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
def get_data_files():
|
||||
"""Walk up until we find share/jupyter/hub"""
|
||||
"""Walk up until we find share/jupyterhub"""
|
||||
import sys
|
||||
from os.path import join, abspath, dirname, exists, split
|
||||
path = abspath(dirname(__file__))
|
||||
@@ -12,10 +12,10 @@ def get_data_files():
|
||||
for path in starting_points:
|
||||
# walk up, looking for prefix/share/jupyter
|
||||
while path != '/':
|
||||
share_jupyter = join(path, 'share', 'jupyter', 'hub')
|
||||
static = join(share_jupyter, 'static')
|
||||
share_jupyterhub = join(path, 'share', 'jupyterhub')
|
||||
static = join(share_jupyterhub, 'static')
|
||||
if all(exists(join(static, f)) for f in ['components', 'css']):
|
||||
return share_jupyter
|
||||
return share_jupyterhub
|
||||
path, _ = split(path)
|
||||
# didn't find it, give up
|
||||
return ''
|
||||
|
@@ -263,7 +263,7 @@ class JupyterHub(Application):
|
||||
).tag(config=True)
|
||||
|
||||
data_files_path = Unicode(DATA_FILES_PATH,
|
||||
help="The location of jupyterhub data files (e.g. /usr/local/share/jupyter/hub)"
|
||||
help="The location of jupyterhub data files (e.g. /usr/local/share/jupyterhub)"
|
||||
).tag(config=True)
|
||||
|
||||
template_paths = List(
|
||||
|
4
setup.py
4
setup.py
@@ -38,7 +38,7 @@ from setuptools.command.bdist_egg import bdist_egg
|
||||
pjoin = os.path.join
|
||||
|
||||
here = os.path.abspath(os.path.dirname(__file__))
|
||||
share_jupyter = pjoin(here, 'share', 'jupyter', 'hub')
|
||||
share_jupyterhub = pjoin(here, 'share', 'jupyterhub')
|
||||
static = pjoin(share_jupyter, 'static')
|
||||
|
||||
is_repo = os.path.exists(pjoin(here, '.git'))
|
||||
@@ -53,7 +53,7 @@ def get_data_files():
|
||||
data_files = []
|
||||
ntrim = len(here + os.path.sep)
|
||||
|
||||
for (d, dirs, filenames) in os.walk(share_jupyter):
|
||||
for (d, dirs, filenames) in os.walk(share_jupyterhub):
|
||||
data_files.append((
|
||||
d[ntrim:],
|
||||
[ pjoin(d, f) for f in filenames ]
|
||||
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@@ -3,19 +3,19 @@
|
||||
|
||||
require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, moment, JHAPI, utils) {
|
||||
"use strict";
|
||||
|
||||
|
||||
var base_url = window.jhdata.base_url;
|
||||
var prefix = window.jhdata.prefix;
|
||||
|
||||
|
||||
var api = new JHAPI(base_url);
|
||||
|
||||
|
||||
function get_row (element) {
|
||||
while (!element.hasClass("user-row")) {
|
||||
element = element.parent();
|
||||
}
|
||||
return element;
|
||||
}
|
||||
|
||||
|
||||
function resort (col, order) {
|
||||
var query = window.location.search.slice(1).split('&');
|
||||
// if col already present in args, remove it
|
||||
@@ -38,7 +38,7 @@ require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, mo
|
||||
// reload page with new order
|
||||
window.location = window.location.pathname + '?' + query.join('&');
|
||||
}
|
||||
|
||||
|
||||
$("th").map(function (i, th) {
|
||||
th = $(th);
|
||||
var col = th.data('sort');
|
||||
@@ -52,13 +52,13 @@ require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, mo
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
$(".time-col").map(function (i, el) {
|
||||
// convert ISO datestamps to nice momentjs ones
|
||||
el = $(el);
|
||||
el.text(moment(new Date(el.text())).fromNow());
|
||||
});
|
||||
|
||||
|
||||
$(".stop-server").click(function () {
|
||||
var el = $(this);
|
||||
var row = get_row(el);
|
||||
@@ -72,14 +72,14 @@ require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, mo
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$(".access-server").click(function () {
|
||||
var el = $(this);
|
||||
var row = get_row(el);
|
||||
var user = row.data('user');
|
||||
var w = window.open(utils.url_path_join(prefix, 'user', user) + '/');
|
||||
});
|
||||
|
||||
|
||||
$(".start-server").click(function () {
|
||||
var el = $(this);
|
||||
var row = get_row(el);
|
||||
@@ -93,7 +93,7 @@ require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, mo
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$(".edit-user").click(function () {
|
||||
var el = $(this);
|
||||
var row = get_row(el);
|
||||
@@ -105,7 +105,7 @@ require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, mo
|
||||
dialog.find(".admin-checkbox").attr("checked", admin==='True');
|
||||
dialog.modal();
|
||||
});
|
||||
|
||||
|
||||
$("#edit-user-dialog").find(".save-button").click(function () {
|
||||
var dialog = $("#edit-user-dialog");
|
||||
var user = dialog.data('user');
|
||||
@@ -120,8 +120,8 @@ require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, mo
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
$(".delete-user").click(function () {
|
||||
var el = $(this);
|
||||
var row = get_row(el);
|
||||
@@ -141,7 +141,7 @@ require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, mo
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("#add-users").click(function () {
|
||||
var dialog = $("#add-users-dialog");
|
||||
dialog.find(".username-input").val('');
|
||||
@@ -160,7 +160,7 @@ require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, mo
|
||||
usernames.push(username);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
api.add_users(usernames, {admin: admin}, {
|
||||
success: function () {
|
||||
window.location.reload();
|
||||
@@ -208,5 +208,5 @@ require(["jquery", "bootstrap", "moment", "jhapi", "utils"], function ($, bs, mo
|
||||
servers: servers,
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
});
|
@@ -3,11 +3,11 @@
|
||||
|
||||
require(["jquery", "jhapi"], function ($, JHAPI) {
|
||||
"use strict";
|
||||
|
||||
|
||||
var base_url = window.jhdata.base_url;
|
||||
var user = window.jhdata.user;
|
||||
var api = new JHAPI(base_url);
|
||||
|
||||
|
||||
$("#stop").click(function () {
|
||||
api.stop_server(user, {
|
||||
success: function () {
|
||||
@@ -15,5 +15,5 @@ require(["jquery", "jhapi"], function ($, JHAPI) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
});
|
@@ -7,7 +7,7 @@ define(['jquery', 'utils'], function ($, utils) {
|
||||
var JHAPI = function (base_url) {
|
||||
this.base_url = base_url;
|
||||
};
|
||||
|
||||
|
||||
var default_options = {
|
||||
type: 'GET',
|
||||
contentType: "application/json",
|
||||
@@ -17,21 +17,21 @@ define(['jquery', 'utils'], function ($, utils) {
|
||||
success: null,
|
||||
error: utils.ajax_error_dialog,
|
||||
};
|
||||
|
||||
|
||||
var update = function (d1, d2) {
|
||||
$.map(d2, function (i, key) {
|
||||
d1[key] = d2[key];
|
||||
});
|
||||
return d1;
|
||||
};
|
||||
|
||||
|
||||
var ajax_defaults = function (options) {
|
||||
var d = {};
|
||||
update(d, default_options);
|
||||
update(d, options);
|
||||
return d;
|
||||
};
|
||||
|
||||
|
||||
JHAPI.prototype.api_request = function (path, options) {
|
||||
options = options || {};
|
||||
options = ajax_defaults(options || {});
|
||||
@@ -42,7 +42,7 @@ define(['jquery', 'utils'], function ($, utils) {
|
||||
);
|
||||
$.ajax(url, options);
|
||||
};
|
||||
|
||||
|
||||
JHAPI.prototype.start_server = function (user, options) {
|
||||
options = options || {};
|
||||
options = update(options, {type: 'POST', dataType: null});
|
||||
@@ -51,7 +51,7 @@ define(['jquery', 'utils'], function ($, utils) {
|
||||
options
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
JHAPI.prototype.stop_server = function (user, options) {
|
||||
options = options || {};
|
||||
options = update(options, {type: 'DELETE', dataType: null});
|
||||
@@ -60,18 +60,18 @@ define(['jquery', 'utils'], function ($, utils) {
|
||||
options
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
JHAPI.prototype.list_users = function (options) {
|
||||
this.api_request('users', options);
|
||||
};
|
||||
|
||||
|
||||
JHAPI.prototype.get_user = function (user, options) {
|
||||
this.api_request(
|
||||
utils.url_path_join('users', user),
|
||||
options
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
JHAPI.prototype.add_users = function (usernames, userinfo, options) {
|
||||
options = options || {};
|
||||
var data = update(userinfo, {usernames: usernames});
|
||||
@@ -80,10 +80,10 @@ define(['jquery', 'utils'], function ($, utils) {
|
||||
dataType: null,
|
||||
data: JSON.stringify(data)
|
||||
});
|
||||
|
||||
|
||||
this.api_request('users', options);
|
||||
};
|
||||
|
||||
|
||||
JHAPI.prototype.edit_user = function (user, userinfo, options) {
|
||||
options = options || {};
|
||||
options = update(options, {
|
||||
@@ -91,26 +91,26 @@ define(['jquery', 'utils'], function ($, utils) {
|
||||
dataType: null,
|
||||
data: JSON.stringify(userinfo)
|
||||
});
|
||||
|
||||
|
||||
this.api_request(
|
||||
utils.url_path_join('users', user),
|
||||
options
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
JHAPI.prototype.admin_access = function (user, options) {
|
||||
options = options || {};
|
||||
options = update(options, {
|
||||
type: 'POST',
|
||||
dataType: null,
|
||||
});
|
||||
|
||||
|
||||
this.api_request(
|
||||
utils.url_path_join('users', user, 'admin-access'),
|
||||
options
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
JHAPI.prototype.delete_user = function (user, options) {
|
||||
options = options || {};
|
||||
options = update(options, {type: 'DELETE', dataType: null});
|
||||
@@ -134,6 +134,6 @@ define(['jquery', 'utils'], function ($, utils) {
|
||||
}
|
||||
this.api_request('shutdown', options);
|
||||
};
|
||||
|
||||
|
||||
return JHAPI;
|
||||
});
|
@@ -3,11 +3,11 @@
|
||||
|
||||
require(["jquery", "jhapi"], function ($, JHAPI) {
|
||||
"use strict";
|
||||
|
||||
|
||||
var base_url = window.jhdata.base_url;
|
||||
var user = window.jhdata.user;
|
||||
var api = new JHAPI(base_url);
|
||||
|
||||
|
||||
$("#request-token").click(function () {
|
||||
api.request_token({
|
||||
success: function (reply) {
|
@@ -7,7 +7,7 @@
|
||||
|
||||
define(['jquery'], function($){
|
||||
"use strict";
|
||||
|
||||
|
||||
var url_path_join = function () {
|
||||
// join a sequence of url components with '/'
|
||||
var url = '';
|
||||
@@ -24,7 +24,7 @@ define(['jquery'], function($){
|
||||
url = url.replace(/\/\/+/, '/');
|
||||
return url;
|
||||
};
|
||||
|
||||
|
||||
var parse_url = function (url) {
|
||||
// an `a` element with an href allows attr-access to the parsed segments of a URL
|
||||
// a = parse_url("http://localhost:8888/path/name#hash")
|
||||
@@ -38,13 +38,13 @@ define(['jquery'], function($){
|
||||
a.href = url;
|
||||
return a;
|
||||
};
|
||||
|
||||
|
||||
var encode_uri_components = function (uri) {
|
||||
// encode just the components of a multi-segment uri,
|
||||
// leaving '/' separators
|
||||
return uri.split('/').map(encodeURIComponent).join('/');
|
||||
};
|
||||
|
||||
|
||||
var url_join_encode = function () {
|
||||
// join a sequence of url components with '/',
|
||||
// encoding each component with encodeURIComponent
|
||||
@@ -63,8 +63,8 @@ define(['jquery'], function($){
|
||||
// until we are building an actual request
|
||||
return decodeURIComponent($('body').data(key));
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript
|
||||
var browser = (function() {
|
||||
if (typeof navigator === 'undefined') {
|
||||
@@ -101,7 +101,7 @@ define(['jquery'], function($){
|
||||
return jqXHR.statusText;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
var log_ajax_error = function (jqXHR, status, error) {
|
||||
// log ajax failures with informative messages
|
||||
var msg = "API request failed (" + jqXHR.status + "): ";
|
||||
@@ -110,7 +110,7 @@ define(['jquery'], function($){
|
||||
console.log(msg);
|
||||
return msg;
|
||||
};
|
||||
|
||||
|
||||
var ajax_error_dialog = function (jqXHR, status, error) {
|
||||
console.log("ajax dialog", arguments);
|
||||
var msg = log_ajax_error(jqXHR, status, error);
|
||||
@@ -132,6 +132,6 @@ define(['jquery'], function($){
|
||||
log_ajax_error : log_ajax_error,
|
||||
ajax_error_dialog : ajax_error_dialog,
|
||||
};
|
||||
|
||||
|
||||
return utils;
|
||||
});
|
||||
});
|
@@ -18,4 +18,3 @@ div.error > p {
|
||||
font-size: 200%;
|
||||
line-height: normal;
|
||||
}
|
||||
|
@@ -6,14 +6,14 @@
|
||||
.bg-warning();
|
||||
padding:10px;
|
||||
}
|
||||
|
||||
|
||||
.service-login {
|
||||
text-align: center;
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
margin: auto auto 20% auto;
|
||||
}
|
||||
|
||||
|
||||
form {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
@@ -21,7 +21,7 @@
|
||||
width: 350px;
|
||||
font-size: large;
|
||||
}
|
||||
|
||||
|
||||
.input-group, input[type=text], button {
|
||||
width: 100%;
|
||||
}
|
||||
@@ -29,13 +29,13 @@
|
||||
input[type=submit] {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
|
||||
.form-control:focus, input[type=submit]:focus {
|
||||
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @jupyter-orange;
|
||||
border-color: @jupyter-orange;
|
||||
outline-color: @jupyter-orange;
|
||||
}
|
||||
|
||||
|
||||
.login_error {
|
||||
color: orangered;
|
||||
font-weight: bold;
|
||||
@@ -57,4 +57,3 @@
|
||||
border-radius: 0 0 @border-radius-large @border-radius-large;
|
||||
}
|
||||
}
|
||||
|
@@ -12,4 +12,3 @@
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
@@ -3,4 +3,3 @@
|
||||
{% block error_detail %}
|
||||
<p>Jupyter has lots of moons, but this is not one...</p>
|
||||
{% endblock %}
|
||||
|
@@ -6,4 +6,3 @@
|
||||
</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@@ -30,7 +30,7 @@
|
||||
<title>{% block title %}JupyterHub{% endblock %}</title>
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
|
||||
{% block stylesheet %}
|
||||
<link rel="stylesheet" href="{{ static_url("css/style.min.css") }}" type="text/css"/>
|
||||
{% endblock %}
|
||||
@@ -57,7 +57,7 @@
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
window.jhdata = {
|
||||
base_url: "{{base_url}}",
|
@@ -21,4 +21,3 @@
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
Reference in New Issue
Block a user