Commit caf8f033 by Kálmán Viktor

Merge branch 'master' into feature-django18

Conflicts:
	requirements/base.txt
parents a43c9ead 0ac5aa0b
......@@ -156,6 +156,7 @@ STATIC_URL = get_env_variable('DJANGO_STATIC_URL', default='/static/')
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'pipeline.finders.PipelineFinder',
)
########## END STATIC FILE CONFIGURATION
STATICFILES_DIRS = [normpath(join(SITE_ROOT, 'bower_components'))]
......
......@@ -110,8 +110,8 @@ if DEBUG:
from django.dispatch import Signal
Signal.send_robust = Signal.send
PIPELINE_DISABLED_COMPILERS = (
'pipeline.compilers.less.LessCompiler',
PIPELINE_COMPILERS = (
'dashboard.compilers.DummyLessCompiler',
)
ADMIN_ENABLED = True
# Copyright 2014 Budapest University of Technology and Economics (BME IK)
#
# This file is part of CIRCLE Cloud.
#
# CIRCLE is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# CIRCLE is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with CIRCLE. If not, see <http://www.gnu.org/licenses/>.
from pipeline.compilers.less import LessCompiler
class DummyLessCompiler(LessCompiler):
def compile_file(self, *args, **kwargs):
pass
......@@ -145,11 +145,13 @@ $(function() {
$("#dashboard-vm-details-connect-button").removeClass('disabled');
}
$("[data-target=#_console]").attr("data-toggle", "pill").attr("href", "#console").parent("li").removeClass("disabled");
$("#getScreenshotButton").prop("disabled", false);
} else {
if(data.connect_uri) {
$("#dashboard-vm-details-connect-button").addClass('disabled');
}
$("[data-target=#_console]").attr("data-toggle", "_pill").attr("href", "#").parent("li").addClass("disabled");
$("#getScreenshotButton").prop("disabled", true);
}
if(data.status == "STOPPED" || data.status == "PENDING") {
......
......@@ -10,10 +10,11 @@ $(function () {
$(".not-tab-pane").removeClass("not-tab-pane").addClass("tab-pane");
$('.vm-create').click(function(e) {
var template = $(this).data("template");
var url = $(this).data("href");
if(!url) url = $(this).prop("href");
$.ajax({
type: 'GET',
url: $(this).attr('href'),
url: url,
success: function(data) {
$('body').append(data);
vmCreateLoaded();
......@@ -140,7 +141,7 @@ $(function () {
// success
},
error: function(xhr, textStatus, error) {
console.log("oh babám");
addMessage(gettext("An error occurred. (") + xhr.status + ")", 'danger');
}
});
$(star).tooltip('destroy').tooltip({'placement': 'right'});
......
......@@ -10,6 +10,21 @@ html {
min-height: 100%;
}
.navbar-nav img {
width: 46px;
height: 46px;
margin-top: -4px;
}
.profile-avatar {
width: 24px;
height: 24px;
}
.navbar-fixed-top {
border: 0px;
}
/* Set widths on the navbar form inputs since otherwise they're 100% wide */
.navbar-form input[type="text"],
.navbar-form input[type="password"] {
......@@ -32,7 +47,7 @@ html {
#dashboard-menu {
margin-right: 15px;
margin-right: 0px;
}
/* we need this for mobile view */
......@@ -56,6 +71,9 @@ html {
padding-bottom: 12.5px;
}
#dashboard-menu > li:last-child > a {
padding: 4px 0 0 0;
}
}
.no-margin {
......@@ -110,6 +128,11 @@ html {
background-color: black!important;
}
.timeline img{
border-radius: 50%;
margin-bottom: 2px;
}
.timeline a {
color: black;
}
......@@ -1321,3 +1344,7 @@ textarea[name="new_members"] {
padding-top: 5px;
padding-bottom: 5px;
}
.acl-table td:first-child {
text-align: center;
}
......@@ -185,12 +185,13 @@ $(function() {
$("i", this).addClass("fa-spinner fa-spin");
$(this).prop("disabled", true);
ct.slideDown();
var img = $("img", ct).prop("src", '/dashboard/vm/' + vm + '/screenshot/');
var img = $("img", ct).prop("src", '/dashboard/vm/' + vm + '/screenshot/?rnd=' + Math.random());
});
// if the image is loaded remove the spinning stuff
// note: this should not work if the image is cached, but it's not
// see: http://stackoverflow.com/a/3877079/1112653
// note #2: it actually gets cached, so a random number is appended
$("#vm-console-screenshot img").load(function(e) {
$("#getScreenshotButton").prop("disabled", false)
.find("i").removeClass("fa-spinner fa-spin");
......@@ -200,7 +201,7 @@ $(function() {
// screenshot close
$("#vm-console-screenshot button").click(function() {
$(this).parent("div").slideUp();
$(this).closest("div").slideUp();
});
// select connection string
......
......@@ -55,6 +55,9 @@ html {
.bigbig {
font-size: 3em;
}
.big-tag {
font-size: 1.2em;
}
/* small buttons for tags, copied from Bootstraps input-sm, bnt-sm */
.btn-tags, .btn-traits {
padding: 3px 6px;
......@@ -148,3 +151,7 @@ footer a, footer a:hover, footer a:visited {
.btn-toolbar {
margin-bottom: 5px;
}
.vm-details-home-edit-description {
font-size: 85%; /* ~ small tag */
}
{% load i18n %}
{% load staticfiles %}
{% load cache %}
{% load compressed %}
{% load pipeline %}
<!DOCTYPE html>
<html lang="{{lang}}">
<head>
......@@ -14,7 +14,7 @@
<title>{% block title %}{% block title-page %}{% endblock %} | {% block title-site %}CIRCLE{% endblock %}{% endblock %}</title>
{% compressed_css 'all' %}
{% stylesheet 'all' %}
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
......@@ -28,7 +28,12 @@
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-header">
{% block navbar-brand %}{% endblock %}
{% block navbar-brand %}
<a class="navbar-brand" href="{% url "dashboard.index" %}" style="padding: 10px 15px;">
{% include "branding.html" %}
</a>
{% endblock %}
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
......@@ -67,7 +72,7 @@
</div>
{% endfor %}
{% endif %}
</div>
</div>
{% endblock messages %}
{% block content %}
<h1 class="alert alert-error">Please override "content" block.</h1>
......@@ -84,7 +89,7 @@
<script src="{% static "jquery/dist/jquery.min.js" %}"></script>
<script src="{{ STATIC_URL }}jsi18n/{{ LANGUAGE_CODE }}/djangojs.js"></script>
{% compressed_js 'all' %}
{% javascript 'all' %}
{% block extra_script %}
{% endblock %}
......
{% load i18n %}
{% if user and user.pk %}
{% if show_pic %}
<img class="profile-avatar" src="{{ user.profile.get_avatar_url }}" />
{% endif%}
{% if user.get_full_name %}{{ user.get_full_name }}{% else %}{{ user.username }}{% endif %}{% if new_line %}<br />{% endif %}
{% if show_org %}
......@@ -10,4 +14,5 @@
({% trans "username" %}: {{ user.username }})
{% endif %}
{% endif %}
{% endif %}
{% load i18n %}
<form action="{{ acl.url }}" method="post">{% csrf_token %}
<table class="table table-striped table-with-form-fields" id="{{table_id}}">
<table class="table table-striped table-with-form-fields acl-table" id="{{table_id}}">
<thead>
<tr>
<th></th>
......@@ -13,7 +13,7 @@
{% for i in acl.users %}
<tr>
<td>
<i class="fa fa-user"></i>
<img class="profile-avatar" src="{{ i.user.profile.get_avatar_url }}"/>
</td>
<td>
<a href="{% url "dashboard.views.profile" username=i.user.username %}"
......
......@@ -10,12 +10,6 @@
{% endblock %}
{% block navbar-brand %}
<a class="navbar-brand" href="{% url "dashboard.index" %}" style="padding: 10px 15px;">
{% include "branding.html" %}
</a>
{% endblock %}
{% block navbar %}
{% if user.is_authenticated and user.pk and not request.token_user %}
<ul class="nav navbar-nav navbar-right" id="dashboard-menu">
......@@ -90,9 +84,14 @@
{% endif %}
</a>
<ul class="dropdown-menu" id="notification-messages">
<li>{% trans "Loading..." %}</li>
<li>{% trans "Loading..." %}</li>
</ul>
</li>
<li class="hidden-xs">
<a href="{% url "dashboard.views.profile-preferences" %}">
<img class="profile-avatar" src="{{ user.profile.get_avatar_url }}" />
</a>
</li>
</ul>
{% else %}
......
......@@ -90,7 +90,7 @@
{% for i in users %}
<tr>
<td>
<i class="fa fa-user"></i>
<img class="profile-avatar" src="{{ i.profile.get_avatar_url}}"/>
</td>
<td>
<a href="{% url "dashboard.views.profile" username=i.username %}" title="{{ i.username }}"
......
......@@ -20,7 +20,7 @@
<div class="col-xs-6">
<form action="{% url "dashboard.views.group-list" %}" method="GET" id="dashboard-group-search-form">
<div class="input-group input-group-sm">
<input id="dashboard-group-search-input" name="s" type="text" class="form-control" placeholder="{% trans "Search..." %}" />
<input name="s" type="text" class="form-control" placeholder="{% trans "Search..." %}" />
<div class="input-group-btn">
<button type="submit" class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
......
......@@ -72,11 +72,15 @@
value="{% widthratio node_num.running sum_node_num 100 %}">
</p>
<p>
{% blocktrans with running=node_num.running missing=node_num.missing disabled=node_num.disabled offline=node_num.offline %}
<span class="big">
<big>{{ node_num.running }}</big> running
</span>
+ <big>{{ node_num.missing }}</big>
missing + <br><big>{{ node_num.disabled }}</big> disabled + <big>{{ node_num.offline }}</big> offline
<span class="big-tag">{{ running }}</span> running
</span> +
<span class="big-tag">{{ missing }}</span> missing +
<br>
<span class="big-tag">{{ disabled }}</span> disabled +
<span class="big-tag">{{ offline }}</span> offline
{% endblocktrans %}
</p>
<ul class="list-inline" id="dashboard-node-taglist">
{% for i in nodes %}
......
......@@ -16,7 +16,7 @@
<i class="fa fa-{{ t.os_type }}"></i> {{ t.name }}
</span>
<small class="text-muted index-template-list-system">{{ t.system }}</small>
<div href="{% url "dashboard.views.vm-create" %}?template={{ t.pk }}" class="pull-right vm-create">
<div data-href="{% url "dashboard.views.vm-create" %}?template={{ t.pk }}" class="pull-right vm-create">
<i data-container="body" title="{% trans "Start VM instance" %}"
class="fa fa-play"></i>
</div>
......@@ -37,7 +37,7 @@
<div class="col-xs-5 col-sm-6">
<form action="{% url "dashboard.views.template-list" %}" method="GET" id="dashboard-template-search-form">
<div class="input-group input-group-sm">
<input id="dashboard-group-search-input" name="s" type="text" class="form-control" placeholder="{% trans "Search..." %}" />
<input name="s" type="text" class="form-control" placeholder="{% trans "Search..." %}" />
<div class="input-group-btn">
<button type="submit" class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
......
......@@ -25,7 +25,7 @@
<div class="col-xs-5 col-sm-6">
<form action="{% url "dashboard.views.user-list" %}" method="GET" id="dashboard-user-search-form">
<div class="input-group input-group-sm">
<input id="dashboard-group-search-input" name="s" type="text" class="form-control" placeholder="{% trans "Search..." %}" />
<input name="s" type="text" class="form-control" placeholder="{% trans "Search..." %}" />
<div class="input-group-btn">
<button type="submit" class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
......
......@@ -90,7 +90,7 @@
<p class="pull-right">
<input class="knob" data-fgColor="chartreuse" data-thickness=".4" data-max="{{ request.user.profile.instance_limit }}" data-width="100" data-height="100" data-readOnly="true" value="{{ instances|length|add:more_instances }}">
</p>
<span class="bigbig">{% blocktrans with count=running_vm_num %}<big>{{ count }}</big> running{% endblocktrans %}</span>
<span class="bigbig">{% blocktrans with count=running_vm_num %}<span class="big-tag">{{ count }}</span> running{% endblocktrans %}</span>
<ul class="list-inline" style="max-height: 95px; overflow: hidden;">
{% for vm in running_vms %}
<li style="display: inline-block; padding: 2px;">
......@@ -111,7 +111,9 @@
<strong>{{ counter }}</strong> machines total
{% endblocktrans %}
</a>
<p class="big text-warning">{% blocktrans with count=stopped_vm_num %}<big>{{ count }}</big> stopped{% endblocktrans %}</p>
<p class="big text-warning">
{% blocktrans with count=stopped_vm_num %}{{ count }} stopped{% endblocktrans %}
</p>
</div>
</div>
</div>
......@@ -24,7 +24,6 @@
{% trans "Back" %}</a>
</div>
<h3 class="no-margin">
<i class="fa fa-user"></i>
{% include "dashboard/_display-name.html" with user=profile show_org=True %}
</h3>
</div>
......
......@@ -58,7 +58,7 @@
<div class="text-right">
<form class="pull-left" method="POST" action="{% url "dashboard.views.store-refresh-toplist" %}">
{% csrf_token %}
<button class="btn btn-success btn-xs" type="submit" title="{% trans "Refresh" %}"/>
<button class="btn btn-success btn-xs" type="submit" title="{% trans "Refresh" %}">
<i class="fa fa-refresh"></i>
</button>
</form>
......
{% extends "dashboard/base.html" %}
{% load staticfiles %}
{% load i18n %}
{% load compressed %}
{% load pipeline %}
{% block title-page %}{{ instance.name }} | vm{% endblock %}
......@@ -242,5 +242,5 @@
{% endblock %}
{% block extra_js %}
{% compressed_js 'vm-detail' %}
{% javascript 'vm-detail' %}
{% endblock %}
......@@ -19,9 +19,9 @@
- {{ a.percentage }}%
{% endif %}
</strong>
{% endspaceless %}{% if a.times < 2 %} <span title="{{ a.started }}">{{ a.started|arrowfilter:LANGUAGE_CODE }}</span>{% endif %}{% if a.user %},
{% endspaceless %}{% if a.times < 2 %}&nbsp;<span title="{{ a.started }}">{{ a.started|arrowfilter:LANGUAGE_CODE }}</span>{% endif %}{% if a.user %},
<a class="no-style-link" href="{% url "dashboard.views.profile" username=a.user.username %}">
{% include "dashboard/_display-name.html" with user=a.user show_org=True %}
{% include "dashboard/_display-name.html" with user=a.user show_org=True show_pic=True %}
</a>
{% endif %}
{% if a.is_abortable_for_user %}
......@@ -45,7 +45,7 @@
{{ s.finished|arrowfilter:LANGUAGE_CODE }}
</span>
{% else %}
<i class="fa fa-refresh fa-spin" class="sub-activity-loading-icon"></i>
<i class="fa fa-refresh fa-spin"></i>
{% endif %}
{% if s.has_failed %}
<div class="label label-danger">{% trans "failed" %}</div>
......
{% load i18n %}
{% load staticfiles %}
<div class="btn-toolbar">
{% if perms.vm.access_console %}
<button id="sendCtrlAltDelButton" class="btn btn-danger btn-sm">{% trans "Send Ctrl+Alt+Del" %}</button>
<button id="sendPasswordButton" class="btn btn-default btn-sm">{% trans "Type password" %}</button>
{% if not perms.vm.vm_access_console %}
<div class="alert alert-warning">
{% trans "You are not authorized to access the VNC console." %}
</div>
{% endif %}
<button id="getScreenshotButton" class="btn btn-info btn-sm pull-right" data-vm-pk="{{ instance.pk }}"><i class="fa fa-picture"></i> {% trans "Screenshot" %}</button>
<div class="row">
<div class="col-xs-7">
<div class="btn-toolbar">
{% if perms.vm.access_console %}
<button id="sendCtrlAltDelButton" class="btn btn-danger btn-sm">
{% trans "Send Ctrl+Alt+Del" %}
</button>
<button id="sendPasswordButton" class="btn btn-default btn-sm">
{% trans "Type password" %}
</button>
{% endif %}
</div>
</div>
<div class="col-xs-5 text-right">
<button id="getScreenshotButton" class="btn btn-info btn-sm" data-vm-pk="{{ instance.pk }}">
<i class="fa fa-photo"></i> {% trans "Screenshot" %}
</button>
</div>
</div>
{% if perms.vm.access_console %}
<div class="alert alert-info" id="noVNC_status">
</div>
<div class="alert alert-info" id="noVNC_status"></div>
{% endif %}
<div id="vm-console-screenshot">
<button class="btn btn-danger btn-sm pull-right">{% trans "Close" %}</button>
<h3>{% trans "Screenshot" %}</h3>
<img />
<h3>
<button class="btn btn-danger btn-sm pull-right">{% trans "Close" %}</button>
{% trans "Screenshot" %}
</h3>
<img alt="{% trans "Screenshot" %}"/>
<hr />
</div>
{% if perms.vm.access_console %}
<canvas id="noVNC_canvas" width="640px" height="20px">Canvas not supported.
<canvas id="noVNC_canvas" width="640" height="20">Canvas not supported.
</canvas>
<script>
......
......@@ -39,7 +39,7 @@
<dd>
{% csrf_token %}
<div class="vm-details-home-edit-description-click">
<small class="vm-details-home-edit-description">{{ instance.description|linebreaks }}</small>
<div class="vm-details-home-edit-description">{{ instance.description|linebreaks }}</div>
</div>
<div id="vm-details-home-description" class="js-hidden">
<form method="POST">
......@@ -174,9 +174,12 @@
{% include "dashboard/_graph-time-buttons.html" %}
</div>
<div class="graph-images text-center">
<img src="{% url "dashboard.views.vm-graph" instance.pk "cpu" graph_time %}"/>
<img src="{% url "dashboard.views.vm-graph" instance.pk "memory" graph_time %}"/>
<img src="{% url "dashboard.views.vm-graph" instance.pk "network" graph_time %}"/>
<img src="{% url "dashboard.views.vm-graph" instance.pk "cpu" graph_time %}"
alt="{% trans "CPU usage" %}"/>
<img src="{% url "dashboard.views.vm-graph" instance.pk "memory" graph_time %}"
alt="{% trans "Memory usage" %}"/>
<img src="{% url "dashboard.views.vm-graph" instance.pk "network" graph_time %}"
alt="{% trans "Network usage" %}"/>
</div>
{% endif %}
</div>
......
{% load i18n %}
{% load network_tags %}
<div id="vm-details-add-interface">
{% with op=op.add_interface %}{% if op %}
<a href="{{op.get_url}}" class="btn btn-{{op.effect}} operation pull-right"
{% if op.disabled %}disabled{% endif %}>
<i class="fa fa-{{op.icon}}"></i> {% trans "add interface" %}</a>
{% endif %}{% endwith %}
</div>
<h2>
<div id="vm-details-add-interface">
{% with op=op.add_interface %}{% if op %}
<a href="{{op.get_url}}" class="btn btn-{{op.effect}} operation pull-right"
{% if op.disabled %}disabled{% endif %}>
<i class="fa fa-{{op.icon}}"></i> {% trans "add interface" %}</a>
{% endif %}{% endwith %}
</div>
{% trans "Interfaces" %}
</h2>
......
......@@ -45,12 +45,12 @@
<div id="vm-details-resources-disk">
<h3>
{% trans "Disks" %}
<div class="pull-right">
<div id="disk-ops">
{% include "dashboard/vm-detail/_disk-operations.html" %}
</div>
</div>
{% trans "Disks" %}
</h3>
<div class="clearfix"></div>
......@@ -69,7 +69,7 @@
{% if user.is_superuser %}
<hr/>
<div class="row" id="">
<div class="row">
<div class="col-sm-12">
<h3>
{% trans "Required traits" %}
......@@ -81,7 +81,7 @@
<hr/>
<div class="row" id="">
<div class="row">
<div class="col-sm-12">
<h3>
{% trans "Raw data" %}
......
......@@ -212,7 +212,7 @@ class VmNetwork(object):
'alias(scaleToSeconds(nonNegativeDerivative('
'%s.network.bytes_sent-%s), 10), "in - %s (bits/s)")' % (
params))
return 'group(%s)' % ','.join(metrics)
return 'group(%s)' % ','.join(metrics) if metrics else None
register_graph(VmNetwork, 'network', VmGraphView)
......
......@@ -74,13 +74,6 @@
{% endblock %}
{% block navbar-brand %}
<a class="navbar-brand" href="{% url "dashboard.index" %}" style="padding: 10px 15px;">
<img src="{% static "dashboard/img/logo.png" %}" style="height: 25px;"/>
</a>
{% endblock %}
{% block content %}
<div class="content">
{% block content_box %}{% endblock %}
......
......@@ -10,12 +10,6 @@
{% include "open-graph.html" %}
{% endblock %}
{% block navbar-brand %}
<a class="navbar-brand" href="{% url "dashboard.index" %}" style="padding: 10px 15px;">
<img src="{% static "dashboard/img/logo.png" %}" style="height: 25px;"/>
</a>
{% endblock %}
{% block content_box %}
<div class="row">
{% if form.password.errors or form.username.errors %}
......@@ -25,10 +19,7 @@
{% endif %}
<div class="col-xs-{% if saml2 %}6{% else %}12{% endif %}">
<div class="login-form">
<form action="" method="POST">
{% csrf_token %}
{% crispy form %}
</form>
{% crispy form %}
</div>
</div>
{% if saml2 %}
......@@ -37,11 +28,12 @@
<a href="{% url "saml2_login" %}">{% trans "Click here!" %}</a>
</div>
{% endif %}
</div>
<div class="row">
<div class="col-sm-12">
<a class="pull-right" href="{% url "accounts.password-reset" %}">{% trans "Forgot your password?" %}</a>
<a class="pull-right" href="{% url "accounts.password-reset" %}" style="margin-right: 15px;">
{% trans "Forgot your password?" %}
</a>
</div>
</div>
</div>
</div>
{% endblock %}
......@@ -39,6 +39,4 @@ six==1.9.0
slimit==0.8.1
sqlparse==0.1.15
pika==0.9.14
Fabric==1.10.1
lxml==3.4.4
git+https://github.com/BME-IK/django-pipeline.git
django-pipeline==1.4.7
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment