From d788f44ebf231a79268991b2004d67b3b9fb36e8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 Dec 2023 15:57:46 -0500 Subject: [PATCH] Declare selector_fields on base form class --- netbox/circuits/forms/filtersets.py | 2 +- netbox/dcim/forms/filtersets.py | 16 ++++++++-------- netbox/ipam/forms/filtersets.py | 4 ++-- netbox/netbox/forms/base.py | 4 ++++ netbox/templates/htmx/object_selector.html | 2 +- netbox/virtualization/forms/filtersets.py | 4 ++-- 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index ae30e1744..643071be8 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -110,7 +110,7 @@ class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) - selector_fields = ['region_id', 'site_group_id', 'site_id', 'provider_id', 'provider_network_id',] + selector_fields = ('filter_id', 'q', 'region_id', 'site_group_id', 'site_id', 'provider_id', 'provider_network_id') type_id = DynamicModelMultipleChoiceField( queryset=CircuitType.objects.all(), required=False, diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 7476e198a..41bb417aa 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -164,7 +164,7 @@ class SiteFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) - selector_fields = ['region_id', 'group_id',] + selector_fields = ('filter_id', 'q', 'region_id', 'group_id') status = forms.MultipleChoiceField( label=_('Status'), choices=SiteStatusChoices, @@ -248,7 +248,7 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte (_('Contacts'), ('contact', 'contact_role', 'contact_group')), (_('Weight'), ('weight', 'max_weight', 'weight_unit')), ) - selector_fields = ['region_id', 'site_group_id', 'site_id', 'location_id',] + selector_fields = ('filter_id', 'q', 'region_id', 'site_group_id', 'site_id', 'location_id') region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -421,7 +421,7 @@ class DeviceTypeFilterForm(NetBoxModelFilterSetForm): )), (_('Weight'), ('weight', 'weight_unit')), ) - selector_fields = ['manufacturer_id',] + selector_fields = ('filter_id', 'q', 'manufacturer_id') manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, @@ -546,7 +546,7 @@ class ModuleTypeFilterForm(NetBoxModelFilterSetForm): )), (_('Weight'), ('weight', 'weight_unit')), ) - selector_fields = ['manufacturer_id',] + selector_fields = ('filter_id', 'q', 'manufacturer_id') manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, @@ -623,7 +623,7 @@ class DeviceRoleFilterForm(NetBoxModelFilterSetForm): class PlatformFilterForm(NetBoxModelFilterSetForm): model = Platform - selector_fields = ['manufacturer_id',] + selector_fields = ('filter_id', 'q', 'manufacturer_id') manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, @@ -658,7 +658,7 @@ class DeviceFilterForm( 'has_primary_ip', 'has_oob_ip', 'virtual_chassis_member', 'config_template_id', 'local_context_data', )) ) - selector_fields = ['region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id',] + selector_fields = ('filter_id', 'q', 'region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id') region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -1002,7 +1002,7 @@ class PowerPanelFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) - selector_fields = ['site_id', 'location_id',] + selector_fields = ('filter_id', 'q', 'site_id', 'location_id') region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -1234,7 +1234,7 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id', 'vdc_id')), (_('Connection'), ('cabled', 'connected', 'occupied')), ) - selector_fields = ['device_id',] + selector_fields = ('filter_id', 'q', 'device_id') vdc_id = DynamicModelMultipleChoiceField( queryset=VirtualDeviceContext.objects.all(), required=False, diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 318e2d7b7..b72788387 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -300,7 +300,7 @@ class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Device/VM'), ('device_id', 'virtual_machine_id')), ) - selector_fields = ['parent', 'status', 'role',] + selector_fields = ('filter_id', 'q', 'region_id', 'group_id', 'parent', 'status', 'role') parent = forms.CharField( required=False, widget=forms.TextInput( @@ -453,7 +453,7 @@ class VLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): (_('Attributes'), ('group_id', 'status', 'role_id', 'vid', 'l2vpn_id')), (_('Tenant'), ('tenant_group_id', 'tenant_id')), ) - selector_fields = ['site_id',] + selector_fields = ('filter_id', 'q', 'site_id') region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 43d0850f0..51e664a39 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -145,12 +145,16 @@ class NetBoxModelFilterSetForm(BootstrapMixin, CustomFieldsMixin, SavedFiltersMi model: The model class associated with the form fieldsets: An iterable of two-tuples which define a heading and field set to display per section of the rendered form (optional). If not defined, the all fields will be rendered as a single section. + selector_fields: An iterable of names of fields to display by default when rendering the form as + a selector widget """ q = forms.CharField( required=False, label=_('Search') ) + selector_fields = ('filter_id', 'q') + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/netbox/templates/htmx/object_selector.html b/netbox/templates/htmx/object_selector.html index 2bb7760ea..280102ada 100644 --- a/netbox/templates/htmx/object_selector.html +++ b/netbox/templates/htmx/object_selector.html @@ -21,7 +21,7 @@
{% for field in form.visible_fields %} -
{% render_field field %}
+
{% render_field field %}
{% endfor %}
diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 316c0fa7a..4028bcc64 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -44,7 +44,7 @@ class ClusterFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) - selector_fields = ['group_id',] + selector_fields = ('filter_id', 'q', 'group_id') type_id = DynamicModelMultipleChoiceField( queryset=ClusterType.objects.all(), required=False, @@ -187,7 +187,7 @@ class VMInterfaceFilterForm(NetBoxModelFilterSetForm): (_('Virtual Machine'), ('cluster_id', 'virtual_machine_id')), (_('Attributes'), ('enabled', 'mac_address', 'vrf_id', 'l2vpn_id')), ) - selector_fields = ['virtual_machine_id',] + selector_fields = ('filter_id', 'q', 'virtual_machine_id') cluster_id = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), required=False,