diff --git a/blazar_dashboard/content/leases/forms.py b/blazar_dashboard/content/leases/forms.py index 801db80..f57c7da 100644 --- a/blazar_dashboard/content/leases/forms.py +++ b/blazar_dashboard/content/leases/forms.py @@ -236,6 +236,21 @@ class UpdateForm(forms.SelfHandlingForm): widget=forms.TextInput( attrs={'placeholder': _('Valid suffix are d/h/m (e.g. +1h)')}), required=False) + reservations = forms.CharField( + label=_("Reservation values to update"), + help_text=_('Enter reservation values to update as JSON'), + widget=forms.Textarea( + attrs={'rows': 8, + 'placeholder': + 'e.g.\n' + '[\n' + ' {\n' + ' "id": "087bc740-6d2d-410b-9d47-c7b2b55a9d36",\n' + ' "max": 3\n' + ' }\n' + ']'}), + max_length=511, + required=False) def __init__(self, request, *args, **kwargs): super(UpdateForm, self).__init__(request, *args, **kwargs) @@ -247,6 +262,7 @@ class UpdateForm(forms.SelfHandlingForm): # reservation gets to support update of the start/end_time. del self.fields['start_time'] del self.fields['end_time'] + del self.fields['reservations'] return def handle(self, request, data): @@ -271,6 +287,10 @@ class UpdateForm(forms.SelfHandlingForm): elif end_time[0] == '-': fields['reduce_by'] = end_time[1:] + reservations = data.get('reservations', None) + if reservations: + fields['reservations'] = reservations + try: api.client.lease_update(self.request, lease_id=lease_id, **fields) messages.success(request, _("Lease update started.")) @@ -287,6 +307,7 @@ class UpdateForm(forms.SelfHandlingForm): lease_name = cleaned_data.get("lease_name", None) start_time = cleaned_data.get("start_time", None) end_time = cleaned_data.get("end_time", None) + reservations = cleaned_data.get("reservations", None) if start_time: valid = re.match('^[+-]\d+[dhm]$', start_time) @@ -302,5 +323,14 @@ class UpdateForm(forms.SelfHandlingForm): "a form of +/- number d/h/m. " "(e.g. +1h)") - if not (lease_name or start_time or end_time): + if reservations: + try: + reservations = eval(reservations) + cleaned_data['reservations'] = reservations + except (SyntaxError, NameError): + raise forms.ValidationError( + _('Reservation values must written in JSON') + ) + + if not (lease_name or start_time or end_time or reservations): raise forms.ValidationError("Nothing to update.") diff --git a/blazar_dashboard/content/leases/tests.py b/blazar_dashboard/content/leases/tests.py index d58663d..ee42f66 100644 --- a/blazar_dashboard/content/leases/tests.py +++ b/blazar_dashboard/content/leases/tests.py @@ -204,7 +204,7 @@ class LeasesTests(test.TestCase): self.assertContains(res, 'An error occurred while creating') @test.create_stubs({api.client: ('lease_get', 'lease_update')}) - def test_update_lease(self): + def test_update_lease_name_and_date(self): lease = self.leases.get(name='lease-1') api.client.lease_get( IsA(http.HttpRequest), @@ -229,6 +229,32 @@ class LeasesTests(test.TestCase): self.assertMessageCount(success=1) self.assertRedirectsNoFollow(res, INDEX_URL) + @test.create_stubs({api.client: ('lease_get', 'lease_update')}) + def test_update_lease_reservations(self): + lease = self.leases.get(name='lease-1') + api.client.lease_get( + IsA(http.HttpRequest), + lease['id'] + ).AndReturn(lease) + api.client.lease_update( + IsA(http.HttpRequest), + lease_id=lease['id'], + reservations=[{"id": "087bc740-6d2d-410b-9d47-c7b2b55a9d36", + "max": 3}] + ) + form_data = { + 'lease_id': lease['id'], + 'reservations': '[{"id": "087bc740-6d2d-410b-9d47-c7b2b55a9d36",' + ' "max": 3}]' + } + self.mox.ReplayAll() + + res = self.client.post(reverse(UPDATE_URL_BASE, args=[lease['id']]), + form_data) + self.assertNoFormErrors(res) + self.assertMessageCount(success=1) + self.assertRedirectsNoFollow(res, INDEX_URL) + @test.create_stubs({api.client: ('lease_get', 'lease_update')}) def test_update_lease_error(self): lease = self.leases.get(name='lease-1')