diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 495709268..f3e9c3ad1 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -57,13 +57,13 @@ class ConnectedEndpointSerializer(ValidatedModelSerializer): # Regions/sites # -class RegionSerializer(serializers.ModelSerializer): +class RegionSerializer(CustomFieldModelSerializer): parent = NestedRegionSerializer(required=False, allow_null=True) site_count = serializers.IntegerField(read_only=True) class Meta: model = Region - fields = ['id', 'name', 'slug', 'parent', 'site_count'] + fields = ['id', 'name', 'slug', 'parent', 'site_count', 'custom_fields'] class SiteSerializer(TaggitSerializer, CustomFieldModelSerializer): diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 12774e4be..a1ecc95b3 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -97,7 +97,7 @@ class CableTraceMixin(object): # Regions # -class RegionViewSet(ModelViewSet): +class RegionViewSet(CustomFieldModelViewSet): queryset = Region.objects.annotate( site_count=Count('sites') ) diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index c1274e3d5..09d112edd 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -21,7 +21,7 @@ from .models import ( ) -class RegionFilter(NameSlugSearchFilterSet): +class RegionFilter(NameSlugSearchFilterSet, CustomFieldFilterSet): parent_id = django_filters.ModelMultipleChoiceFilter( queryset=Region.objects.all(), label='Parent region (ID)', diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 66c98c022..0b9f53ec5 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -125,7 +125,7 @@ class MACAddressField(forms.Field): # Regions # -class RegionForm(BootstrapMixin, forms.ModelForm): +class RegionForm(BootstrapMixin, CustomFieldForm): slug = SlugField() class Meta: @@ -160,7 +160,7 @@ class RegionCSVForm(forms.ModelForm): } -class RegionFilterForm(BootstrapMixin, forms.Form): +class RegionFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Site q = forms.CharField( required=False, diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 45b241d42..1b08e501d 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -183,7 +183,7 @@ class CableTermination(models.Model): # Regions # -class Region(MPTTModel, ChangeLoggedModel): +class Region(MPTTModel, ChangeLoggedModel, CustomFieldModel): """ Sites can be grouped within geographic Regions. """ @@ -202,6 +202,11 @@ class Region(MPTTModel, ChangeLoggedModel): slug = models.SlugField( unique=True ) + custom_field_values = GenericRelation( + to='extras.CustomFieldValue', + content_type_field='obj_type', + object_id_field='obj_id' + ) csv_headers = ['name', 'slug', 'parent'] diff --git a/netbox/extras/constants.py b/netbox/extras/constants.py index d9439563b..66802d75b 100644 --- a/netbox/extras/constants.py +++ b/netbox/extras/constants.py @@ -6,6 +6,7 @@ CUSTOMFIELD_MODELS = [ 'dcim.devicetype', 'dcim.powerfeed', 'dcim.rack', + 'dcim.region', 'dcim.site', 'ipam.aggregate', 'ipam.ipaddress', @@ -55,6 +56,7 @@ CUSTOMLINK_MODELS = [ 'dcim.powerpanel', 'dcim.powerfeed', 'dcim.rack', + 'dcim.region', 'dcim.site', 'ipam.aggregate', 'ipam.ipaddress',