|
|
@@ -829,6 +829,64 @@ class RackReservationForm(BootstrapMixin, TenancyForm, forms.ModelForm):
|
|
|
return unit_choices
|
|
|
|
|
|
|
|
|
+class RackReservationCSVForm(forms.ModelForm):
|
|
|
+ site = forms.ModelChoiceField(
|
|
|
+ queryset=Site.objects.all(),
|
|
|
+ to_field_name='name',
|
|
|
+ help_text='Name of parent site',
|
|
|
+ error_messages={
|
|
|
+ 'invalid_choice': 'Invalid site name.',
|
|
|
+ }
|
|
|
+ )
|
|
|
+ rack_group = forms.CharField(
|
|
|
+ required=False,
|
|
|
+ help_text="Rack's group (if any)"
|
|
|
+ )
|
|
|
+ rack_name = forms.CharField(
|
|
|
+ help_text="Rack name"
|
|
|
+ )
|
|
|
+ units = SimpleArrayField(
|
|
|
+ base_field=forms.IntegerField(),
|
|
|
+ required=True,
|
|
|
+ help_text='Comma-separated list of individual unit numbers'
|
|
|
+ )
|
|
|
+ tenant = forms.ModelChoiceField(
|
|
|
+ queryset=Tenant.objects.all(),
|
|
|
+ required=False,
|
|
|
+ to_field_name='name',
|
|
|
+ help_text='Name of assigned tenant',
|
|
|
+ error_messages={
|
|
|
+ 'invalid_choice': 'Tenant not found.',
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ class Meta:
|
|
|
+ model = RackReservation
|
|
|
+ fields = ('site', 'rack_group', 'rack_name', 'units', 'tenant', 'description')
|
|
|
+ help_texts = {
|
|
|
+ }
|
|
|
+
|
|
|
+ def clean(self):
|
|
|
+
|
|
|
+ super().clean()
|
|
|
+
|
|
|
+ site = self.cleaned_data.get('site')
|
|
|
+ rack_group = self.cleaned_data.get('rack_group')
|
|
|
+ rack_name = self.cleaned_data.get('rack_name')
|
|
|
+
|
|
|
+ # Validate rack
|
|
|
+ if site and rack_group and rack_name:
|
|
|
+ try:
|
|
|
+ self.instance.rack = Rack.objects.get(site=site, group__name=rack_group, name=rack_name)
|
|
|
+ except Rack.DoesNotExist:
|
|
|
+ raise forms.ValidationError("Rack {} not found in site {} group {}".format(rack_name, site, rack_group))
|
|
|
+ elif site and rack_name:
|
|
|
+ try:
|
|
|
+ self.instance.rack = Rack.objects.get(site=site, group__isnull=True, name=rack_name)
|
|
|
+ except Rack.DoesNotExist:
|
|
|
+ raise forms.ValidationError("Rack {} not found in site {} (no group)".format(rack_name, site))
|
|
|
+
|
|
|
+
|
|
|
class RackReservationBulkEditForm(BootstrapMixin, BulkEditForm):
|
|
|
pk = forms.ModelMultipleChoiceField(
|
|
|
queryset=RackReservation.objects.all(),
|