diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 244407702..76fae478b 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -272,8 +272,13 @@ class RackImportForm(NetBoxModelImportForm): width = forms.ChoiceField( label=_('Width'), choices=RackWidthChoices, + required=False, help_text=_('Rail-to-rail width (in inches)') ) + u_height = forms.IntegerField( + required=False, + label=_('Height (U)') + ) outer_unit = CSVChoiceField( label=_('Outer unit'), choices=RackDimensionUnitChoices, @@ -297,8 +302,8 @@ class RackImportForm(NetBoxModelImportForm): model = Rack fields = ( 'site', 'location', 'name', 'facility_id', 'tenant', 'status', 'role', 'rack_type', 'form_factor', 'serial', - 'asset_tag', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', - 'airflow', 'weight', 'max_weight', 'weight_unit', 'description', 'comments', 'tags', + 'asset_tag', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', + 'mounting_depth', 'airflow', 'weight', 'max_weight', 'weight_unit', 'description', 'comments', 'tags', ) def __init__(self, data=None, *args, **kwargs): @@ -310,6 +315,16 @@ class RackImportForm(NetBoxModelImportForm): params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) + def clean(self): + super().clean() + + # width & u_height must be set if not specifying a rack type on import + if not self.instance.pk: + if not self.cleaned_data.get('rack_type') and not self.cleaned_data.get('width'): + raise forms.ValidationError(_("Width must be set if not specifying a rack type.")) + if not self.cleaned_data.get('rack_type') and not self.cleaned_data.get('u_height'): + raise forms.ValidationError(_("U height must be set if not specifying a rack type.")) + class RackReservationImportForm(NetBoxModelImportForm): site = CSVModelChoiceField(