Commit 96364f6a by Kálmán Viktor

Merge branch 'master' into issue-sliders

Conflicts:
	circle/common/models.py
parents 478df358 d6891337
...@@ -35,7 +35,11 @@ SOUTH_TESTS_MIGRATE = False ...@@ -35,7 +35,11 @@ SOUTH_TESTS_MIGRATE = False
INSTALLED_APPS += ( INSTALLED_APPS += (
'acl.tests', 'acl.tests',
'django_nose',
) )
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
NOSE_ARGS = ['--with-doctest']
PASSWORD_HASHERS = ['django.contrib.auth.hashers.MD5PasswordHasher']
CACHES = { CACHES = {
'default': { 'default': {
......
...@@ -47,17 +47,24 @@ class WorkerNotFound(Exception): ...@@ -47,17 +47,24 @@ class WorkerNotFound(Exception):
def activitycontextimpl(act, on_abort=None, on_commit=None): def activitycontextimpl(act, on_abort=None, on_commit=None):
try: try:
try:
yield act yield act
except HumanReadableException as e:
result = e
raise
except BaseException as e: except BaseException as e:
# BaseException is the common parent of Exception and # BaseException is the common parent of Exception and
# system-exiting exceptions, e.g. KeyboardInterrupt # system-exiting exceptions, e.g. KeyboardInterrupt
handler = None if on_abort is None else lambda a: on_abort(a, e) result = create_readable(
result = create_readable(ugettext_noop("Failure."), ugettext_noop("Failure."),
ugettext_noop("Unhandled exception: " ugettext_noop("Unhandled exception: %(error)s"),
"%(error)s"),
error=unicode(e)) error=unicode(e))
raise
except:
logger.exception("Failed activity %s" % unicode(act))
handler = None if on_abort is None else lambda a: on_abort(a, e)
act.finish(succeeded=False, result=result, event_handler=handler) act.finish(succeeded=False, result=result, event_handler=handler)
raise e raise
else: else:
act.finish(succeeded=True, event_handler=on_commit) act.finish(succeeded=True, event_handler=on_commit)
...@@ -71,11 +78,11 @@ activity_code_separator = '.' ...@@ -71,11 +78,11 @@ activity_code_separator = '.'
def has_prefix(activity_code, *prefixes): def has_prefix(activity_code, *prefixes):
"""Determine whether the activity code has the specified prefix. """Determine whether the activity code has the specified prefix.
E.g.: has_prefix('foo.bar.buz', 'foo.bar') == True >>> assert has_prefix('foo.bar.buz', 'foo.bar')
has_prefix('foo.bar.buz', 'foo', 'bar') == True >>> assert has_prefix('foo.bar.buz', 'foo', 'bar')
has_prefix('foo.bar.buz', 'foo.bar', 'buz') == True >>> assert has_prefix('foo.bar.buz', 'foo.bar', 'buz')
has_prefix('foo.bar.buz', 'foo', 'bar', 'buz') == True >>> assert has_prefix('foo.bar.buz', 'foo', 'bar', 'buz')
has_prefix('foo.bar.buz', 'foo', 'buz') == False >>> assert not has_prefix('foo.bar.buz', 'foo', 'buz')
""" """
equal = lambda a, b: a == b equal = lambda a, b: a == b
act_code_parts = split_activity_code(activity_code) act_code_parts = split_activity_code(activity_code)
...@@ -86,11 +93,11 @@ def has_prefix(activity_code, *prefixes): ...@@ -86,11 +93,11 @@ def has_prefix(activity_code, *prefixes):
def has_suffix(activity_code, *suffixes): def has_suffix(activity_code, *suffixes):
"""Determine whether the activity code has the specified suffix. """Determine whether the activity code has the specified suffix.
E.g.: has_suffix('foo.bar.buz', 'bar.buz') == True >>> assert has_suffix('foo.bar.buz', 'bar.buz')
has_suffix('foo.bar.buz', 'bar', 'buz') == True >>> assert has_suffix('foo.bar.buz', 'bar', 'buz')
has_suffix('foo.bar.buz', 'foo.bar', 'buz') == True >>> assert has_suffix('foo.bar.buz', 'foo.bar', 'buz')
has_suffix('foo.bar.buz', 'foo', 'bar', 'buz') == True >>> assert has_suffix('foo.bar.buz', 'foo', 'bar', 'buz')
has_suffix('foo.bar.buz', 'foo', 'buz') == False >>> assert not has_suffix('foo.bar.buz', 'foo', 'buz')
""" """
equal = lambda a, b: a == b equal = lambda a, b: a == b
act_code_parts = split_activity_code(activity_code) act_code_parts = split_activity_code(activity_code)
...@@ -197,6 +204,10 @@ class ActivityModel(TimeStampedModel): ...@@ -197,6 +204,10 @@ class ActivityModel(TimeStampedModel):
DeprecationWarning, stacklevel=2) DeprecationWarning, stacklevel=2)
value = create_readable(user_text_template="", value = create_readable(user_text_template="",
admin_text_template=value) admin_text_template=value)
elif not hasattr(value, "to_dict"):
warn("Use HumanReadableObject.", DeprecationWarning, stacklevel=2)
value = create_readable(user_text_template="",
admin_text_template=unicode(value))
self.result_data = None if value is None else value.to_dict() self.result_data = None if value is None else value.to_dict()
...@@ -362,8 +373,9 @@ class HumanReadableObject(object): ...@@ -362,8 +373,9 @@ class HumanReadableObject(object):
@classmethod @classmethod
def create(cls, user_text_template, admin_text_template=None, **params): def create(cls, user_text_template, admin_text_template=None, **params):
return cls(user_text_template, return cls(user_text_template=user_text_template,
admin_text_template or user_text_template, params) admin_text_template=(admin_text_template
or user_text_template), params=params)
def set(self, user_text_template, admin_text_template=None, **params): def set(self, user_text_template, admin_text_template=None, **params):
self._set_values(user_text_template, self._set_values(user_text_template,
...@@ -408,14 +420,26 @@ create_readable = HumanReadableObject.create ...@@ -408,14 +420,26 @@ create_readable = HumanReadableObject.create
class HumanReadableException(HumanReadableObject, Exception): class HumanReadableException(HumanReadableObject, Exception):
"""HumanReadableObject that is an Exception so can used in except clause. """HumanReadableObject that is an Exception so can used in except clause.
""" """
level = "error"
def send_message(self, request): def __init__(self, level=None, *args, **kwargs):
super(HumanReadableException, self).__init__(*args, **kwargs)
if level is not None:
if hasattr(messages, level):
self.level = level
else:
raise ValueError(
"Level should be the name of an attribute of django."
"contrib.messages (and it should be callable with "
"(request, message)). Like 'error', 'warning'.")
else:
self.level = "error"
def send_message(self, request, level=None):
if request.user and request.user.is_superuser: if request.user and request.user.is_superuser:
msg = self.get_admin_text() msg = self.get_admin_text()
else: else:
msg = self.get_user_text() msg = self.get_user_text()
getattr(messages, self.level)(request, msg) getattr(messages, level or self.level)(request, msg)
def humanize_exception(message, exception=None, level=None, **params): def humanize_exception(message, exception=None, level=None, **params):
...@@ -428,10 +452,10 @@ def humanize_exception(message, exception=None, level=None, **params): ...@@ -428,10 +452,10 @@ def humanize_exception(message, exception=None, level=None, **params):
Welcome! Welcome!
""" """
if level is not None:
exception.level = level
Ex = type("HumanReadable" + type(exception).__name__, Ex = type("HumanReadable" + type(exception).__name__,
(HumanReadableException, type(exception)), (HumanReadableException, type(exception)),
exception.__dict__) exception.__dict__)
return Ex.create(message, **params) ex = Ex.create(message, **params)
if level:
ex.level = level
return ex
...@@ -1322,7 +1322,7 @@ ...@@ -1322,7 +1322,7 @@
"user_permissions": [ "user_permissions": [
115 115
], ],
"password": "pbkdf2_sha256$10000$KIoeMs78MiOj$PnVXn3YJMehbOciBO32CMzqL0ZnQrzrdb7+b5dE13os=", "password": "md5$qLN4mQMOrsUJ$f07129fd1a289a0afb4e09f7a6816a4f",
"email": "test@example.org", "email": "test@example.org",
"date_joined": "2013-09-04T15:29:49.914Z" "date_joined": "2013-09-04T15:29:49.914Z"
} }
......
...@@ -529,24 +529,25 @@ class VmDetailTest(LoginMixin, TestCase): ...@@ -529,24 +529,25 @@ class VmDetailTest(LoginMixin, TestCase):
def test_permitted_wake_up_wrong_state(self): def test_permitted_wake_up_wrong_state(self):
c = Client() c = Client()
self.login(c, "user2") self.login(c, "user2")
with patch.object(WakeUpOperation, 'async') as mock_method: with patch.object(WakeUpOperation, 'async') as mock_method, \
patch.object(Instance.WrongStateError, 'send_message') as wro:
inst = Instance.objects.get(pk=1) inst = Instance.objects.get(pk=1)
mock_method.side_effect = inst.wake_up mock_method.side_effect = inst.wake_up
inst.status = 'RUNNING' inst.status = 'RUNNING'
inst.set_level(self.u2, 'owner') inst.set_level(self.u2, 'owner')
with patch('dashboard.views.messages') as msg:
c.post("/dashboard/vm/1/op/wake_up/") c.post("/dashboard/vm/1/op/wake_up/")
assert msg.error.called
inst = Instance.objects.get(pk=1) inst = Instance.objects.get(pk=1)
self.assertEqual(inst.status, 'RUNNING') # mocked anyway self.assertEqual(inst.status, 'RUNNING') # mocked anyway
assert mock_method.called assert mock_method.called
assert wro.called
def test_permitted_wake_up(self): def test_permitted_wake_up(self):
c = Client() c = Client()
self.login(c, "user2") self.login(c, "user2")
with patch.object(Instance, 'select_node', return_value=None): with patch.object(Instance, 'select_node', return_value=None), \
with patch.object(WakeUpOperation, 'async') as new_wake_up: patch.object(WakeUpOperation, 'async') as new_wake_up, \
with patch('vm.tasks.vm_tasks.wake_up.apply_async') as wuaa: patch('vm.tasks.vm_tasks.wake_up.apply_async') as wuaa, \
patch.object(Instance.WrongStateError, 'send_message') as wro:
inst = Instance.objects.get(pk=1) inst = Instance.objects.get(pk=1)
new_wake_up.side_effect = inst.wake_up new_wake_up.side_effect = inst.wake_up
inst.get_remote_queue_name = Mock(return_value='test') inst.get_remote_queue_name = Mock(return_value='test')
...@@ -559,6 +560,7 @@ class VmDetailTest(LoginMixin, TestCase): ...@@ -559,6 +560,7 @@ class VmDetailTest(LoginMixin, TestCase):
self.assertEqual(inst.status, 'RUNNING') self.assertEqual(inst.status, 'RUNNING')
assert new_wake_up.called assert new_wake_up.called
assert wuaa.called assert wuaa.called
assert not wro.called
def test_unpermitted_wake_up(self): def test_unpermitted_wake_up(self):
c = Client() c = Client()
......
...@@ -71,7 +71,7 @@ from .tables import ( ...@@ -71,7 +71,7 @@ from .tables import (
NodeListTable, NodeVmListTable, TemplateListTable, LeaseListTable, NodeListTable, NodeVmListTable, TemplateListTable, LeaseListTable,
GroupListTable, UserKeyListTable GroupListTable, UserKeyListTable
) )
from common.models import HumanReadableObject from common.models import HumanReadableObject, HumanReadableException
from vm.models import ( from vm.models import (
Instance, instance_activity, InstanceActivity, InstanceTemplate, Interface, Instance, instance_activity, InstanceActivity, InstanceTemplate, Interface,
InterfaceTemplate, Lease, Node, NodeActivity, Trait, InterfaceTemplate, Lease, Node, NodeActivity, Trait,
...@@ -562,9 +562,13 @@ class OperationView(RedirectToLoginMixin, DetailView): ...@@ -562,9 +562,13 @@ class OperationView(RedirectToLoginMixin, DetailView):
done = False done = False
try: try:
task = self.get_op().async(user=request.user, **extra) task = self.get_op().async(user=request.user, **extra)
except HumanReadableException as e:
e.send_message(request)
logger.exception("Could not start operation")
result = e
except Exception as e: except Exception as e:
messages.error(request, _('Could not start operation.')) messages.error(request, _('Could not start operation.'))
logger.exception(e) logger.exception("Could not start operation")
result = e result = e
else: else:
wait = self.wait_for_result wait = self.wait_for_result
...@@ -575,6 +579,10 @@ class OperationView(RedirectToLoginMixin, DetailView): ...@@ -575,6 +579,10 @@ class OperationView(RedirectToLoginMixin, DetailView):
except TimeoutError: except TimeoutError:
logger.debug("Result didn't arrive in %ss", logger.debug("Result didn't arrive in %ss",
self.wait_for_result, exc_info=True) self.wait_for_result, exc_info=True)
except HumanReadableException as e:
e.send_message(request)
logger.exception(e)
result = e
except Exception as e: except Exception as e:
messages.error(request, _('Operation failed.')) messages.error(request, _('Operation failed.'))
logger.debug("Operation failed.", exc_info=True) logger.debug("Operation failed.", exc_info=True)
......
#!/bin/echo Usage: fab --list -f
import contextlib import contextlib
import datetime import datetime
...@@ -9,14 +10,14 @@ from fabric.decorators import roles, parallel ...@@ -9,14 +10,14 @@ from fabric.decorators import roles, parallel
env.roledefs['portal'] = ['localhost'] env.roledefs['portal'] = ['localhost']
try: try:
from vm.models import Node from vm.models import Node as _Node
from storage.models import DataStore from storage.models import DataStore as _DataStore
except Exception as e: except Exception as e:
print e print e
else: else:
env.roledefs['node'] = [unicode(n.host.ipv4) env.roledefs['node'] = [unicode(n.host.ipv4)
for n in Node.objects.filter(enabled=True)] for n in _Node.objects.filter(enabled=True)]
env.roledefs['storage'] = [DataStore.objects.get().hostname] env.roledefs['storage'] = [_DataStore.objects.get().hostname]
def update_all(): def update_all():
......
[General]
LangCode=hu
MailingList=cloud@ik.bme.hu
PotBaseDir=./
ProjectID=circle-hu
TargetLangCode=hu
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -6,7 +6,7 @@ msgid "" ...@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-05-07 14:25+0200\n" "POT-Creation-Date: 2014-07-29 12:56+0200\n"
"PO-Revision-Date: 2014-05-07 15:32+0200\n" "PO-Revision-Date: 2014-05-07 15:32+0200\n"
"Last-Translator: Mate Ory <orymate@ik.bme.hu>\n" "Last-Translator: Mate Ory <orymate@ik.bme.hu>\n"
"Language-Team: Hungarian <cloud@ik.bme.hu>\n" "Language-Team: Hungarian <cloud@ik.bme.hu>\n"
...@@ -17,105 +17,144 @@ msgstr "" ...@@ -17,105 +17,144 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.5\n" "X-Generator: Lokalize 1.5\n"
#: dashboard/static/dashboard/dashboard.js:54 #: dashboard/static/dashboard/dashboard.js:68
#: static_collected/dashboard/dashboard.js:68
msgid "Select an option to proceed!" msgid "Select an option to proceed!"
msgstr "Válasszon a folytatáshoz." msgstr "Válasszon a folytatáshoz."
#: dashboard/static/dashboard/dashboard.js:257
#: dashboard/static/dashboard/dashboard.js:304
#: dashboard/static/dashboard/dashboard.js:314
#: static_collected/dashboard/dashboard.js:257
#: static_collected/dashboard/dashboard.js:304
#: static_collected/dashboard/dashboard.js:314
msgid "No result"
msgstr ""
#: dashboard/static/dashboard/profile.js:18
#: static_collected/dashboard/profile.js:18
msgid "You have no permission to change this profile."
msgstr ""
#: dashboard/static/dashboard/profile.js:20
#: static_collected/dashboard/profile.js:20
msgid "Unknown error."
msgstr ""
#: dashboard/static/dashboard/vm-tour.js:20 #: dashboard/static/dashboard/vm-tour.js:20
#: static_collected/dashboard/vm-tour.js:20
msgid "Prev" msgid "Prev"
msgstr "Vissza" msgstr "Vissza"
#: dashboard/static/dashboard/vm-tour.js:22 #: dashboard/static/dashboard/vm-tour.js:22
#: static_collected/dashboard/vm-tour.js:22
msgid "Next" msgid "Next"
msgstr "Tovább" msgstr "Tovább"
#: dashboard/static/dashboard/vm-tour.js:26 #: dashboard/static/dashboard/vm-tour.js:26
#: static_collected/dashboard/vm-tour.js:26
msgid "End tour" msgid "End tour"
msgstr "Befejezés" msgstr "Befejezés"
#: dashboard/static/dashboard/vm-tour.js:33 #: dashboard/static/dashboard/vm-tour.js:33
#: static_collected/dashboard/vm-tour.js:33
msgid "Template Tutorial Tour" msgid "Template Tutorial Tour"
msgstr "Sablon-kalauz" msgstr "Sablon-kalauz"
#: dashboard/static/dashboard/vm-tour.js:34 #: dashboard/static/dashboard/vm-tour.js:34
#: static_collected/dashboard/vm-tour.js:34
msgid "" msgid ""
"Welcome to the template tutorial. In this quick tour, we gonna show you how " "Welcome to the template tutorial. In this quick tour, we gonna show you how "
"to do the steps described above." "to do the steps described above."
msgstr "" msgstr ""
"Üdvözöli a sablon-kalauz. A túra során bemutatjuk, hogyan végezze el " "Üdvözöli a sablon-kalauz. A túra során bemutatjuk, hogyan végezze el a fenti "
"a fenti lépéseket." "lépéseket."
#: dashboard/static/dashboard/vm-tour.js:35 #: dashboard/static/dashboard/vm-tour.js:35
#: static_collected/dashboard/vm-tour.js:35
msgid "" msgid ""
"For the next tour step press the \"Next\" button or the right arrow (or " "For the next tour step press the \"Next\" button or the right arrow (or "
"\"Back\" button/left arrow for the previous step)." "\"Back\" button/left arrow for the previous step)."
msgstr "" msgstr ""
"A következő lépéshez kattintson a \"Tovább\" gombra vagy használja " "A következő lépéshez kattintson a \"Tovább\" gombra vagy használja a "
"a nyílbillentyűket." "nyílbillentyűket."
#: dashboard/static/dashboard/vm-tour.js:36 #: dashboard/static/dashboard/vm-tour.js:36
#: static_collected/dashboard/vm-tour.js:36
msgid "" msgid ""
"During the tour please don't try the functions because it may lead to " "During the tour please don't try the functions because it may lead to "
"graphical glitches, however " "graphical glitches, however "
msgstr "A túra során még ne próbálja ki a bemutatott funkciókat." msgstr "A túra során még ne próbálja ki a bemutatott funkciókat."
#: dashboard/static/dashboard/vm-tour.js:45 #: dashboard/static/dashboard/vm-tour.js:45
#: static_collected/dashboard/vm-tour.js:45
msgid "Home tab" msgid "Home tab"
msgstr "Kezdőoldal" msgstr "Kezdőoldal"
#: dashboard/static/dashboard/vm-tour.js:46 #: dashboard/static/dashboard/vm-tour.js:46
#: static_collected/dashboard/vm-tour.js:46
msgid "" msgid ""
"In this tab you can tag your virtual machine and modify the name and " "In this tab you can tag your virtual machine and modify the name and "
"description." "description."
msgstr "" msgstr ""
"Ezen a lapon címkéket adhat a virtuális géphez, vagy módosíthatja " "Ezen a lapon címkéket adhat a virtuális géphez, vagy módosíthatja a nevét, "
"a nevét, leírását." "leírását."
#: dashboard/static/dashboard/vm-tour.js:55 #: dashboard/static/dashboard/vm-tour.js:55
#: static_collected/dashboard/vm-tour.js:55
msgid "Resources tab" msgid "Resources tab"
msgstr "Erőforrások lap" msgstr "Erőforrások lap"
#: dashboard/static/dashboard/vm-tour.js:58 #: dashboard/static/dashboard/vm-tour.js:58
#: static_collected/dashboard/vm-tour.js:58
msgid "" msgid ""
"On the resources tab you can edit the CPU/RAM options and add/remove disks!" "On the resources tab you can edit the CPU/RAM options and add/remove disks!"
msgstr "" msgstr ""
"Az erőforrások lapon szerkesztheti a CPU/memória-beállításokat, valamint " "Az erőforrások lapon szerkesztheti a CPU/memória-beállításokat, valamint "
"hozzáadhat " "hozzáadhat és törölhet lemezeket."
"és törölhet lemezeket."
#: dashboard/static/dashboard/vm-tour.js:68 #: dashboard/static/dashboard/vm-tour.js:68
#: static_collected/dashboard/vm-tour.js:68
msgid "Resources" msgid "Resources"
msgstr "Erőforrások" msgstr "Erőforrások"
#: dashboard/static/dashboard/vm-tour.js:69 #: dashboard/static/dashboard/vm-tour.js:69
#: static_collected/dashboard/vm-tour.js:69
msgid "CPU priority" msgid "CPU priority"
msgstr "CPU prioritás" msgstr "CPU prioritás"
#: dashboard/static/dashboard/vm-tour.js:69 #: dashboard/static/dashboard/vm-tour.js:69
#: static_collected/dashboard/vm-tour.js:69
msgid "higher is better" msgid "higher is better"
msgstr "a nagyobb érték a jobb" msgstr "a nagyobb érték a jobb"
#: dashboard/static/dashboard/vm-tour.js:70 #: dashboard/static/dashboard/vm-tour.js:70
#: static_collected/dashboard/vm-tour.js:70
msgid "CPU count" msgid "CPU count"
msgstr "CPU-k száma" msgstr "CPU-k száma"
#: dashboard/static/dashboard/vm-tour.js:70 #: dashboard/static/dashboard/vm-tour.js:70
#: static_collected/dashboard/vm-tour.js:70
msgid "number of CPU cores." msgid "number of CPU cores."
msgstr "A CPU-magok száma." msgstr "A CPU-magok száma."
#: dashboard/static/dashboard/vm-tour.js:71 #: dashboard/static/dashboard/vm-tour.js:71
#: static_collected/dashboard/vm-tour.js:71
msgid "RAM amount" msgid "RAM amount"
msgstr "RAM mennyiség" msgstr "RAM mennyiség"
#: dashboard/static/dashboard/vm-tour.js:71 #: dashboard/static/dashboard/vm-tour.js:71
#: static_collected/dashboard/vm-tour.js:71
msgid "amount of RAM." msgid "amount of RAM."
msgstr "a memória mennyisége." msgstr "a memória mennyisége."
#: dashboard/static/dashboard/vm-tour.js:81 #: dashboard/static/dashboard/vm-tour.js:81
#: static_collected/dashboard/vm-tour.js:81
msgid "Disks" msgid "Disks"
msgstr "Lemezek" msgstr "Lemezek"
#: dashboard/static/dashboard/vm-tour.js:82 #: dashboard/static/dashboard/vm-tour.js:82
#: static_collected/dashboard/vm-tour.js:82
msgid "" msgid ""
"You can add empty disks, download new ones and remove existing ones here." "You can add empty disks, download new ones and remove existing ones here."
msgstr "" msgstr ""
...@@ -123,65 +162,75 @@ msgstr "" ...@@ -123,65 +162,75 @@ msgstr ""
"meglévőket." "meglévőket."
#: dashboard/static/dashboard/vm-tour.js:92 #: dashboard/static/dashboard/vm-tour.js:92
#: static_collected/dashboard/vm-tour.js:92
msgid "Network tab" msgid "Network tab"
msgstr "Hálózat lap" msgstr "Hálózat lap"
#: dashboard/static/dashboard/vm-tour.js:93 #: dashboard/static/dashboard/vm-tour.js:93
#: static_collected/dashboard/vm-tour.js:93
msgid "You can add new network interfaces or remove existing ones here." msgid "You can add new network interfaces or remove existing ones here."
msgstr "Hozzáadhat új hálózati interfészeket, vagy törölheti a meglévőket." msgstr "Hozzáadhat új hálózati interfészeket, vagy törölheti a meglévőket."
#: dashboard/static/dashboard/vm-tour.js:102 #: dashboard/static/dashboard/vm-tour.js:102
#: static_collected/dashboard/vm-tour.js:102
msgid "Deploy" msgid "Deploy"
msgstr "Indítás" msgstr "Indítás"
#: dashboard/static/dashboard/vm-tour.js:105 #: dashboard/static/dashboard/vm-tour.js:105
#: static_collected/dashboard/vm-tour.js:105
msgid "Deploy the virtual machine." msgid "Deploy the virtual machine."
msgstr "A virtuális gép elindítása." msgstr "A virtuális gép elindítása."
#: dashboard/static/dashboard/vm-tour.js:110 #: dashboard/static/dashboard/vm-tour.js:110
#: static_collected/dashboard/vm-tour.js:110
msgid "Connect" msgid "Connect"
msgstr "Csatlakozás" msgstr "Csatlakozás"
#: dashboard/static/dashboard/vm-tour.js:113 #: dashboard/static/dashboard/vm-tour.js:113
#: static_collected/dashboard/vm-tour.js:113
msgid "Use the connection string or connect with your choice of client!" msgid "Use the connection string or connect with your choice of client!"
msgstr "Használja a megadott parancsot, vagy kedvenc kliensét." msgstr "Használja a megadott parancsot, vagy kedvenc kliensét."
#: dashboard/static/dashboard/vm-tour.js:120 #: dashboard/static/dashboard/vm-tour.js:120
#: static_collected/dashboard/vm-tour.js:120
msgid "Customize the virtual machine" msgid "Customize the virtual machine"
msgstr "Szabja testre a gépet" msgstr "Szabja testre a gépet"
#: dashboard/static/dashboard/vm-tour.js:121 #: dashboard/static/dashboard/vm-tour.js:121
#: static_collected/dashboard/vm-tour.js:121
msgid "" msgid ""
"After you have connected to the virtual machine do your modifications then " "After you have connected to the virtual machine do your modifications then "
"log off." "log off."
msgstr "" msgstr ""
"Miután csatlakozott, végezze el a szükséges módosításokat, majd " "Miután csatlakozott, végezze el a szükséges módosításokat, majd jelentkezzen "
"jelentkezzen ki." "ki."
#: dashboard/static/dashboard/vm-tour.js:126 #: dashboard/static/dashboard/vm-tour.js:126
#: static_collected/dashboard/vm-tour.js:126
msgid "Save as" msgid "Save as"
msgstr "Mentés sablonként" msgstr "Mentés sablonként"
#: dashboard/static/dashboard/vm-tour.js:129 #: dashboard/static/dashboard/vm-tour.js:129
#: static_collected/dashboard/vm-tour.js:129
msgid "" msgid ""
"Press the \"Save as template\" button and wait until the activity finishes." "Press the \"Save as template\" button and wait until the activity finishes."
msgstr "" msgstr ""
"Kattintson a „mentés sablonként” gombra, majd várjon, amíg a lemez " "Kattintson a „mentés sablonként” gombra, majd várjon, amíg a lemez mentése "
"mentése elkészül." "elkészül."
#: dashboard/static/dashboard/vm-tour.js:135 #: dashboard/static/dashboard/vm-tour.js:135
#: static_collected/dashboard/vm-tour.js:135
msgid "Finish" msgid "Finish"
msgstr "Befejezés" msgstr "Befejezés"
#: dashboard/static/dashboard/vm-tour.js:138 #: dashboard/static/dashboard/vm-tour.js:138
#: static_collected/dashboard/vm-tour.js:138
msgid "" msgid ""
"This is the last message, if something is not clear you can do the the tour " "This is the last message, if something is not clear you can do the the tour "
"again!" "again!"
msgstr "" msgstr "A túra véget ért. Ha valami nem érthető, újrakezdheti az útmutatót."
"A túra véget ért. Ha valami nem érthető, újrakezdheti az "
"útmutatót."
#: network/static/js/host.js:10 #: network/static/js/host.js:10 static_collected/js/host.js:10
msgid "" msgid ""
"Are you sure you want to remove host group <strong>\"%(group)s\"</strong> " "Are you sure you want to remove host group <strong>\"%(group)s\"</strong> "
"from <strong>\"%(host)s\"</strong>?" "from <strong>\"%(host)s\"</strong>?"
...@@ -189,19 +238,172 @@ msgstr "" ...@@ -189,19 +238,172 @@ msgstr ""
"Biztosan törli a(z)<strong>„%(host)s”</strong> gépet a(z) " "Biztosan törli a(z)<strong>„%(host)s”</strong> gépet a(z) "
"<strong>„%(group)s”</strong> gépcsoportból?" "<strong>„%(group)s”</strong> gépcsoportból?"
#: network/static/js/host.js:13 #: network/static/js/host.js:13 static_collected/js/host.js:13
msgid "Are you sure you want to delete this rule?" msgid "Are you sure you want to delete this rule?"
msgstr "Biztosan törli ezt a szabályt?" msgstr "Biztosan törli ezt a szabályt?"
#: network/static/js/host.js:20 network/static/js/switch-port.js:14 #: network/static/js/host.js:20 network/static/js/switch-port.js:14
#: static_collected/admin/js/admin/DateTimeShortcuts.js:95
#: static_collected/admin/js/admin/DateTimeShortcuts.js:208
#: static_collected/js/host.js:20 static_collected/js/switch-port.js:14
msgid "Cancel" msgid "Cancel"
msgstr "Mégsem" msgstr "Mégsem"
#: network/static/js/host.js:25 network/static/js/switch-port.js:19 #: network/static/js/host.js:25 network/static/js/switch-port.js:19
#: static_collected/admin/js/SelectFilter2.js:69
#: static_collected/js/host.js:25 static_collected/js/switch-port.js:19
msgid "Remove" msgid "Remove"
msgstr "Eltávolítás" msgstr "Eltávolítás"
#: network/static/js/switch-port.js:8 #: network/static/js/switch-port.js:8 static_collected/js/switch-port.js:8
msgid "Are you sure you want to delete this device?" msgid "Are you sure you want to delete this device?"
msgstr "Biztosan törli ezt az eszközt?" msgstr "Biztosan törli ezt az eszközt?"
#: static_collected/admin/js/SelectFilter2.js:45
#, c-format
msgid "Available %s"
msgstr ""
#: static_collected/admin/js/SelectFilter2.js:46
#, c-format
msgid ""
"This is the list of available %s. You may choose some by selecting them in "
"the box below and then clicking the \"Choose\" arrow between the two boxes."
msgstr ""
#: static_collected/admin/js/SelectFilter2.js:53
#, c-format
msgid "Type into this box to filter down the list of available %s."
msgstr ""
#: static_collected/admin/js/SelectFilter2.js:57
msgid "Filter"
msgstr ""
#: static_collected/admin/js/SelectFilter2.js:61
msgid "Choose all"