From f3fb85933f40fa65f3fafdb5d64310482e5d76ab Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 12 Aug 2020 09:28:24 -0400 Subject: [PATCH] Add query_params attribute to DynamicModelChoiceMixin --- netbox/dcim/forms.py | 68 ++++++++++--------------- netbox/utilities/forms/fields.py | 10 +++- netbox/virtualization/forms.py | 86 +++++++++++++------------------- 3 files changed, 70 insertions(+), 94 deletions(-) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 7700545df..cf79458a6 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1746,11 +1746,9 @@ class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): platform = DynamicModelChoiceField( queryset=Platform.objects.all(), required=False, - widget=APISelect( - additional_query_params={ - "manufacturer_id": "null" - } - ) + query_params={ + "manufacturer_id": "null" + } ) cluster_group = DynamicModelChoiceField( queryset=ClusterGroup.objects.all(), @@ -2680,24 +2678,20 @@ class InterfaceForm(InterfaceCommonForm, BootstrapMixin, forms.ModelForm): required=False, label='Untagged VLAN', display_field='display_name', - widget=APISelect( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelect(full=True) ) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, label='Tagged VLANs', display_field='display_name', - widget=APISelectMultiple( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelectMultiple(full=True) ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -2781,23 +2775,19 @@ class InterfaceCreateForm(ComponentCreateForm, InterfaceCommonForm): queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelect( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelect(full=True) ) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelectMultiple( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelectMultiple(full=True) ) field_order = ( 'device', 'name_pattern', 'label_pattern', 'type', 'enabled', 'lag', 'mtu', 'mac_address', 'description', @@ -2850,23 +2840,19 @@ class InterfaceBulkEditForm( queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelect( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelect(full=True) ) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelectMultiple( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelectMultiple(full=True) ) class Meta: diff --git a/netbox/utilities/forms/fields.py b/netbox/utilities/forms/fields.py index cfd025a4e..065086c4e 100644 --- a/netbox/utilities/forms/fields.py +++ b/netbox/utilities/forms/fields.py @@ -248,8 +248,9 @@ class DynamicModelChoiceMixin: filter = django_filters.ModelChoiceFilter widget = widgets.APISelect - def __init__(self, *args, display_field='name', **kwargs): + def __init__(self, *args, display_field='name', query_params=None, **kwargs): self.display_field = display_field + self.query_params = query_params or {} # to_field_name is set by ModelChoiceField.__init__(), but we need to set it early for reference # by widget_attrs() @@ -261,8 +262,15 @@ class DynamicModelChoiceMixin: attrs = { 'display-field': self.display_field, } + + # Set value-field attribute if the field specifies to_field_name if self.to_field_name: attrs['value-field'] = self.to_field_name + + # Attach any static query parameters + for key, value in self.query_params.items(): + widget.add_additional_query_param(key, value) + return attrs def get_bound_field(self, form, field_name): diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index b53c2b151..f33d4645a 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -297,11 +297,9 @@ class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): role = DynamicModelChoiceField( queryset=DeviceRole.objects.all(), required=False, - widget=APISelect( - additional_query_params={ - "vm_role": "True" - } - ) + query_params={ + "vm_role": "True" + } ) platform = DynamicModelChoiceField( queryset=Platform.objects.all(), @@ -438,11 +436,9 @@ class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldB vm_role=True ), required=False, - widget=APISelect( - additional_query_params={ - "vm_role": "True" - } - ) + query_params={ + "vm_role": "True" + } ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), @@ -528,12 +524,10 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil queryset=DeviceRole.objects.filter(vm_role=True), to_field_name='slug', required=False, - widget=APISelectMultiple( - null_option=True, - additional_query_params={ - 'vm_role': "True" - } - ) + query_params={ + 'vm_role': "True" + }, + widget=APISelectMultiple(null_option=True) ) status = forms.MultipleChoiceField( choices=VirtualMachineStatusChoices, @@ -564,23 +558,19 @@ class VMInterfaceForm(BootstrapMixin, forms.ModelForm): queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelect( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelect(full=True) ) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelectMultiple( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelectMultiple(full=True) ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -668,23 +658,19 @@ class VMInterfaceCreateForm(BootstrapMixin, forms.Form): queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelect( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelect(full=True) ) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelectMultiple( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelectMultiple(full=True) ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), @@ -762,23 +748,19 @@ class VMInterfaceBulkEditForm(BootstrapMixin, BulkEditForm): queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelect( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelect(full=True) ) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, display_field='display_name', - widget=APISelectMultiple( - full=True, - additional_query_params={ - 'site_id': 'null', - }, - ) + query_params={ + 'site_id': 'null', + }, + widget=APISelectMultiple(full=True) ) class Meta: