Skip to content

Commit 4d40699

Browse files
committed
Fixes #15995: Permit nullable fields referenced by unique constraints to be omitted from REST API requests
1 parent ccf3224 commit 4d40699

File tree

8 files changed

+13
-12
lines changed

8 files changed

+13
-12
lines changed

netbox/circuits/api/serializers_/circuits.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class Meta:
4848
class CircuitSerializer(NetBoxModelSerializer):
4949
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail')
5050
provider = ProviderSerializer(nested=True)
51-
provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True)
51+
provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None)
5252
status = ChoiceField(choices=CircuitStatusChoices, required=False)
5353
type = CircuitTypeSerializer(nested=True)
5454
tenant = TenantSerializer(nested=True, required=False, allow_null=True)

netbox/circuits/api/serializers_/providers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class Meta:
4545
class ProviderAccountSerializer(NetBoxModelSerializer):
4646
url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail')
4747
provider = ProviderSerializer(nested=True)
48+
name = serializers.CharField(allow_blank=True, max_length=100, required=False, default='')
4849

4950
class Meta:
5051
model = ProviderAccount

netbox/circuits/tests/test_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def setUpTestData(cls):
141141
{
142142
'cid': 'Circuit 6',
143143
'provider': providers[1].pk,
144-
'provider_account': provider_accounts[1].pk,
144+
# Omit provider account to test uniqueness constraint
145145
'type': circuit_types[1].pk,
146146
},
147147
]
@@ -237,7 +237,7 @@ def setUpTestData(cls):
237237
'account': '5678',
238238
},
239239
{
240-
'name': 'Provider Account 6',
240+
# Omit name to test uniqueness constraint
241241
'provider': providers[0].pk,
242242
'account': '6789',
243243
},

netbox/dcim/api/serializers_/devices.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ def get_config_context(self, obj):
122122
class VirtualDeviceContextSerializer(NetBoxModelSerializer):
123123
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail')
124124
device = DeviceSerializer(nested=True)
125+
identifier = serializers.IntegerField(allow_null=True, max_value=32767, min_value=0, required=False, default=None)
125126
tenant = TenantSerializer(nested=True, required=False, allow_null=True, default=None)
126127
primary_ip = IPAddressSerializer(nested=True, read_only=True, allow_null=True)
127128
primary_ip4 = IPAddressSerializer(nested=True, required=False, allow_null=True)

netbox/dcim/api/serializers_/sites.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class Meta:
8383
class LocationSerializer(NestedGroupModelSerializer):
8484
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail')
8585
site = SiteSerializer(nested=True)
86-
parent = NestedLocationSerializer(required=False, allow_null=True)
86+
parent = NestedLocationSerializer(required=False, allow_null=True, default=None)
8787
status = ChoiceField(choices=LocationStatusChoices, required=False)
8888
tenant = TenantSerializer(nested=True, required=False, allow_null=True)
8989
rack_count = serializers.IntegerField(read_only=True)

netbox/dcim/tests/test_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def setUpTestData(cls):
230230
'name': 'Test Location 6',
231231
'slug': 'test-location-6',
232232
'site': sites[1].pk,
233-
'parent': parent_locations[1].pk,
233+
# Omit parent to test uniqueness constraint
234234
'status': LocationStatusChoices.STATUS_PLANNED,
235235
},
236236
]
@@ -2307,6 +2307,6 @@ def setUpTestData(cls):
23072307
'device': devices[1].pk,
23082308
'status': 'active',
23092309
'name': 'VDC 3',
2310-
'identifier': 3,
2310+
# Omit identifier to test uniqueness constraint
23112311
},
23122312
]

netbox/tenancy/api/serializers_/tenants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class Meta:
2727

2828
class TenantSerializer(NetBoxModelSerializer):
2929
url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:tenant-detail')
30-
group = TenantGroupSerializer(nested=True, required=False, allow_null=True)
30+
group = TenantGroupSerializer(nested=True, required=False, allow_null=True, default=None)
3131

3232
# Related object counts
3333
circuit_count = RelatedObjectCountField('circuits')

netbox/virtualization/api/serializers_/virtualmachines.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131
class VirtualMachineSerializer(NetBoxModelSerializer):
3232
url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail')
3333
status = ChoiceField(choices=VirtualMachineStatusChoices, required=False)
34-
site = SiteSerializer(nested=True, required=False, allow_null=True)
35-
cluster = ClusterSerializer(nested=True, required=False, allow_null=True)
36-
device = DeviceSerializer(nested=True, required=False, allow_null=True)
34+
site = SiteSerializer(nested=True, required=False, allow_null=True, default=None)
35+
cluster = ClusterSerializer(nested=True, required=False, allow_null=True, default=None)
36+
device = DeviceSerializer(nested=True, required=False, allow_null=True, default=None)
3737
role = DeviceRoleSerializer(nested=True, required=False, allow_null=True)
38-
tenant = TenantSerializer(nested=True, required=False, allow_null=True)
38+
tenant = TenantSerializer(nested=True, required=False, allow_null=True, default=None)
3939
platform = PlatformSerializer(nested=True, required=False, allow_null=True)
4040
primary_ip = IPAddressSerializer(nested=True, read_only=True, allow_null=True)
4141
primary_ip4 = IPAddressSerializer(nested=True, required=False, allow_null=True)
@@ -55,7 +55,6 @@ class Meta:
5555
'interface_count', 'virtual_disk_count',
5656
]
5757
brief_fields = ('id', 'url', 'display', 'name', 'description')
58-
validators = []
5958

6059

6160
class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer):

0 commit comments

Comments
 (0)