Parcourir la source

Fixes #117: Improved device import validation

Jeremy Stretch il y a 8 ans
Parent
commit
004f5c448e
2 fichiers modifiés avec 15 ajouts et 8 suppressions
  1. 11 7
      netbox/dcim/forms.py
  2. 4 1
      netbox/dcim/models.py

+ 11 - 7
netbox/dcim/forms.py

@@ -427,7 +427,7 @@ class DeviceFromCSVForm(forms.ModelForm):
         'invalid_choice': 'Invalid site name.',
     })
     rack_name = forms.CharField()
-    face = forms.ChoiceField(choices=[('Front', 'Front'), ('Rear', 'Rear')])
+    face = forms.CharField(required=False)
 
     class Meta:
         model = Device
@@ -446,7 +446,7 @@ class DeviceFromCSVForm(forms.ModelForm):
             try:
                 self.instance.device_type = DeviceType.objects.get(manufacturer=manufacturer, model=model_name)
             except DeviceType.DoesNotExist:
-                self.add_error('model_name', "Invalid device type ({})".format(model_name))
+                self.add_error('model_name', "Invalid device type ({} {})".format(manufacturer, model_name))
 
         # Validate rack
         if site and rack_name:
@@ -457,11 +457,15 @@ class DeviceFromCSVForm(forms.ModelForm):
 
     def clean_face(self):
         face = self.cleaned_data['face']
-        if face.lower() == 'front':
-            return 0
-        if face.lower() == 'rear':
-            return 1
-        raise forms.ValidationError("Invalid rack face ({})".format(face))
+        if face:
+            try:
+                return {
+                    'front': 0,
+                    'rear': 1,
+                }[face.lower()]
+            except KeyError:
+                raise forms.ValidationError('Invalid rack face ({}); must be "front" or "rear".'.format(face))
+        return face
 
 
 class DeviceImportForm(BulkImportForm, BootstrapMixin):

+ 4 - 1
netbox/dcim/models.py

@@ -568,7 +568,10 @@ class Device(CreatedUpdatedModel):
             raise ValidationError("Must specify rack face with rack position.")
 
         # Validate rack space
-        rack_face = self.face if not self.device_type.is_full_depth else None
+        try:
+            rack_face = self.face if not self.device_type.is_full_depth else None
+        except DeviceType.DoesNotExist:
+            raise ValidationError("Must specify device type.")
         exclude_list = [self.pk] if self.pk else []
         try:
             available_units = self.rack.get_available_units(u_height=self.device_type.u_height, rack_face=rack_face,