Browse Source

Fixed bug interpreting facility_id as a required field

Jeremy Stretch 8 years ago
parent
commit
be2faaa110
2 changed files with 17 additions and 1 deletions
  1. 16 0
      netbox/dcim/api/serializers.py
  2. 1 1
      netbox/dcim/tests/test_api.py

+ 16 - 0
netbox/dcim/api/serializers.py

@@ -1,4 +1,5 @@
 from rest_framework import serializers
+from rest_framework.validators import UniqueTogetherValidator
 
 from ipam.models import IPAddress
 from dcim.models import (
@@ -157,6 +158,21 @@ class WritableRackSerializer(serializers.ModelSerializer):
             'id', 'name', 'facility_id', 'site', 'group', 'tenant', 'role', 'type', 'width', 'u_height', 'desc_units',
             'comments',
         ]
+        # Omit the UniqueTogetherValidator that would be automatically added to validate facility_id. This prevents
+        # facility_id from being interpreted as a required field.
+        validators = [
+            UniqueTogetherValidator(queryset=Rack.objects.all(), fields=('site', 'name'))
+        ]
+
+    def validate(self, data):
+
+        # Validate uniqueness of facility_id (if set) since we omitted the automatically-created validator from Meta.
+        if data.get('facility_id', None):
+            validator = UniqueTogetherValidator(queryset=Rack.objects.all(), fields=('site', 'facility_id'))
+            validator.set_context(self)
+            validator(data)
+
+        return data
 
 
 #

+ 1 - 1
netbox/dcim/tests/test_api.py

@@ -310,7 +310,7 @@ class RackTest(APITestCase):
         self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000')
         self.rackrole2 = RackRole.objects.create(name='Test Rack Role 2', slug='test-rack-role-2', color='00ff00')
         self.rack1 = Rack.objects.create(
-            site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 1'
+            site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 1',
         )
         self.rack2 = Rack.objects.create(
             site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 2'