diff --git a/circle/dashboard/forms.py b/circle/dashboard/forms.py index 2e4ca73..d26f67b 100644 --- a/circle/dashboard/forms.py +++ b/circle/dashboard/forms.py @@ -18,6 +18,7 @@ from __future__ import absolute_import from datetime import timedelta +from urlparse import urlparse from django.contrib.auth.forms import ( AuthenticationForm, PasswordResetForm, SetPasswordForm, @@ -79,6 +80,12 @@ class VmSaveForm(forms.Form): helper.form_tag = False return helper + def __init__(self, *args, **kwargs): + default = kwargs.pop('default', None) + super(VmSaveForm, self).__init__(*args, **kwargs) + if default: + self.fields['name'].initial = default + class VmCustomizeForm(forms.Form): name = forms.CharField(widget=forms.TextInput(attrs={ @@ -788,6 +795,12 @@ class VmCreateDiskForm(forms.Form): help_text=_('Size of disk to create in bytes or with units ' 'like MB or GB.')) + def __init__(self, *args, **kwargs): + default = kwargs.pop('default', None) + super(VmCreateDiskForm, self).__init__(*args, **kwargs) + if default: + self.fields['name'].initial = default + def clean_size(self): size_in_bytes = self.cleaned_data.get("size") if not size_in_bytes.isdigit() and len(size_in_bytes) > 0: @@ -845,7 +858,7 @@ class VmDiskResizeForm(forms.Form): class VmDownloadDiskForm(forms.Form): - name = forms.CharField(max_length=100, label=_("Name")) + name = forms.CharField(max_length=100, label=_("Name"), required=False) url = forms.CharField(label=_('URL'), validators=[URLValidator(), ]) @property @@ -854,6 +867,18 @@ class VmDownloadDiskForm(forms.Form): helper.form_tag = False return helper + def clean(self): + cleaned_data = super(VmDownloadDiskForm, self).clean() + if not cleaned_data['name']: + if cleaned_data['url']: + cleaned_data['name'] = urlparse( + cleaned_data['url']).path.split('/')[-1] + if not cleaned_data['name']: + raise forms.ValidationError( + _("Could not find filename in URL, " + "please specify a name explicitly.")) + return cleaned_data + class VmAddInterfaceForm(forms.Form): def __init__(self, *args, **kwargs): diff --git a/circle/dashboard/tests/test_mockedviews.py b/circle/dashboard/tests/test_mockedviews.py index 4a28660..2180ac8 100644 --- a/circle/dashboard/tests/test_mockedviews.py +++ b/circle/dashboard/tests/test_mockedviews.py @@ -219,6 +219,7 @@ class VmOperationViewTestCase(unittest.TestCase): with patch.object(view, 'get_object') as go, \ patch('dashboard.views.util.messages') as msg: inst = MagicMock(spec=Instance) + inst.name = "asd" inst._meta.object_name = "Instance" inst.save_as_template = Instance._ops['save_as_template'](inst) inst.save_as_template.async = MagicMock() @@ -235,6 +236,7 @@ class VmOperationViewTestCase(unittest.TestCase): with patch.object(view, 'get_object') as go, \ patch('dashboard.views.util.messages') as msg: inst = MagicMock(spec=Instance) + inst.name = "asd" inst._meta.object_name = "Instance" inst.save_as_template = Instance._ops['save_as_template'](inst) inst.save_as_template.async = MagicMock() diff --git a/circle/dashboard/views/vm.py b/circle/dashboard/views/vm.py index a61f7fc..95ba934 100644 --- a/circle/dashboard/views/vm.py +++ b/circle/dashboard/views/vm.py @@ -403,6 +403,13 @@ class VmCreateDiskView(FormOperationMixin, VmOperationView): effect = "success" is_disk_operation = True + def get_form_kwargs(self): + op = self.get_op() + val = super(VmCreateDiskView, self).get_form_kwargs() + num = op.instance.disks.count() + 1 + val['default'] = "%s %d" % (op.instance.name, num) + return val + class VmDownloadDiskView(FormOperationMixin, VmOperationView): @@ -453,6 +460,12 @@ class VmSaveView(FormOperationMixin, VmOperationView): effect = 'info' form_class = VmSaveForm + def get_form_kwargs(self): + op = self.get_op() + val = super(VmSaveView, self).get_form_kwargs() + val['default'] = op._rename(op.instance.name) + return val + class VmResourcesChangeView(VmOperationView): op = 'resources_change'