From a831e525da52922f26ab311d8ac10c67a8a56b55 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 11 Aug 2020 17:19:40 -0400 Subject: [PATCH] Remove value_field from APISelect; reference to_field_name on field --- netbox/circuits/forms.py | 22 +++---------- netbox/dcim/forms.py | 54 ++++--------------------------- netbox/extras/forms.py | 40 +++++------------------ netbox/ipam/forms.py | 13 +------- netbox/secrets/forms.py | 5 +-- netbox/tenancy/forms.py | 3 -- netbox/utilities/forms/fields.py | 11 +++++-- netbox/utilities/forms/widgets.py | 4 --- netbox/virtualization/forms.py | 14 +------- 9 files changed, 30 insertions(+), 136 deletions(-) diff --git a/netbox/circuits/forms.py b/netbox/circuits/forms.py index 341a7a9b7..70a220b58 100644 --- a/netbox/circuits/forms.py +++ b/netbox/circuits/forms.py @@ -108,7 +108,6 @@ class ProviderFilterForm(BootstrapMixin, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -117,10 +116,7 @@ class ProviderFilterForm(BootstrapMixin, CustomFieldFilterForm): site = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) asn = forms.IntegerField( required=False, @@ -271,18 +267,12 @@ class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm type = DynamicModelMultipleChoiceField( queryset=CircuitType.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) provider = DynamicModelMultipleChoiceField( queryset=Provider.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) status = forms.MultipleChoiceField( choices=CircuitStatusChoices, @@ -294,7 +284,6 @@ class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -303,10 +292,7 @@ class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm site = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) commit_rate = forms.IntegerField( required=False, diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 49fa1173d..7700545df 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -70,7 +70,6 @@ class DeviceComponentFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field='slug', filter_for={ 'site': 'region' } @@ -81,7 +80,6 @@ class DeviceComponentFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'device_id': 'site', } @@ -348,10 +346,7 @@ class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): region = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) tag = TagFilterField(model) @@ -409,7 +404,6 @@ class RackGroupFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region', 'parent': 'region', @@ -421,7 +415,6 @@ class RackGroupFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'parent': 'site', } @@ -430,11 +423,7 @@ class RackGroupFilterForm(BootstrapMixin, forms.Form): parent = DynamicModelMultipleChoiceField( queryset=RackGroup.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - api_url="/api/dcim/rack-groups/", - value_field="slug", - ) + required=False ) @@ -662,7 +651,6 @@ class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -673,7 +661,6 @@ class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'group_id': 'site' } @@ -699,7 +686,6 @@ class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -861,10 +847,7 @@ class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm): site = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) group_id = DynamicModelMultipleChoiceField( queryset=RackGroup.objects.prefetch_related('site'), @@ -972,10 +955,7 @@ class DeviceTypeFilterForm(BootstrapMixin, CustomFieldFilterForm): manufacturer = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) subdevice_role = forms.MultipleChoiceField( choices=add_blank_choice(SubdeviceRoleChoices), @@ -2116,7 +2096,6 @@ class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilt to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -2127,7 +2106,6 @@ class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilt to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'rack_group_id': 'site', 'rack_id': 'site', @@ -2157,7 +2135,6 @@ class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilt to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", ) ) manufacturer_id = DynamicModelMultipleChoiceField( @@ -2181,7 +2158,6 @@ class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilt to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -3446,10 +3422,7 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): manufacturer = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), to_field_name='slug', - required=False, - widget=APISelect( - value_field="slug", - ) + required=False ) serial = forms.CharField( required=False @@ -3900,7 +3873,6 @@ class CableFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'rack_id': 'site', 'device_id': 'site', @@ -3912,7 +3884,6 @@ class CableFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field='slug', filter_for={ 'device_id': 'tenant', } @@ -3962,7 +3933,6 @@ class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'device_id': 'site', } @@ -3981,7 +3951,6 @@ class PowerConnectionFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'device_id': 'site', } @@ -4000,7 +3969,6 @@ class InterfaceConnectionFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'device_id': 'site', } @@ -4240,7 +4208,6 @@ class VirtualChassisFilterForm(BootstrapMixin, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -4249,17 +4216,13 @@ class VirtualChassisFilterForm(BootstrapMixin, CustomFieldFilterForm): site = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) tenant_group = DynamicModelMultipleChoiceField( queryset=TenantGroup.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, filter_for={ 'tenant': 'group' @@ -4271,7 +4234,6 @@ class VirtualChassisFilterForm(BootstrapMixin, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -4369,7 +4331,6 @@ class PowerPanelFilterForm(BootstrapMixin, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -4380,7 +4341,6 @@ class PowerPanelFilterForm(BootstrapMixin, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'rack_group_id': 'site', } @@ -4589,7 +4549,6 @@ class PowerFeedFilterForm(BootstrapMixin, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -4600,7 +4559,6 @@ class PowerFeedFilterForm(BootstrapMixin, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'power_panel_id': 'site', 'rack_id': 'site', diff --git a/netbox/extras/forms.py b/netbox/extras/forms.py index 30279e012..cecbfae72 100644 --- a/netbox/extras/forms.py +++ b/netbox/extras/forms.py @@ -290,42 +290,27 @@ class ConfigContextFilterForm(BootstrapMixin, forms.Form): region = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) site = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) role = DynamicModelMultipleChoiceField( queryset=DeviceRole.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) platform = DynamicModelMultipleChoiceField( queryset=Platform.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) cluster_group = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) cluster_id = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), @@ -335,26 +320,17 @@ class ConfigContextFilterForm(BootstrapMixin, forms.Form): tenant_group = DynamicModelMultipleChoiceField( queryset=TenantGroup.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) tenant = DynamicModelMultipleChoiceField( queryset=Tenant.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) tag = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index aad3eaade..393903d37 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -217,10 +217,7 @@ class AggregateFilterForm(BootstrapMixin, CustomFieldFilterForm): queryset=RIR.objects.all(), to_field_name='slug', required=False, - label='RIR', - widget=APISelectMultiple( - value_field="slug", - ) + label='RIR' ) tag = TagFilterField(model) @@ -481,7 +478,6 @@ class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm) to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -492,7 +488,6 @@ class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm) to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -501,7 +496,6 @@ class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm) to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -978,7 +972,6 @@ class VLANGroupFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region', } @@ -989,7 +982,6 @@ class VLANGroupFilterForm(BootstrapMixin, forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -1145,7 +1137,6 @@ class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region', 'group_id': 'region' @@ -1157,7 +1148,6 @@ class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -1179,7 +1169,6 @@ class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) diff --git a/netbox/secrets/forms.py b/netbox/secrets/forms.py index 54178f46b..d0ef5ba3a 100644 --- a/netbox/secrets/forms.py +++ b/netbox/secrets/forms.py @@ -178,10 +178,7 @@ class SecretFilterForm(BootstrapMixin, CustomFieldFilterForm): role = DynamicModelMultipleChoiceField( queryset=SecretRole.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field="slug", - ) + required=False ) tag = TagFilterField(model) diff --git a/netbox/tenancy/forms.py b/netbox/tenancy/forms.py index 04a3980a1..436f37d3f 100644 --- a/netbox/tenancy/forms.py +++ b/netbox/tenancy/forms.py @@ -107,7 +107,6 @@ class TenantFilterForm(BootstrapMixin, CustomFieldFilterForm): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -154,7 +153,6 @@ class TenancyFilterForm(forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, filter_for={ 'tenant': 'group' @@ -166,7 +164,6 @@ class TenancyFilterForm(forms.Form): to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) diff --git a/netbox/utilities/forms/fields.py b/netbox/utilities/forms/fields.py index fbcc285a9..cfd025a4e 100644 --- a/netbox/utilities/forms/fields.py +++ b/netbox/utilities/forms/fields.py @@ -251,12 +251,19 @@ class DynamicModelChoiceMixin: def __init__(self, *args, display_field='name', **kwargs): self.display_field = display_field + # to_field_name is set by ModelChoiceField.__init__(), but we need to set it early for reference + # by widget_attrs() + self.to_field_name = kwargs.get('to_field_name') + super().__init__(*args, **kwargs) def widget_attrs(self, widget): - return { - 'display-field': self.display_field + attrs = { + 'display-field': self.display_field, } + if self.to_field_name: + attrs['value-field'] = self.to_field_name + return attrs def get_bound_field(self, form, field_name): bound_field = BoundField(form, self, field_name) diff --git a/netbox/utilities/forms/widgets.py b/netbox/utilities/forms/widgets.py index 80ff12ac3..0e03931f2 100644 --- a/netbox/utilities/forms/widgets.py +++ b/netbox/utilities/forms/widgets.py @@ -141,7 +141,6 @@ class APISelect(SelectWithDisabled): :param api_url: API endpoint URL. Required if not set automatically by the parent field. :param display_field: (Optional) Field to display for child in selection list. Defaults to `name`. - :param value_field: (Optional) Field to use for the option value in selection list. Defaults to `id`. :param disabled_indicator: (Optional) Mark option as disabled if this field equates true. :param filter_for: (Optional) A dict of chained form fields for which this field is a filter. The key is the name of the filter-for field (child field) and the value is the name of the query param filter. @@ -153,7 +152,6 @@ class APISelect(SelectWithDisabled): self, api_url=None, display_field=None, - value_field=None, disabled_indicator=None, filter_for=None, additional_query_params=None, @@ -172,8 +170,6 @@ class APISelect(SelectWithDisabled): self.attrs['data-full'] = full if display_field: self.attrs['display-field'] = display_field - if value_field: - self.attrs['value-field'] = value_field if disabled_indicator: self.attrs['disabled-indicator'] = disabled_indicator if filter_for: diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index b1a2de6aa..b53c2b151 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -166,17 +166,13 @@ class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm type = DynamicModelMultipleChoiceField( queryset=ClusterType.objects.all(), to_field_name='slug', - required=False, - widget=APISelectMultiple( - value_field='slug', - ) + required=False ) region = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -187,7 +183,6 @@ class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm to_field_name='slug', required=False, widget=APISelectMultiple( - value_field='slug', null_option=True, ) ) @@ -196,7 +191,6 @@ class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm to_field_name='slug', required=False, widget=APISelectMultiple( - value_field='slug', null_option=True, ) ) @@ -496,7 +490,6 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -505,7 +498,6 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -519,7 +511,6 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", filter_for={ 'site': 'region' } @@ -530,7 +521,6 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) ) @@ -539,7 +529,6 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, additional_query_params={ 'vm_role': "True" @@ -556,7 +545,6 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil to_field_name='slug', required=False, widget=APISelectMultiple( - value_field="slug", null_option=True, ) )