From 2d767b619cf3879dea6ae22441dcac5e3c44cf11 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Thu, 31 Oct 2024 21:23:22 -0400 Subject: [PATCH] Fix bulk edit/create tests (bulk editing Interfaces will be unsupported because of inheritance from ComponentBulkEditForm) --- netbox/dcim/api/serializers_/device_components.py | 7 ++++++- netbox/dcim/forms/bulk_edit.py | 5 +++++ netbox/dcim/forms/model_forms.py | 11 +++++++++-- netbox/dcim/tests/test_views.py | 2 +- .../api/serializers_/virtualmachines.py | 7 +++++-- netbox/virtualization/forms/bulk_edit.py | 5 +++++ 6 files changed, 31 insertions(+), 6 deletions(-) diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index 2c26709bd..0ed6b47ff 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -218,7 +218,12 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect ) count_ipaddresses = serializers.IntegerField(read_only=True) count_fhrp_groups = serializers.IntegerField(read_only=True) - mac_address = MACAddressSerializer(read_only=True, allow_null=True) + mac_address = serializers.CharField( + required=False, + default=None, + allow_blank=True, + allow_null=True + ) wwn = serializers.CharField(required=False, default=None, allow_blank=True, allow_null=True) class Meta: diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 98f491ba7..e0d7c05f2 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -1521,6 +1521,11 @@ class InterfaceBulkEditForm( 'group_id': '$wireless_lan_group', } ) + mac_address = forms.CharField( + empty_value=None, + required=False, + label=_('MAC Address') + ) model = Interface fieldsets = ( diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 4545d3fde..5baa23787 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -1539,11 +1539,18 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): } def clean_mac_address(self): - return MACAddress.objects.create(mac_address=self.cleaned_data['mac_address']) + if self.cleaned_data['mac_address'] and ( + not self.instance.pk or + not MACAddress.objects.filter(mac_address=self.cleaned_data['mac_address'], interface=self.instance).exists() + ): + mac_address = MACAddress.objects.create(mac_address=self.cleaned_data['mac_address']) + return mac_address + return None def save(self, commit=True): result = super().save(commit=commit) - self.instance.mac_addresses.add(self.cleaned_data['mac_address']) + if self.cleaned_data['mac_address']: + self.instance.mac_addresses.add(self.cleaned_data['mac_address']) return result diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index dc3e74ae1..e7f8601dd 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -2554,7 +2554,7 @@ class InterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'type': InterfaceTypeChoices.TYPE_1GE_FIXED, 'enabled': True, 'lag': interfaces[3].pk, - 'mac_address': EUI('01:02:03:04:05:06'), + # 'mac_address': EUI('01:02:03:04:05:06'), 'wwn': EUI('01:02:03:04:05:06:07:08', version=64), 'mtu': 2000, 'speed': 1000000, diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index 8f05b96d2..2c00cac96 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -2,7 +2,6 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from dcim.api.serializers_.devices import DeviceSerializer -from dcim.api.serializers_.device_components import MACAddressSerializer from dcim.api.serializers_.platforms import PlatformSerializer from dcim.api.serializers_.roles import DeviceRoleSerializer from dcim.api.serializers_.sites import SiteSerializer @@ -95,7 +94,11 @@ class VMInterfaceSerializer(NetBoxModelSerializer): l2vpn_termination = L2VPNTerminationSerializer(nested=True, read_only=True, allow_null=True) count_ipaddresses = serializers.IntegerField(read_only=True) count_fhrp_groups = serializers.IntegerField(read_only=True) - mac_address = MACAddressSerializer(read_only=True, allow_null=True) + mac_address = serializers.CharField( + required=False, + default=None, + allow_null=True + ) class Meta: model = VMInterface diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 2bd3434ac..634d09d59 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -260,6 +260,11 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): required=False, label=_('VRF') ) + mac_address = forms.CharField( + empty_value=None, + required=False, + label=_('MAC Address') + ) model = VMInterface fieldsets = (