mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Fixes #1935: Correct API validation of VLANs assigned to interfaces
This commit is contained in:
@ -731,15 +731,20 @@ class WritableInterfaceSerializer(ValidatedModelSerializer):
|
||||
|
||||
def validate(self, data):
|
||||
|
||||
# Validate that all untagged VLANs either belong to the same site as the Interface's parent Deivce or
|
||||
# VirtualMachine, or are global.
|
||||
parent = self.instance.parent if self.instance else data.get('device') or data.get('virtual_machine')
|
||||
# All associated VLANs be global or assigned to the parent device's site.
|
||||
device = self.instance.device if self.instance else data.get('device')
|
||||
untagged_vlan = data.get('untagged_vlan')
|
||||
if untagged_vlan and untagged_vlan.site not in [device.site, None]:
|
||||
raise serializers.ValidationError({
|
||||
'untagged_vlan': "VLAN {} must belong to the same site as the interface's parent device, or it must be "
|
||||
"global.".format(untagged_vlan)
|
||||
})
|
||||
for vlan in data.get('tagged_vlans', []):
|
||||
if vlan.site not in [parent, None]:
|
||||
raise serializers.ValidationError(
|
||||
"Tagged VLAN {} must belong to the same site as the interface's parent device/VM, or it must be "
|
||||
"global".format(vlan)
|
||||
)
|
||||
if vlan.site not in [device.site, None]:
|
||||
raise serializers.ValidationError({
|
||||
'tagged_vlans': "VLAN {} must belong to the same site as the interface's parent device, or it must "
|
||||
"be global.".format(vlan)
|
||||
})
|
||||
|
||||
return super(WritableInterfaceSerializer, self).validate(data)
|
||||
|
||||
|
@ -55,7 +55,7 @@ class ValidatedModelSerializer(ModelSerializer):
|
||||
model = self.Meta.model
|
||||
# Ignore ManyToManyFields for new instances (a PK is needed for validation)
|
||||
for field in model._meta.get_fields():
|
||||
if isinstance(field, ManyToManyField):
|
||||
if isinstance(field, ManyToManyField) and field.name in attrs:
|
||||
attrs.pop(field.name)
|
||||
instance = self.Meta.model(**attrs)
|
||||
else:
|
||||
|
Reference in New Issue
Block a user