diff --git a/netbox/extras/admin.py b/netbox/extras/admin.py index 7d70e3c08..26d9c06e6 100644 --- a/netbox/extras/admin.py +++ b/netbox/extras/admin.py @@ -1,6 +1,21 @@ +from django import forms from django.contrib import admin -from .models import CustomField, CustomFieldValue, CustomFieldChoice, Graph, ExportTemplate, TopologyMap, UserAction +from .models import CustomField, CustomFieldChoice, Graph, ExportTemplate, TopologyMap, UserAction + + +class CustomFieldForm(forms.ModelForm): + + class Meta: + model = CustomField + exclude = [] + + def __init__(self, *args, **kwargs): + super(CustomFieldForm, self).__init__(*args, **kwargs) + + # Organize the available ContentTypes + queryset = self.fields['obj_type'].queryset.order_by('app_label', 'model') + self.fields['obj_type'].choices = [(ct.pk, '{} > {}'.format(ct.app_label, ct.name)) for ct in queryset] class CustomFieldChoiceAdmin(admin.TabularInline): @@ -11,6 +26,7 @@ class CustomFieldChoiceAdmin(admin.TabularInline): class CustomFieldAdmin(admin.ModelAdmin): inlines = [CustomFieldChoiceAdmin] list_display = ['name', 'models', 'type', 'required', 'default', 'description'] + form = CustomFieldForm def models(self, obj): return ', '.join([ct.name for ct in obj.obj_type.all()]) diff --git a/netbox/extras/forms.py b/netbox/extras/forms.py index e3126722b..f3e83ecb1 100644 --- a/netbox/extras/forms.py +++ b/netbox/extras/forms.py @@ -43,7 +43,7 @@ class CustomFieldForm(forms.ModelForm): field = forms.CharField(max_length=100, required=cf.required, initial=cf.default) field.model = cf - field.label = cf.label if cf.label else cf.name + field.label = cf.label if cf.label else cf.name.capitalize() field.help_text = cf.description self.fields[field_name] = field self.custom_fields.append(field_name) diff --git a/netbox/extras/models.py b/netbox/extras/models.py index ba51ac58b..ccfa3f626 100644 --- a/netbox/extras/models.py +++ b/netbox/extras/models.py @@ -8,7 +8,6 @@ from django.template import Template, Context from django.utils.safestring import mark_safe -# NOTE: Any model added here MUST have a GenericRelation defined for CustomField CUSTOMFIELD_MODELS = ( 'site', 'rack', 'device', # DCIM 'aggregate', 'prefix', 'ipaddress', 'vlan', 'vrf', # IPAM diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index a2dd6c313..f177fe433 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -111,6 +111,7 @@ class VRFEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'ipam.change_vrf' model = VRF form_class = forms.VRFForm + template_name = 'ipam/vrf_edit.html' cancel_url = 'ipam:vrf_list' @@ -235,6 +236,7 @@ class AggregateEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'ipam.change_aggregate' model = Aggregate form_class = forms.AggregateForm + template_name = 'ipam/aggregate_edit.html' cancel_url = 'ipam:aggregate_list' @@ -373,6 +375,7 @@ class PrefixEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'ipam.change_prefix' model = Prefix form_class = forms.PrefixForm + template_name = 'ipam/prefix_edit.html' fields_initial = ['vrf', 'tenant', 'site', 'prefix', 'vlan'] cancel_url = 'ipam:prefix_list' @@ -601,6 +604,7 @@ class VLANEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'ipam.change_vlan' model = VLAN form_class = forms.VLANForm + template_name = 'ipam/vlan_edit.html' cancel_url = 'ipam:vlan_list' diff --git a/netbox/templates/ipam/aggregate_edit.html b/netbox/templates/ipam/aggregate_edit.html new file mode 100644 index 000000000..be499a509 --- /dev/null +++ b/netbox/templates/ipam/aggregate_edit.html @@ -0,0 +1,22 @@ +{% extends 'utilities/obj_edit.html' %} +{% load form_helpers %} + +{% block form %} +