Skip to content

Commit e0f8196

Browse files
committed
Fixes #4496: Fix exception when validating certain models via REST API
1 parent 788909d commit e0f8196

File tree

5 files changed

+14
-9
lines changed

5 files changed

+14
-9
lines changed

docs/release-notes/version-2.8.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Bug Fixes
66

77
* [#4489](https://github.com/netbox-community/netbox/issues/4489) - Fix display of parent/child role on device type view
8+
* [#4496](https://github.com/netbox-community/netbox/issues/4496) - Fix exception when validating certain models via REST API
89

910
---
1011

netbox/dcim/api/serializers.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,7 @@ def validate(self, data):
143143
# Validate uniqueness of (group, facility_id) since we omitted the automatically-created validator from Meta.
144144
if data.get('facility_id', None):
145145
validator = UniqueTogetherValidator(queryset=Rack.objects.all(), fields=('group', 'facility_id'))
146-
validator.set_context(self)
147-
validator(data)
146+
validator(data, self)
148147

149148
# Enforce model validation
150149
super().validate(data)
@@ -395,8 +394,7 @@ def validate(self, data):
395394
# Validate uniqueness of (rack, position, face) since we omitted the automatically-created validator from Meta.
396395
if data.get('rack') and data.get('position') and data.get('face'):
397396
validator = UniqueTogetherValidator(queryset=Device.objects.all(), fields=('rack', 'position', 'face'))
398-
validator.set_context(self)
399-
validator(data)
397+
validator(data, self)
400398

401399
# Enforce model validation
402400
super().validate(data)

netbox/dcim/tests/test_api.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ def test_create_rack(self):
582582

583583
data = {
584584
'name': 'Test Rack 4',
585+
'facility_id': '1234',
585586
'site': self.site1.pk,
586587
'group': self.rackgroup1.pk,
587588
'role': self.rackrole1.pk,
@@ -1815,6 +1816,7 @@ def setUp(self):
18151816

18161817
self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
18171818
self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
1819+
self.rack1 = Rack.objects.create(name='Test Rack 1', site=self.site1, u_height=48)
18181820
manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
18191821
self.devicetype1 = DeviceType.objects.create(
18201822
manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
@@ -1920,6 +1922,9 @@ def test_create_device(self):
19201922
'device_role': self.devicerole1.pk,
19211923
'name': 'Test Device 4',
19221924
'site': self.site1.pk,
1925+
'rack': self.rack1.pk,
1926+
'face': DeviceFaceChoices.FACE_FRONT,
1927+
'position': 1,
19231928
'cluster': self.cluster1.pk,
19241929
}
19251930

netbox/ipam/api/serializers.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,7 @@ def validate(self, data):
9090
if data.get('site', None):
9191
for field in ['name', 'slug']:
9292
validator = UniqueTogetherValidator(queryset=VLANGroup.objects.all(), fields=('site', field))
93-
validator.set_context(self)
94-
validator(data)
93+
validator(data, self)
9594

9695
# Enforce model validation
9796
super().validate(data)
@@ -122,8 +121,7 @@ def validate(self, data):
122121
if data.get('group', None):
123122
for field in ['vid', 'name']:
124123
validator = UniqueTogetherValidator(queryset=VLAN.objects.all(), fields=('group', field))
125-
validator.set_context(self)
126-
validator(data)
124+
validator(data, self)
127125

128126
# Enforce model validation
129127
super().validate(data)

netbox/ipam/tests/test_api.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,7 @@ def setUp(self):
785785

786786
super().setUp()
787787

788+
self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
788789
self.vlangroup1 = VLANGroup.objects.create(name='Test VLAN Group 1', slug='test-vlan-group-1')
789790
self.vlangroup2 = VLANGroup.objects.create(name='Test VLAN Group 2', slug='test-vlan-group-2')
790791
self.vlangroup3 = VLANGroup.objects.create(name='Test VLAN Group 3', slug='test-vlan-group-3')
@@ -818,6 +819,7 @@ def test_create_vlangroup(self):
818819
data = {
819820
'name': 'Test VLAN Group 4',
820821
'slug': 'test-vlan-group-4',
822+
'site': self.site1.pk,
821823
}
822824

823825
url = reverse('ipam-api:vlangroup-list')
@@ -886,10 +888,10 @@ def setUp(self):
886888

887889
super().setUp()
888890

891+
self.group1 = VLANGroup.objects.create(name='Test VLAN Group 1', slug='test-vlan-group-1')
889892
self.vlan1 = VLAN.objects.create(vid=1, name='Test VLAN 1')
890893
self.vlan2 = VLAN.objects.create(vid=2, name='Test VLAN 2')
891894
self.vlan3 = VLAN.objects.create(vid=3, name='Test VLAN 3')
892-
893895
self.prefix1 = Prefix.objects.create(prefix=IPNetwork('192.168.1.0/24'))
894896

895897
def test_get_vlan(self):
@@ -921,6 +923,7 @@ def test_create_vlan(self):
921923
data = {
922924
'vid': 4,
923925
'name': 'Test VLAN 4',
926+
'group': self.group1.pk,
924927
}
925928

926929
url = reverse('ipam-api:vlan-list')

0 commit comments

Comments
 (0)