From 747a3933865d59232445c7cff12ea883a8fbce96 Mon Sep 17 00:00:00 2001 From: Arnoud Vermeer Date: Wed, 10 Jan 2018 11:05:11 +0100 Subject: [PATCH] Add custom fields to VLANGroup --- netbox/extras/constants.py | 13 +++++++------ netbox/ipam/api/serializers.py | 8 ++++---- netbox/ipam/api/views.py | 2 +- netbox/ipam/filters.py | 2 +- netbox/ipam/forms.py | 5 +++-- netbox/ipam/models.py | 3 ++- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/netbox/extras/constants.py b/netbox/extras/constants.py index 808413ba2..3ef3272d6 100644 --- a/netbox/extras/constants.py +++ b/netbox/extras/constants.py @@ -3,11 +3,12 @@ from __future__ import unicode_literals # Models which support custom fields CUSTOMFIELD_MODELS = ( - 'provider', 'circuit', # Circuits - 'site', 'rack', 'devicetype', 'device', # DCIM - 'aggregate', 'prefix', 'ipaddress', 'vlan', 'vrf', # IPAM - 'tenant', # Tenancy - 'cluster', 'virtualmachine', # Virtualization + 'provider', 'circuit', # Circuits + 'site', 'rack', 'devicetype', 'device', # DCIM + 'aggregate', 'prefix', 'ipaddress', 'vlan', # IPAM + 'vlangroup', 'vrf', # IPAM + 'tenant', # Tenancy + 'cluster', 'virtualmachine', # Virtualization ) # Custom field types @@ -41,7 +42,7 @@ EXPORTTEMPLATE_MODELS = [ 'provider', 'circuit', # Circuits 'site', 'region', 'rack', 'rackgroup', 'manufacturer', 'devicetype', 'device', # DCIM 'consoleport', 'powerport', 'interfaceconnection', # DCIM - 'aggregate', 'prefix', 'ipaddress', 'vlan', # IPAM + 'aggregate', 'prefix', 'ipaddress', 'vlan', 'vlangroup', # IPAM 'tenant', # Tenancy 'cluster', 'virtualmachine', # Virtualization ] diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index e4e14e4e4..82fd3a3d9 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -112,12 +112,12 @@ class WritableAggregateSerializer(CustomFieldModelSerializer): # VLAN groups # -class VLANGroupSerializer(serializers.ModelSerializer): +class VLANGroupSerializer(CustomFieldModelSerializer): site = NestedSiteSerializer() class Meta: model = VLANGroup - fields = ['id', 'name', 'slug', 'site'] + fields = ['id', 'name', 'slug', 'site', 'custom_fields'] class NestedVLANGroupSerializer(serializers.ModelSerializer): @@ -128,11 +128,11 @@ class NestedVLANGroupSerializer(serializers.ModelSerializer): fields = ['id', 'url', 'name', 'slug'] -class WritableVLANGroupSerializer(serializers.ModelSerializer): +class WritableVLANGroupSerializer(CustomFieldModelSerializer): class Meta: model = VLANGroup - fields = ['id', 'name', 'slug', 'site'] + fields = ['id', 'name', 'slug', 'site', 'custom_fields'] validators = [] def validate(self, data): diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 649e74069..80d00e815 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -161,7 +161,7 @@ class IPAddressViewSet(WritableSerializerMixin, CustomFieldModelViewSet): # VLAN groups # -class VLANGroupViewSet(WritableSerializerMixin, ModelViewSet): +class VLANGroupViewSet(WritableSerializerMixin, CustomFieldModelViewSet): queryset = VLANGroup.objects.select_related('site') serializer_class = serializers.VLANGroupSerializer write_serializer_class = serializers.WritableVLANGroupSerializer diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index 802acafc9..b600ab5e4 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -325,7 +325,7 @@ class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet): return queryset.filter(address__net_mask_length=value) -class VLANGroupFilter(django_filters.FilterSet): +class VLANGroupFilter(CustomFieldFilterSet, django_filters.FilterSet): site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label='Site (ID)', diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index a5b0a7e3c..b44446e4b 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -734,7 +734,7 @@ class IPAddressFilterForm(BootstrapMixin, CustomFieldFilterForm): # VLAN groups # -class VLANGroupForm(BootstrapMixin, forms.ModelForm): +class VLANGroupForm(BootstrapMixin, CustomFieldForm): slug = SlugField() class Meta: @@ -762,7 +762,8 @@ class VLANGroupCSVForm(forms.ModelForm): } -class VLANGroupFilterForm(BootstrapMixin, forms.Form): +class VLANGroupFilterForm(BootstrapMixin, CustomFieldFilterForm): + model = VLANGroup site = FilterChoiceField( queryset=Site.objects.annotate(filter_count=Count('vlan_groups')), to_field_name='slug', diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index bdaec4fd8..84e1f2705 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -486,13 +486,14 @@ class IPAddress(CreatedUpdatedModel, CustomFieldModel): @python_2_unicode_compatible -class VLANGroup(models.Model): +class VLANGroup(models.Model, CustomFieldModel): """ A VLAN group is an arbitrary collection of VLANs within which VLAN IDs and names must be unique. """ name = models.CharField(max_length=50) slug = models.SlugField() site = models.ForeignKey('dcim.Site', related_name='vlan_groups', on_delete=models.PROTECT, blank=True, null=True) + custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id') class Meta: ordering = ['site', 'name']