Commit b4bf105c by Kálmán Viktor

Merge branch 'master' into feature-request

Conflicts:
	circle/dashboard/static/dashboard/dashboard.less
parents 815d11ea f211db99
......@@ -12,7 +12,7 @@
],
"dependencies": {
"bootstrap": "~3.2.0",
"fontawesome": "~4.2.0",
"fontawesome": "~4.3.0",
"jquery": "~2.1.1",
"no-vnc": "*",
"jquery-knob": "~1.2.9",
......
......@@ -169,7 +169,8 @@ PIPELINE_COMPILERS = (
'pipeline.compilers.less.LessCompiler',
)
PIPELINE_CSS_COMPRESSOR = 'pipeline.compressors.yuglify.YuglifyCompressor'
PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.slimit.SlimItCompressor'
# PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.slimit.SlimItCompressor'
PIPELINE_JS_COMPRESSOR = None
PIPELINE_DISABLE_WRAPPER = True
PIPELINE_LESS_ARGUMENTS = u'--include-path={}'.format(':'.join(STATICFILES_DIRS))
PIPELINE_CSS = {
......@@ -525,7 +526,7 @@ except:
AGENT_VERSION = None
LOCALE_PATHS = (join(SITE_ROOT, 'locale'), )
COMPANY_NAME = "BME IK 2014"
COMPANY_NAME = get_env_variable("COMPANY_NAME", "BME IK 2015")
graphite_host = environ.get("GRAPHITE_HOST", None)
graphite_port = environ.get("GRAPHITE_PORT", None)
......
# 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 django.core.management.base import BaseCommand
from common.management.commands.watch import LessUtils
......
# 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/>.
import subprocess
import os
import pyinotify
......
# 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 sys import exc_info
import logging
......
# -*- coding: utf-8 -*-
# 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 arrow import locales
class HungarianLocale(locales.Locale):
names = ['hu', 'HU']
past = '{0} ezelőtt'
future = '{0} múlva'
timeframes = {
'now': 'éppen most',
'seconds': {
'past': 'másodpercekkel',
'future': 'pár másodperc'},
'minute': {'past': 'egy perccel', 'future': 'egy perc'},
'minutes': {'past': '{0} perccel', 'future': '{0} perc'},
'hour': {'past': 'egy órával', 'future': 'egy óra'},
'hours': {'past': '{0} órával', 'future': '{0} óra'},
'day': {
'past': 'egy nappal',
'future': 'egy nap'
},
'days': {
'past': '{0} nappal',
'future': '{0} nap'
},
'month': {'past': 'egy hónappal', 'future': 'egy hónap'},
'months': {'past': '{0} hónappal', 'future': '{0} hónap'},
'year': {'past': 'egy évvel', 'future': 'egy év'},
'years': {'past': '{0} évvel', 'future': '{0} év'},
}
month_names = ['', 'Január', 'Február', 'Március', 'Április', 'Május',
'Június', 'Július', 'Augusztus', 'Szeptember',
'Október', 'November', 'December']
month_abbreviations = ['', 'Jan', 'Febr', 'Márc', 'Ápr', 'Máj', 'Jún',
'Júl', 'Aug', 'Szept', 'Okt', 'Nov', 'Dec']
day_names = ['', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek',
'Szombat', 'Vasárnap']
day_abbreviations = ['', 'Hét', 'Kedd', 'Szer', 'Csüt', 'Pént',
'Szom', 'Vas']
meridians = {
'am': 'de',
'pm': 'du',
'AM': 'DE',
'PM': 'DU',
}
def _format_timeframe(self, timeframe, delta):
form = self.timeframes[timeframe]
if isinstance(form, dict):
if delta > 0:
form = form['future']
else:
form = form['past']
delta = abs(delta)
return form.format(delta)
# 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/>.
import autocomplete_light
from django.contrib.auth.models import User
from django.utils.html import escape
......
......@@ -1607,11 +1607,16 @@ class DataStoreForm(ModelForm):
class DiskForm(ModelForm):
created = forms.DateTimeField()
modified = forms.DateTimeField()
def __init__(self, *args, **kwargs):
super(DiskForm, self).__init__(*args, **kwargs)
for k, v in self.fields.iteritems():
v.widget.attrs['readonly'] = True
self.fields['created'].initial = self.instance.created
self.fields['modified'].initial = self.instance.modified
class Meta:
model = Disk
......@@ -651,9 +651,11 @@ textarea[name="new_members"] {
padding-left: 28px;
}
.dashboard-profile-vm-list a, .dashboard-profile-vm-list a:hover {
.dashboard-profile-vm-list, .dashboard-profile-group-list {
a, a:hover {
text-decoration: none;
color: #555;
}
}
#group-detail-user-table td:nth-child(2) a,
......@@ -1288,3 +1290,9 @@ textarea[name="new_members"] {
max-width: 500px;
height: 150px;
}
#disk-list-table {
td:last-child {
text-align: center;
}
}
# 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 os.path import splitext
import json
import logging
......
......@@ -350,4 +350,5 @@ class DiskListTable(Table):
fields = ("pk", "appliance", "filename", "size", "is_ready")
prefix = "disk-"
order_by = ("-pk", )
per_page = 65536
per_page = 15
empty_text = _("No disk found.")
{% load i18n %}
{% load hro %}
{% load arrowfilter %}
{% for n in page %}
<li class="notification-message" id="msg-{{n.id}}">
<span class="notification-message-subject">
{% if n.status == "new" %}<i class="fa fa-envelope-o"></i> {% endif %}
{{ n.subject|get_text:user }}
</span>
<span class="notification-message-date pull-right" title="{{n.created}}">
{{ n.created|timesince }}
<span class="notification-message-date pull-right" title="{{n.created}}" data-container="body">
{{ n.created|arrowfilter:LANGUAGE_CODE }}
</span>
<div style="clear: both;"></div>
<div class="notification-message-text">
......
{% load i18n %}
{% load hro %}
{% load arrowfilter %}
<div id="activity-timeline" class="timeline">
{% for a in activities %}
<div class="activity" data-activity-id="{{ a.pk }}">
......@@ -10,7 +11,8 @@
{{ a.readable_name.get_admin_text|capfirst }}
</strong>
{{ a.started|date:"Y-m-d H:i" }}{% if a.user %}, {{ a.user }}{% endif %}
<span title="{{ a.started }}">{{ a.started|arrowfilter:LANGUAGE_CODE }}</span>{% if a.user %}, {{ a.user }}{% endif %}
{% if a.children.count > 0 %}
<div class="sub-timeline">
{% for s in a.children.all %}
......@@ -21,7 +23,9 @@
</span>
&ndash;
{% if s.finished %}
{{ s.finished|time:"H:i:s" }}
<span title="{{ s.finished }}">
{{ s.finished|arrowfilter:LANGUAGE_CODE }}
</span>
{% else %}
<i class="fa fa-refresh fa-spin" class="sub-activity-loading-icon"></i>
{% endif %}
......
{% extends "dashboard/base.html" %}
{% load i18n %}
{% block title-page %}{% trans "Notifications" %}{% endblock %}
{% block content %}
<div class="row">
......
......@@ -11,24 +11,28 @@
<div class="col-md-{% if perms.auth.change_user %}8{% else %}12{% endif %}">
<div class="panel panel-default">
<div class="panel-heading">
<div class="pull-right">
{% if request.user.is_superuser %}
<a href="{{ login_token }}"
class="pull-right btn btn-danger btn-xs"
<a href="{{ login_token }}" class="btn btn-danger btn-xs"
title="{% trans "Log in as this user. Recommended to open in an incognito window." %}">
{% trans "Login as this user" %}</a>
<i class="fa fa-user-secret"></i>
{% trans "Login as this user" %}
</a>
{% endif %}
<a class="pull-right btn btn-default btn-xs" href="{% url "dashboard.views.user-list" %}">{% trans "Back" %}</a>
<a class="btn btn-default btn-xs" href="{% url "dashboard.views.user-list" %}">
{% 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>
<div class="panel-body">
<div>
<div class="" style="float: left">
<div class="row">
<div class="col-sm-4">
<img id="dashboard-profile-avatar" src="{{ avatar_url }}" class="img-rounded"/>
</div>
<div class="" style="padding-left: 215px;">
<div class="col-sm-8">
<p>{% trans "Username" %}: {{ profile.username }}</p>
<p>{% trans "Organization ID" %}: {{ profile.profile.org_id|default:"-" }}</p>
<p>{% trans "First name" %}: {{ profile.first_name|default:"-" }}</p>
......@@ -48,7 +52,6 @@
<a href="{% url "dashboard.views.profile-preferences" %}">{% trans "Change my preferences" %}</a>
{% endif %}
</div>
<div class="clearfix"></div>
</div>
{% if perm_group_list %}
......@@ -58,7 +61,7 @@
</h4>
<ul class="dashboard-profile-group-list">
{% for g in groups %}
<li>{{ g.name }}</li>
<li><a href="{{ g.profile.get_absolute_url }}">{{ g.name }}</a></li>
{% empty %}
{% trans "This user is not in any group." %}
{% endfor %}
......
......@@ -52,7 +52,9 @@
<small>{% trans "image files without disk object in the database" %}</small>
</h3>
{% for o in orphan_disks %}
<p>
{{ o }}
</p>
{% empty %}
{% trans "None" %}
{% endfor %}
......@@ -68,6 +70,33 @@
<h3 class="no-margin"><i class="fa fa-file"></i> {% trans "Disks" %}</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-9">
<ul class="nav nav-pills" style="margin: 5px 0 20px 0;">
<li class="disabled"><a href="#">{% trans "Filter by type" %}</a></li>
<li {% if not request.GET.filter %} class="active"{% endif %}>
<a href="{{ request.path }}?s={{ request.GET.s }}">{% trans "ALL" %}</a>
</li>
{% for f in filter_names %}
<li{% if request.GET.filter == f.0 %} class="active"{% endif %}>
<a href="?filter={{ f.0 }}&s={{ request.GET.s }}">{{ f.1|capfirst }}</a>
</li>
{% endfor %}
</ul>
</div>
<div class="col-md-3">
<form action="" method="GET" id="network-host-list-form">
<div class="input-group">
<input type="text" name="s" class="form-control"
value="{{ request.GET.s }}" placeholder="{% trans "Search..." %}"/>
<span class="input-group-btn">
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</span>
<input type="hidden" name="filter" value="{{ request.GET.filter }}"/>
</div>
</form>
</div>
</div><!-- .row -->
<div class="table-responsive">
{% render_table disk_table %}
</div>
......
{{ record.created|date }}
<br />
{{ record.created|time }}
{% load arrowfilter %}
<span title="{{ record.created }}">
{{ record.created|arrowfilter:LANGUAGE_CODE }}
</span>
{% load i18n %}
{% load hro %}
{% load arrowfilter %}
<div id="activity-timeline" class="timeline">
{% for a in activities %}
......@@ -18,7 +19,7 @@
- {{ a.percentage }}%
{% endif %}
</strong>
{% endspaceless %}{% if a.times < 2%} {{ a.started|date:"Y-m-d H:i" }}{% endif %}{% if a.user %},
{% endspaceless %}{% if a.times < 2 %} <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 %}
</a>
......@@ -40,7 +41,9 @@
<a href="{{ s.get_absolute_url }}">
{{ s.readable_name|get_text:user|capfirst }}</a></span> &ndash;
{% if s.finished %}
{{ s.finished|time:"H:i:s" }}
<span title="{{ s.finished }}">
{{ s.finished|arrowfilter:LANGUAGE_CODE }}
</span>
{% else %}
<i class="fa fa-refresh fa-spin" class="sub-activity-loading-icon"></i>
{% endif %}
......
{% load i18n %}
{% load arrowfilter %}
<div class="row">
<div class="col-md-4">
<dl id="home_name_and_description">
......@@ -70,13 +71,13 @@
<dt>{% trans "Suspended at:" %}</dt>
<dd>
<span title="{{ instance.time_of_suspend }}">
<i class="fa fa-moon-o"></i> {{ instance.time_of_suspend|timeuntil }}
<i class="fa fa-moon-o"></i> {{ instance.time_of_suspend|arrowfilter:LANGUAGE_CODE }}
</span>
</dd>
<dt>{% trans "Destroyed at:" %}</dt>
<dd>
<span title="{{ instance.time_of_delete }}">
<i class="fa fa-times"></i> {{ instance.time_of_delete|timeuntil }}
<i class="fa fa-times"></i> {{ instance.time_of_delete|arrowfilter:LANGUAGE_CODE }}
</span>
</dd>
</dl>
......
# 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 django.template import Library
import arrow
from dashboard.arrow_local import HungarianLocale
for name in HungarianLocale.names:
arrow.locales._locales[name] = HungarianLocale
register = Library()
@register.filter
def arrowfilter(date, language='en'):
if not date:
return ''
adate = arrow.get(date)
return adate.humanize(locale=language)
# 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 django.template import Library
......
# 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 django import template
register = template.Library()
......
# 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/>.
import unittest
from mock import patch, MagicMock
......
# 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 django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
......
......@@ -61,8 +61,7 @@ class GroupCodeMixin(object):
state = StateCache(request.session)
conf = get_config(None, request)
client = Saml2Client(conf, state_cache=state,
identity_cache=IdentityCache(request.session),
logger=logger)
identity_cache=IdentityCache(request.session))
subject_id = _get_subject_id(request.session)
identity = client.users.get_identity(subject_id,
check_not_on_or_after=False)
......
......@@ -16,13 +16,16 @@
# with CIRCLE. If not, see <http://www.gnu.org/licenses/>.
from __future__ import unicode_literals, absolute_import
from django.views.generic import UpdateView
from django.contrib import messages
from django.core.urlresolvers import reverse
from django.db.models import Q
from django.utils.translation import ugettext_lazy as _
from django.views.generic import UpdateView
from sizefield.utils import filesizeformat
from braces.views import SuperuserRequiredMixin
from sizefield.utils import filesizeformat
from common.models import WorkerNotFound
from storage.models import DataStore, Disk
from ..tables import DiskListTable
from ..forms import DataStoreForm, DiskForm
......@@ -40,15 +43,53 @@ class StorageDetail(SuperuserRequiredMixin, UpdateView):
context = super(StorageDetail, self).get_context_data(**kwargs)
ds = self.get_object()
try:
context['stats'] = self._get_stats()
context['missing_disks'] = ds.get_missing_disks()
context['orphan_disks'] = ds.get_orphan_disks()
qs = Disk.objects.filter(datastore=ds, destroyed=None)
except WorkerNotFound:
messages.error(self.request, _("The DataStore is offline."))
context['disk_table'] = DiskListTable(
qs, request=self.request,
template="django_tables2/table_no_page.html")
self.get_table_data(), request=self.request,
template="django_tables2/with_pagination.html")
context['filter_names'] = (
('vm', _("virtual machine")),
('template', _("template")),
('none', _("none")),
)
return context
def get_table_data(self):
ds = self.get_object()
qs = Disk.objects.filter(datastore=ds, destroyed=None)
filter_name = self.request.GET.get("filter")
search = self.request.GET.get("s")
filter_queries = {
'vm': {
'instance_set__isnull': False,
},
'template': {
'template_set__isnull': False,
},
'none': {
'template_set__isnull': True,
'instance_set__isnull': True,
}
}
if filter_name:
qs = qs.filter(**filter_queries.get(filter_name, {}))
if search:
search = search.strip()
qs = qs.filter(Q(name__icontains=search) |
Q(filename__icontains=search))
return qs
def _get_stats(self):
stats = self.object.get_statistics()
free_space = int(stats['free_space'])
......@@ -72,3 +113,6 @@ class DiskDetail(SuperuserRequiredMixin, UpdateView):
model = Disk
form_class = DiskForm
template_name = "dashboard/storage/disk.html"
def form_valid(self, form):
pass
#!/bin/echo Usage: fab --list -f
# 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/>.
import contextlib
import datetime
......@@ -46,6 +64,14 @@ def bower(component=None):
@roles('portal')
def flake8():
"Run portal tests"
with _workon("circle"), cd("~/circle/circle"):
run("flake8 . --exclude=migrations,bower_components,"
"south_migrations,static_collected --max-complexity 12")
@roles('portal')
def migrate():
"Run db migrations"
with _workon("circle"), cd("~/circle/circle"):
......
......@@ -113,12 +113,12 @@ msgstr "Ismeretlen hiba: %(ex)s"
msgid "Superuser privileges are required."
msgstr "Rendszergazdai jogosultság szükséges."
#: dashboard/autocomplete_light_registry.py:55
#: dashboard/autocomplete_light_registry.py:72
#, python-format
msgid "%s (group)"
msgstr "%s (csoport)"
#: dashboard/autocomplete_light_registry.py:75
#: dashboard/autocomplete_light_registry.py:92
msgid "no matches found"
msgstr "nincs találat"
......@@ -141,7 +141,7 @@ msgstr "valós idejű"
#: dashboard/forms.py:93 dashboard/forms.py:810 dashboard/forms.py:900
#: dashboard/forms.py:1351 dashboard/tables.py:268
#: dashboard/templates/dashboard/_vm-create-2.html:20
#: dashboard/templates/dashboard/vm-detail/home.html:8
#: dashboard/templates/dashboard/vm-detail/home.html:9
#: dashboard/templates/dashboard/vm-list.html:62 firewall/models.py:296
#: network/templates/network/index.html:24
#: network/templates/network/switch-port-edit.html:45
......@@ -164,7 +164,7 @@ msgstr ""
"ajánlott."
#: dashboard/forms.py:216 dashboard/templates/dashboard/_vm-create-1.html:59
#: dashboard/templates/dashboard/vm-detail/home.html:33
#: dashboard/templates/dashboard/vm-detail/home.html:34
msgid "Description"
msgstr "Leírás"
......@@ -223,7 +223,7 @@ msgstr "Gép"
#: dashboard/forms.py:383 dashboard/forms.py:781 dashboard/forms.py:991
#: dashboard/templates/dashboard/node-detail.html:5
#: dashboard/templates/dashboard/vm-detail/home.html:116
#: dashboard/templates/dashboard/vm-detail/home.html:117
#: dashboard/templates/dashboard/vm-list.html:87
msgid "Node"
msgstr "Csomópont"
......@@ -396,7 +396,7 @@ msgstr "Protokoll"
msgid "<label>Host:</label> {0}"
msgstr "<label>Gép:</label> {0}"
#: dashboard/forms.py:1068 dashboard/templates/dashboard/profile.html:32
#: dashboard/forms.py:1068 dashboard/templates/dashboard/profile.html:36
#: dashboard/templates/dashboard/vm-detail.html:118
msgid "Username"
msgstr "Felhasználónév"
......@@ -409,7 +409,7 @@ msgstr "Jelszó"
msgid "Sign in"
msgstr "Bejelentkezés"
#: dashboard/forms.py:1110 dashboard/templates/dashboard/profile.html:38
#: dashboard/forms.py:1110 dashboard/templates/dashboard/profile.html:42
msgid "Email address"
msgstr "E-mail cím"
......@@ -431,7 +431,7 @@ msgstr "Választott nyelv"
#: dashboard/forms.py:1272 dashboard/templates/dashboard/group-list.html:14
#: dashboard/templates/dashboard/index-groups.html:7
#: dashboard/templates/dashboard/profile.html:57
#: dashboard/templates/dashboard/profile.html:60
#: dashboard/templates/dashboard/vm-detail/network.html:40
#: network/templates/network/host-edit.html:32 templates/info/help.html:192
msgid "Groups"
......@@ -607,7 +607,7 @@ msgstr "A csoport egyedi szervezeti azonosítója."
#. Translators: [T] as Template
#: dashboard/tables.py:53 dashboard/tables.py:308
#: dashboard/templates/dashboard/vm-detail/home.html:129
#: dashboard/templates/dashboard/vm-detail/home.html:130
msgid "Template"
msgstr "Sablon"
......@@ -658,7 +658,7 @@ msgstr "Adminisztráció"
msgid "Actions"
msgstr "Műveletek"
#: dashboard/tables.py:163 dashboard/templates/dashboard/profile.html:33
#: dashboard/tables.py:163 dashboard/templates/dashboard/profile.html:37
msgid "Organization ID"
msgstr "Címtári azonosító"
......@@ -856,7 +856,7 @@ msgstr "Ki"
msgid "What"
msgstr "Mi"
#: dashboard/templates/dashboard/_notifications-timeline.html:19
#: dashboard/templates/dashboard/_notifications-timeline.html:21
msgid "You have no notifications."
msgstr "Nincs értesítése."
......@@ -1071,7 +1071,8 @@ msgstr "Kijelentkezés"
#: dashboard/templates/dashboard/base.html:50
#: dashboard/templates/dashboard/base.html:60
#: dashboard/templates/dashboard/notifications.html:21
#: dashboard/templates/dashboard/notifications.html:4
#: dashboard/templates/dashboard/notifications.html:24
msgid "Notifications"
msgstr "Értesítések"
......@@ -1192,7 +1193,7 @@ msgstr "Parancssablon létrehozása"
#: dashboard/templates/dashboard/connect-command-edit.html:13
#: dashboard/templates/dashboard/lease-create.html:13
#: dashboard/templates/dashboard/lease-edit.html:12
#: dashboard/templates/dashboard/profile.html:20
#: dashboard/templates/dashboard/profile.html:23
#: dashboard/templates/dashboard/template-edit.html:16
#: dashboard/templates/dashboard/userkey-create.html:13
#: dashboard/templates/dashboard/userkey-edit.html:14 network/forms.py:65
......@@ -1242,7 +1243,7 @@ msgstr "csoport"
#: dashboard/templates/dashboard/node-detail.html:24
#: dashboard/templates/dashboard/node-list/column-name.html:7
#: dashboard/templates/dashboard/vm-detail.html:65
#: dashboard/templates/dashboard/vm-detail/home.html:24
#: dashboard/templates/dashboard/vm-detail/home.html:25
#: dashboard/templates/dashboard/vm-list/column-name.html:7
msgid "Rename"
msgstr "Átnevezés"
......@@ -1550,8 +1551,8 @@ msgid "subactivities"
msgstr "altevékenységek"
#: dashboard/templates/dashboard/instanceactivity_detail.html:74
#: dashboard/templates/dashboard/node-detail/_activity-timeline.html:29
#: dashboard/templates/dashboard/vm-detail/_activity-timeline.html:48
#: dashboard/templates/dashboard/node-detail/_activity-timeline.html:33
#: dashboard/templates/dashboard/vm-detail/_activity-timeline.html:51
msgid "failed"
msgstr "meghiúsult"
......@@ -1737,51 +1738,51 @@ msgid "Log in as this user. Recommended to open in an incognito window."
msgstr ""
"Bejelentkezés a felhasználó nevében. Ajánlott inkognitóablakban megnyitni."
#: dashboard/templates/dashboard/profile.html:18
#: dashboard/templates/dashboard/profile.html:19
msgid "Login as this user"
msgstr "Bejelentkezés a felhasználó nevében"
#: dashboard/templates/dashboard/profile.html:34
#: dashboard/templates/dashboard/profile.html:38
msgid "First name"
msgstr "Keresztnév"
#: dashboard/templates/dashboard/profile.html:35
#: dashboard/templates/dashboard/profile.html:39
msgid "Last name"
msgstr "Vezetéknév"
#: dashboard/templates/dashboard/profile.html:43
#: dashboard/templates/dashboard/profile.html:47
msgid "Use email address as Gravatar profile image"
msgstr "E-mail cím használata a Gravatar profilkép betöltésére"
#: dashboard/templates/dashboard/profile.html:46
#: dashboard/templates/dashboard/profile.html:50
msgid "What's Gravatar?"
msgstr "Mi az a Gravatar?"
#: dashboard/templates/dashboard/profile.html:48
#: dashboard/templates/dashboard/profile.html:52
msgid "Change my preferences"
msgstr "Személyes beállítások"
#: dashboard/templates/dashboard/profile.html:63
#: dashboard/templates/dashboard/profile.html:66
msgid "This user is not in any group."
msgstr "A felhasználó nem tagja csoportnak."
#: dashboard/templates/dashboard/profile.html:72
#: dashboard/templates/dashboard/profile.html:75
msgid "Virtual machines owned by the user"
msgstr "A felhasználó virtuális gépei"
#: dashboard/templates/dashboard/profile.html:84
#: dashboard/templates/dashboard/profile.html:87
msgid "This user have no virtual machines."
msgstr "A felhasználónak nincs virtuális gépe."
#: dashboard/templates/dashboard/profile.html:93
#: dashboard/templates/dashboard/profile.html:96
msgid "Virtual machines with access"
msgstr "Elérhető virtuális gépek"
#: dashboard/templates/dashboard/profile.html:105
#: dashboard/templates/dashboard/profile.html:108
msgid "This user have no access to any virtual machine."
msgstr "A felhasználónak egy géphez sincs hozzáférése."
#: dashboard/templates/dashboard/profile.html:119
#: dashboard/templates/dashboard/profile.html:122
msgid "Edit user"
msgstr "Felhasználó szerkesztése"
......@@ -1942,7 +1943,7 @@ msgstr "Felsorolás"
#: dashboard/templates/dashboard/store/list.html:5
#: dashboard/templates/dashboard/store/upload.html:4
#: dashboard/templates/dashboard/vm-detail/home.html:146
#: dashboard/templates/dashboard/vm-detail/home.html:147
msgid "Store"
msgstr "Tárhely"
......@@ -2049,30 +2050,22 @@ msgstr "Hozzáférési jogosultsági szintek"
#: dashboard/templates/dashboard/template-edit.html:121
#: dashboard/templates/dashboard/vm-detail/access.html:27
#, fuzzy
#| msgid "Users"
msgid "User"
msgstr "Felhasználók"
msgstr "Felhasználó"
#: dashboard/templates/dashboard/template-edit.html:123
#, fuzzy
#| msgid ""
#| " The system cannot be used for illegal activites.\n"
#| " "
msgid ""
"\n"
" User can deploy instances from this template.\n"
" "
msgstr ""
"\n"
"A rendszer nem használható jogszerűtlen célokra."
"A felhasználható indíthat példányokat a sablonból."
#: dashboard/templates/dashboard/template-edit.html:127
#: dashboard/templates/dashboard/vm-detail/access.html:31
#, fuzzy
#| msgid "operator"
msgid "Operator"
msgstr "operátor"
msgstr "Operátor"
#: dashboard/templates/dashboard/template-edit.html:129
msgid ""
......@@ -2286,15 +2279,15 @@ msgstr "Konzol"
msgid "Access"
msgstr "Hozzáférés"
#: dashboard/templates/dashboard/vm-detail/_activity-timeline.html:31
#: dashboard/templates/dashboard/vm-detail/_activity-timeline.html:32
msgid "Abort"
msgstr "Megszakítás"
#: dashboard/templates/dashboard/vm-detail/_activity-timeline.html:62
#: dashboard/templates/dashboard/vm-detail/_activity-timeline.html:65
msgid "Show less activities"
msgstr "Kevesebb tevékenység megjelenítése"
#: dashboard/templates/dashboard/vm-detail/_activity-timeline.html:64
#: dashboard/templates/dashboard/vm-detail/_activity-timeline.html:67
msgid "Show all activities"
msgstr "Összes tevékenység megjelenítése"
......@@ -2374,35 +2367,35 @@ msgstr "Képernyőkép"
msgid "Close"
msgstr "Bezárás"
#: dashboard/templates/dashboard/vm-detail/home.html:5
#: dashboard/templates/dashboard/vm-detail/home.html:6
msgid "System"
msgstr "Rendszer"
#: dashboard/templates/dashboard/vm-detail/home.html:48
#: dashboard/templates/dashboard/vm-detail/home.html:49
msgid "Update"
msgstr "Frissítés"
#: dashboard/templates/dashboard/vm-detail/home.html:57
#: dashboard/templates/dashboard/vm-detail/home.html:58
msgid "Expiration"
msgstr "Lejárat"
#: dashboard/templates/dashboard/vm-detail/home.html:69
#: dashboard/templates/dashboard/vm-detail/home.html:70
msgid "Suspended at:"
msgstr "Felfüggesztve:"
#: dashboard/templates/dashboard/vm-detail/home.html:75
#: dashboard/templates/dashboard/vm-detail/home.html:76
msgid "Destroyed at:"
msgstr "Megsemmisítve:"
#: dashboard/templates/dashboard/vm-detail/home.html:84
#: dashboard/templates/dashboard/vm-detail/home.html:85
msgid "Tags"
msgstr "Címkék"
#: dashboard/templates/dashboard/vm-detail/home.html:97
#: dashboard/templates/dashboard/vm-detail/home.html:98
msgid "No tag added."
msgstr "Nincs címke."
#: dashboard/templates/dashboard/vm-detail/home.html:109
#: dashboard/templates/dashboard/vm-detail/home.html:110
msgid "Add tag"
msgstr "Címke hozzáadása"
......@@ -2519,7 +2512,7 @@ msgid ""
" "
msgstr ""
#: dashboard/validators.py:57
#: dashboard/validators.py:74
msgid "Invalid template string."
msgstr "Érvénytelen sablon."
......@@ -2543,36 +2536,36 @@ msgstr "példányok száma"
msgid "Allocated memory (bytes)"
msgstr "Foglalt memória (byte)"
#: dashboard/views/group.py:151
#: dashboard/views/group.py:150
#, python-format
msgid "User \"%s\" not found."
msgstr "Nem található „%s” felhasználó."
#: dashboard/views/group.py:165
#: dashboard/views/group.py:164
msgid "Group successfully renamed."
msgstr "A csoport átnevezésre került."
#: dashboard/views/group.py:234
#: dashboard/views/group.py:233
msgid "Member successfully removed from group."
msgstr "A csoporttag eltávolításra került."
#: dashboard/views/group.py:267
#: dashboard/views/group.py:266
msgid "Future user successfully removed from group."
msgstr "A leendő csoporttag eltávolításra került."
#: dashboard/views/group.py:289
#: dashboard/views/group.py:288
msgid "Group successfully deleted."
msgstr "A csoport törlésre került."
#: dashboard/views/group.py:318
#: dashboard/views/group.py:317
msgid "Create a Group"
msgstr "Csoport létrehozása"
#: dashboard/views/group.py:334
#: dashboard/views/group.py:333
msgid "Group successfully created."
msgstr "A csoport létrehozásra került."
#: dashboard/views/group.py:348
#: dashboard/views/group.py:347
msgid "Group is successfully updated."
msgstr "A csoport frissítésre került."
......@@ -3566,10 +3559,9 @@ msgid "whitelisted"
msgstr ""
#: firewall/models.py:1128
#, fuzzy
#| msgid "Expiration"
msgid "expires at"
msgstr "Lejárat"
msgstr "lejár"
#: firewall/models.py:1138
msgid "blacklist item"
......@@ -3581,10 +3573,9 @@ msgid "blacklist"
msgstr "tiltólista"
#: firewall/views.py:79
#, fuzzy
#| msgid "Enter a valid IP address. %s"
msgid "Invalid IP address."
msgstr "Érvénytelen IP cím. %s"
msgstr "Érvénytelen IP cím."
#: firewall/views.py:111
msgid "OK"
......@@ -4034,37 +4025,35 @@ msgid "list of all vlans"
msgstr "összes vlan"
#: network/views.py:140
#, fuzzy, python-format
#, python-format
#| msgid "Successfully modified blacklist item%(ipv4)s - %(type)s!"
msgid "Successfully modified blacklist item %(ipv4)s."
msgstr "Tiltólista eleme sikeresen módosítva (%(ipv4)s %(type)s)."
msgstr "Tiltólista eleme sikeresen módosítva (%(ipv4)s)."
#: network/views.py:157
#, fuzzy, python-format
#, python-format
#| msgid "Successfully created blacklist item %(ipv4)s - %(type)s!"
msgid "Successfully created blacklist item %(ipv4)s"
msgstr "Tiltólista eleme sikeresen létrehozva (%(ipv4)s %(type)s)."
msgstr "Tiltólista eleme sikeresen létrehozva (%(ipv4)s)."
#: network/views.py:192
#, fuzzy, python-format
#, python-format
#| msgid "Successfully modified domain %(name)s!"
msgid "Successfully modified domain %(name)s."
msgstr "A(z) %(name)s tartománynév módosításra került."
#: network/views.py:219
#, fuzzy, python-format
#, python-format
#| msgid "Successfully created domain %(name)s!"
msgid "Successfully created domain %(name)s."
msgstr "A(z) %(name)s tartománynév létrehozásra került."
#: network/views.py:236 network/views.py:563 network/views.py:845
#, fuzzy
#| msgid "Object name does not match!"
msgid "Object name does not match."
msgstr "Az objektum neve nem egyezik."
#: network/views.py:240
#, fuzzy
#| msgid "Domain successfully deleted!"
msgid "Domain successfully deleted."
msgstr "A tartománynév törlésre került."
......@@ -4082,43 +4071,40 @@ msgid "Successfully created firewall."
msgstr "A tűzfal létrehozásra került."
#: network/views.py:350
#, fuzzy, python-format
#, python-format
#| msgid "Successfully created host group %(name)s!"
msgid "Successfully created host group %(name)s."
msgstr "%(name)s gépcsoport létrehozásra került."
#: network/views.py:358
#, fuzzy, python-format
#, python-format
#| msgid "Successfully modified host group %(name)s!"
msgid "Successfully modified host group %(name)s."
msgstr "%(name)s gépcsoport módosításra került."
#: network/views.py:442
#, fuzzy, python-format
#, python-format
#| msgid "Successfully modified host %(hostname)s!"
msgid "Successfully modified host %(hostname)s."
msgstr "%(hostname)s gép módosításra került."
#: network/views.py:515
#, fuzzy, python-format
#, python-format
#| msgid "Successfully created host %(hostname)s!"
msgid "Successfully created host %(hostname)s."
msgstr "%(hostname)s gép létrehozásra került."
#: network/views.py:567
#, fuzzy
#| msgid "Host successfully deleted!"
msgid "Host successfully deleted."
msgstr "A gép törlésre került."
#: network/views.py:597
#, fuzzy
#| msgid "Successfully modified record!"
msgid "Successfully modified record."
msgstr "A rekord módosításra került."
#: network/views.py:616
#, fuzzy
#| msgid "Successfully created record!"
msgid "Successfully created record."
msgstr "A rekord létrehozásra került."
......@@ -4136,73 +4122,68 @@ msgid "Firewall"
msgstr "Tűzfal"
#: network/views.py:682
#, fuzzy
#| msgid "Successfully modified rule!"
msgid "Successfully modified rule."
msgstr "A szabály módosításra került."
#: network/views.py:702
#, fuzzy
#| msgid "Successfully created rule!"
msgid "Successfully created rule."
msgstr "A szabály létrehozásra került."
#: network/views.py:738
#, fuzzy
#| msgid "Succesfully modified switch port!"
msgid "Succesfully modified switch port."
msgstr "A switch-port módosításra került."
#: network/views.py:757
#, fuzzy
#| msgid "Successfully created switch port!"
msgid "Successfully created switch port."
msgstr "A switch-port létrehozásra került."
#: network/views.py:804
#, fuzzy, python-format
#, python-format
#| msgid "Succesfully modified vlan %(name)s!"
msgid "Succesfully modified vlan %(name)s."
msgstr "A(z) %(name)s vlan módosításra került."
#: network/views.py:824
#, fuzzy, python-format
#, python-format
#| msgid "Successfully created vlan %(name)s!"
msgid "Successfully created vlan %(name)s."
msgstr "A(z) %(name)s vlan létrehozásra került."
#: network/views.py:849
#, fuzzy
#| msgid "Vlan successfully deleted!"
msgid "Vlan successfully deleted."
msgstr "A vlan törlésre került."
#: network/views.py:891
#, fuzzy, python-format
#, python-format
#| msgid "Successfully modified vlan group %(name)s!"
msgid "Successfully modified vlan group %(name)s."
msgstr "A(z) %(name)s vlan-csoport módosításra került."
#: network/views.py:904
#, fuzzy, python-format
#, python-format
#| msgid "Successfully created vlan group %(name)s!"
msgid "Successfully created vlan group %(name)s."
msgstr "A(z) %(name)s vlan-csoport módosításra került."
#: network/views.py:936
#, fuzzy, python-format
#, python-format
#| msgid "Successfully removed %(host)s from %(group)s group!"
msgid "Successfully removed %(host)s from %(group)s group."
msgstr "A(z) %(host)s csoport törlésre került a(z) %(group)s csoportból."
#: network/views.py:952
#, fuzzy, python-format
#, python-format
#| msgid "Successfully added %(host)s to group %(group)s!"
msgid "Successfully added %(host)s to group %(group)s."
msgstr "A(z) %(host)s csoport hozzáadásra került a(z) %(group)s csoporthoz."
#: network/views.py:971
#, fuzzy, python-format
#, python-format
#| msgid "Successfully deleted ethernet device %(name)s!"
msgid "Successfully deleted ethernet device %(name)s."
msgstr "A(z) %(name)s ethernet-eszköz törlésre került."
......@@ -4213,13 +4194,11 @@ msgid "Successfully added %(name)s to this switch port"
msgstr "%(name)s hozzáadásra került a switch-porthoz."
#: network/views.py:996
#, fuzzy
#| msgid "Ethernet device name cannot be empty!"
msgid "Ethernet device name cannot be empty."
msgstr "Az ethernet-eszköz megadása kötelező."
#: network/views.py:999
#, fuzzy
#| msgid "There is already an ethernet device with that name!"
msgid "There is already an ethernet device with that name."
msgstr "Már létezik a megadott nevű ethernet-eszköz."
......
# 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 itertools import islice
from socket import gethostname
import logging
......
amqp==1.4.6
anyjson==0.3.3
arrow==0.5.4
billiard==3.3.0.18
bpython==0.13.1
celery==3.1.17
......
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