#6372: Move object list search panel into collapsed view & remove search field

This commit is contained in:
checktheroads 2021-05-23 00:31:48 -07:00
parent 6b1397d257
commit da0aa38614
16 changed files with 319 additions and 193 deletions

View File

@ -104,10 +104,10 @@ class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEdi
class ProviderFilterForm(BootstrapMixin, CustomFieldFilterForm): class ProviderFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = Provider model = Provider
q = forms.CharField( field_groups = [
required=False, ['region_id', 'site_id'],
label=_('Search') ['asn', 'tag'],
) ]
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -192,11 +192,7 @@ class ProviderNetworkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomField
class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldFilterForm): class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = ProviderNetwork model = ProviderNetwork
field_order = ['q', 'provider_id'] field_order = ['provider_id']
q = forms.CharField(
required=False,
label=_('Search')
)
provider_id = DynamicModelMultipleChoiceField( provider_id = DynamicModelMultipleChoiceField(
queryset=Provider.objects.all(), queryset=Provider.objects.all(),
required=False, required=False,
@ -357,13 +353,16 @@ class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEdit
class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = Circuit model = Circuit
field_order = [ field_order = [
'q', 'type_id', 'provider_id', 'provider_network_id', 'status', 'region_id', 'site_id', 'tenant_group_id', 'tenant_id', 'type_id', 'provider_id', 'provider_network_id', 'status', 'region_id', 'site_id', 'tenant_group_id', 'tenant_id',
'commit_rate', 'commit_rate',
] ]
q = forms.CharField( field_groups = [
required=False, ['type_id', 'status', 'commit_rate'],
label=_('Search') ['provider_id', 'provider_network_id'],
) ['region_id', 'site_id'],
['tenant_group_id', 'tenant_id'],
['tag']
]
type_id = DynamicModelMultipleChoiceField( type_id = DynamicModelMultipleChoiceField(
queryset=CircuitType.objects.all(), queryset=CircuitType.objects.all(),
required=False, required=False,

View File

@ -56,12 +56,12 @@ def get_device_by_name_or_pk(name):
class DeviceComponentFilterForm(BootstrapMixin, CustomFieldFilterForm): class DeviceComponentFilterForm(BootstrapMixin, CustomFieldFilterForm):
field_order = [ field_order = [
'q', 'name', 'label', 'region_id', 'site_group_id', 'site_id', 'name', 'label', 'region_id', 'site_group_id', 'site_id',
]
field_groups = [
['name', 'label'],
['region_id', 'site_group_id', 'site_id'],
] ]
q = forms.CharField(
required=False,
label=_('Search')
)
name = forms.CharField( name = forms.CharField(
required=False required=False
) )
@ -232,10 +232,6 @@ class RegionBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
class RegionFilterForm(BootstrapMixin, CustomFieldFilterForm): class RegionFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = Site model = Site
q = forms.CharField(
required=False,
label=_('Search')
)
# #
@ -289,10 +285,6 @@ class SiteGroupBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
class SiteGroupFilterForm(BootstrapMixin, CustomFieldFilterForm): class SiteGroupFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = SiteGroup model = SiteGroup
q = forms.CharField(
required=False,
label=_('Search')
)
# #
@ -446,11 +438,12 @@ class SiteBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditFor
class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = Site model = Site
field_order = ['q', 'status', 'region_id', 'tenant_group_id', 'tenant_id'] field_order = ['status', 'region_id', 'tenant_group_id', 'tenant_id']
q = forms.CharField( field_groups = [
required=False, ['status', 'region_id'],
label=_('Search') ['tenant_group_id', 'tenant_id'],
) ['tag']
]
status = forms.MultipleChoiceField( status = forms.MultipleChoiceField(
choices=SiteStatusChoices, choices=SiteStatusChoices,
required=False, required=False,
@ -559,10 +552,6 @@ class LocationBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
class LocationFilterForm(BootstrapMixin, CustomFieldFilterForm): class LocationFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = Location model = Location
q = forms.CharField(
required=False,
label=_('Search')
)
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -853,11 +842,12 @@ class RackBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditFor
class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = Rack model = Rack
field_order = ['q', 'region_id', 'site_id', 'location_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id'] field_order = ['region_id', 'site_id', 'location_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id']
q = forms.CharField( field_groups = [
required=False, ['status', 'role_id'],
label=_('Search') ['region_id', 'site_id', 'location_id'],
) ['tenant_group_id', 'tenant_id'],
]
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -913,7 +903,7 @@ class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
class RackElevationFilterForm(RackFilterForm): class RackElevationFilterForm(RackFilterForm):
field_order = [ field_order = [
'q', 'region_id', 'site_id', 'location_id', 'id', 'status', 'role_id', 'tenant_group_id', 'tenant_id', 'region_id', 'site_id', 'location_id', 'id', 'status', 'role_id', 'tenant_group_id', 'tenant_id',
] ]
id = DynamicModelMultipleChoiceField( id = DynamicModelMultipleChoiceField(
queryset=Rack.objects.all(), queryset=Rack.objects.all(),
@ -1071,11 +1061,11 @@ class RackReservationBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomField
class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = RackReservation model = RackReservation
field_order = ['q', 'region_id', 'site_id', 'location_id', 'user_id', 'tenant_group_id', 'tenant_id'] field_order = ['region_id', 'site_id', 'location_id', 'user_id', 'tenant_group_id', 'tenant_id']
q = forms.CharField( field_groups = [
required=False, ['region_id', 'site_id', 'location_id'],
label=_('Search') ['user_id', 'tenant_group_id', 'tenant_id'],
) ]
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -1221,10 +1211,13 @@ class DeviceTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkE
class DeviceTypeFilterForm(BootstrapMixin, CustomFieldFilterForm): class DeviceTypeFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = DeviceType model = DeviceType
q = forms.CharField( field_groups = [
required=False, ['manufacturer_id', 'subdevice_role'],
label=_('Search') ['console_ports', 'console_server_ports'],
) ['power_ports', 'power_outlets'],
['interfaces', 'pass_through_ports'],
['tag']
]
manufacturer_id = DynamicModelMultipleChoiceField( manufacturer_id = DynamicModelMultipleChoiceField(
queryset=Manufacturer.objects.all(), queryset=Manufacturer.objects.all(),
required=False, required=False,
@ -2406,13 +2399,16 @@ class DeviceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditF
class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldFilterForm): class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldFilterForm):
model = Device model = Device
field_order = [ field_order = [
'q', 'region_id', 'site_id', 'location_id', 'rack_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id', 'region_id', 'site_id', 'location_id', 'rack_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id',
'manufacturer_id', 'device_type_id', 'asset_tag', 'mac_address', 'has_primary_ip', 'manufacturer_id', 'device_type_id', 'asset_tag', 'mac_address', 'has_primary_ip',
] ]
q = forms.CharField( field_groups = [
required=False, ['region_id', 'site_id', 'location_id', 'rack_id'],
label=_('Search') ['status', 'role_id', 'asset_tag'],
) ['tenant_group_id', 'tenant_id'],
['manufacturer_id', 'device_type_id'],
['mac_address', 'has_primary_ip'],
]
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -2583,6 +2579,12 @@ class DeviceBulkAddComponentForm(BootstrapMixin, CustomFieldForm, ComponentForm)
class ConsolePortFilterForm(DeviceComponentFilterForm): class ConsolePortFilterForm(DeviceComponentFilterForm):
model = ConsolePort model = ConsolePort
field_groups = [
['name', 'label'],
['type', 'speed'],
['region_id', 'site_group_id', 'site_id'],
['tag']
]
type = forms.MultipleChoiceField( type = forms.MultipleChoiceField(
choices=ConsolePortTypeChoices, choices=ConsolePortTypeChoices,
required=False, required=False,
@ -2684,6 +2686,12 @@ class ConsolePortCSVForm(CustomFieldModelCSVForm):
class ConsoleServerPortFilterForm(DeviceComponentFilterForm): class ConsoleServerPortFilterForm(DeviceComponentFilterForm):
model = ConsoleServerPort model = ConsoleServerPort
field_groups = [
['name', 'label'],
['type', 'speed'],
['region_id', 'site_group_id', 'site_id'],
['tag']
]
type = forms.MultipleChoiceField( type = forms.MultipleChoiceField(
choices=ConsolePortTypeChoices, choices=ConsolePortTypeChoices,
required=False, required=False,
@ -2785,6 +2793,11 @@ class ConsoleServerPortCSVForm(CustomFieldModelCSVForm):
class PowerPortFilterForm(DeviceComponentFilterForm): class PowerPortFilterForm(DeviceComponentFilterForm):
model = PowerPort model = PowerPort
field_groups = [
['name', 'label', 'type'],
['region_id', 'site_group_id', 'site_id'],
['tag'],
]
type = forms.MultipleChoiceField( type = forms.MultipleChoiceField(
choices=PowerPortTypeChoices, choices=PowerPortTypeChoices,
required=False, required=False,
@ -2883,6 +2896,11 @@ class PowerPortCSVForm(CustomFieldModelCSVForm):
class PowerOutletFilterForm(DeviceComponentFilterForm): class PowerOutletFilterForm(DeviceComponentFilterForm):
model = PowerOutlet model = PowerOutlet
field_groups = [
['name', 'label', 'type'],
['region_id', 'site_group_id', 'site_id'],
['tag'],
]
type = forms.MultipleChoiceField( type = forms.MultipleChoiceField(
choices=PowerOutletTypeChoices, choices=PowerOutletTypeChoices,
required=False, required=False,
@ -3050,6 +3068,12 @@ class PowerOutletCSVForm(CustomFieldModelCSVForm):
class InterfaceFilterForm(DeviceComponentFilterForm): class InterfaceFilterForm(DeviceComponentFilterForm):
model = Interface model = Interface
field_groups = [
['name', 'label', 'type', 'enabled'],
['mgmt_only', 'mac_address'],
['region_id', 'site_group_id', 'site_id'],
['tag'],
]
type = forms.MultipleChoiceField( type = forms.MultipleChoiceField(
choices=InterfaceTypeChoices, choices=InterfaceTypeChoices,
required=False, required=False,
@ -3386,6 +3410,11 @@ class InterfaceCSVForm(CustomFieldModelCSVForm):
# #
class FrontPortFilterForm(DeviceComponentFilterForm): class FrontPortFilterForm(DeviceComponentFilterForm):
field_groups = [
['name', 'label', 'type'],
['region_id', 'site_group_id', 'site_id'],
['tag']
]
model = FrontPort model = FrontPort
type = forms.MultipleChoiceField( type = forms.MultipleChoiceField(
choices=PortTypeChoices, choices=PortTypeChoices,
@ -3560,6 +3589,11 @@ class FrontPortCSVForm(CustomFieldModelCSVForm):
class RearPortFilterForm(DeviceComponentFilterForm): class RearPortFilterForm(DeviceComponentFilterForm):
model = RearPort model = RearPort
field_groups = [
['name', 'label', 'type'],
['region_id', 'site_group_id', 'site_id'],
['tag']
]
type = forms.MultipleChoiceField( type = forms.MultipleChoiceField(
choices=PortTypeChoices, choices=PortTypeChoices,
required=False, required=False,
@ -3649,6 +3683,11 @@ class RearPortCSVForm(CustomFieldModelCSVForm):
class DeviceBayFilterForm(DeviceComponentFilterForm): class DeviceBayFilterForm(DeviceComponentFilterForm):
model = DeviceBay model = DeviceBay
field_groups = [
['name', 'label'],
['region_id', 'site_group_id', 'site_id'],
['tag']
]
tag = TagFilterField(model) tag = TagFilterField(model)
@ -3872,6 +3911,12 @@ class InventoryItemBulkEditForm(
class InventoryItemFilterForm(DeviceComponentFilterForm): class InventoryItemFilterForm(DeviceComponentFilterForm):
model = InventoryItem model = InventoryItem
field_groups = [
['name', 'label', 'manufacturer_id'],
['serial', 'asset_tag', 'discovered'],
['region_id', 'site_group_id', 'site_id'],
['tag']
]
manufacturer_id = DynamicModelMultipleChoiceField( manufacturer_id = DynamicModelMultipleChoiceField(
queryset=Manufacturer.objects.all(), queryset=Manufacturer.objects.all(),
required=False, required=False,
@ -4331,10 +4376,12 @@ class CableBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditFo
class CableFilterForm(BootstrapMixin, CustomFieldFilterForm): class CableFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = Cable model = Cable
q = forms.CharField( field_groups = [
required=False, ['type', 'status', 'color'],
label=_('Search') ['device_id', 'rack_id'],
) ['region_id', 'site_group_id', 'site_id', 'tenant_id'],
['tag']
]
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -4707,11 +4754,12 @@ class VirtualChassisCSVForm(CustomFieldModelCSVForm):
class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = VirtualChassis model = VirtualChassis
field_order = ['q', 'region_id', 'site_group_id', 'site_id', 'tenant_group_id', 'tenant_id'] field_order = ['region_id', 'site_group_id', 'site_id', 'tenant_group_id', 'tenant_id']
q = forms.CharField( field_groups = [
required=False, ['region_id', 'site_group_id', 'site_id'],
label=_('Search') ['tenant_group_id', 'tenant_id'],
) ['tag']
]
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -4848,10 +4896,6 @@ class PowerPanelBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkE
class PowerPanelFilterForm(BootstrapMixin, CustomFieldFilterForm): class PowerPanelFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = PowerPanel model = PowerPanel
q = forms.CharField(
required=False,
label=_('Search')
)
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -5082,10 +5126,13 @@ class PowerFeedBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEd
class PowerFeedFilterForm(BootstrapMixin, CustomFieldFilterForm): class PowerFeedFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = PowerFeed model = PowerFeed
q = forms.CharField( field_groups = [
required=False, ['region_id', 'site_group_id', 'site_id'],
label=_('Search') ['power_panel_id', 'rack_id'],
) ['type', 'supply', 'max_utilization'],
['phase', 'voltage', 'amperage'],
['status', 'tag']
]
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,

View File

@ -47,6 +47,7 @@ class CustomFieldModelForm(forms.ModelForm):
""" """
Extend ModelForm to include custom field support. Extend ModelForm to include custom field support.
""" """
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.obj_type = ContentType.objects.get_for_model(self._meta.model) self.obj_type = ContentType.objects.get_for_model(self._meta.model)
@ -176,10 +177,6 @@ class AddRemoveTagsForm(forms.Form):
class TagFilterForm(BootstrapMixin, forms.Form): class TagFilterForm(BootstrapMixin, forms.Form):
model = Tag model = Tag
q = forms.CharField(
required=False,
label=_('Search')
)
class TagBulkEditForm(BootstrapMixin, BulkEditForm): class TagBulkEditForm(BootstrapMixin, BulkEditForm):
@ -288,13 +285,15 @@ class ConfigContextBulkEditForm(BootstrapMixin, BulkEditForm):
class ConfigContextFilterForm(BootstrapMixin, forms.Form): class ConfigContextFilterForm(BootstrapMixin, forms.Form):
field_order = [ field_order = [
'q', 'region_id', 'site_group_id', 'site_id', 'role_id', 'platform_id', 'cluster_group_id', 'cluster_id', 'region_id', 'site_group_id', 'site_id', 'role_id', 'platform_id', 'cluster_group_id', 'cluster_id',
'tenant_group_id', 'tenant_id', 'tenant_group_id', 'tenant_id',
] ]
q = forms.CharField( field_groups = [
required=False, ['region_id', 'site_group_id', 'site_id'],
label=_('Search') ['device_type_id', 'role_id', 'platform_id'],
) ['cluster_group_id', 'cluster_id'],
['tenant_group_id', 'tenant_id', 'tag']
]
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -422,10 +421,10 @@ class JournalEntryBulkEditForm(BootstrapMixin, BulkEditForm):
class JournalEntryFilterForm(BootstrapMixin, forms.Form): class JournalEntryFilterForm(BootstrapMixin, forms.Form):
model = JournalEntry model = JournalEntry
q = forms.CharField( field_groups = [
required=False, ['created_before', 'created_after', 'created_by_id'],
label=_('Search') ['assigned_object_type_id', 'kind']
) ]
created_after = forms.DateTimeField( created_after = forms.DateTimeField(
required=False, required=False,
label=_('After'), label=_('After'),
@ -465,10 +464,10 @@ class JournalEntryFilterForm(BootstrapMixin, forms.Form):
class ObjectChangeFilterForm(BootstrapMixin, forms.Form): class ObjectChangeFilterForm(BootstrapMixin, forms.Form):
model = ObjectChange model = ObjectChange
q = forms.CharField( field_groups = [
required=False, ['time_before', 'time_after', 'action'],
label=_('Search') ['user_id', 'changed_object_type_id'],
) ]
time_after = forms.DateTimeField( time_after = forms.DateTimeField(
required=False, required=False,
label=_('After'), label=_('After'),

View File

@ -106,11 +106,12 @@ class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm
class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = VRF model = VRF
field_order = ['q', 'import_target_id', 'export_target_id', 'tenant_group_id', 'tenant_id'] field_order = ['import_target_id', 'export_target_id', 'tenant_group_id', 'tenant_id']
q = forms.CharField( field_groups = [
required=False, ['import_target_id', 'export_target_id'],
label=_('Search') ['tenant_group_id', 'tenant_id'],
) ['tag']
]
import_target_id = DynamicModelMultipleChoiceField( import_target_id = DynamicModelMultipleChoiceField(
queryset=RouteTarget.objects.all(), queryset=RouteTarget.objects.all(),
required=False, required=False,
@ -176,11 +177,11 @@ class RouteTargetBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulk
class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = RouteTarget model = RouteTarget
field_order = ['q', 'name', 'tenant_group_id', 'tenant_id', 'importing_vrfs', 'exporting_vrfs'] field_order = ['name', 'tenant_group_id', 'tenant_id', 'importing_vrfs', 'exporting_vrfs']
q = forms.CharField( field_groups = [
required=False, ['name', 'importing_vrfs', 'exporting_vrfs'],
label=_('Search') ['tenant_group_id', 'tenant_id'],
) ]
importing_vrf_id = DynamicModelMultipleChoiceField( importing_vrf_id = DynamicModelMultipleChoiceField(
queryset=VRF.objects.all(), queryset=VRF.objects.all(),
required=False, required=False,
@ -330,11 +331,11 @@ class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEd
class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = Aggregate model = Aggregate
field_order = ['q', 'family', 'rir', 'tenant_group_id', 'tenant_id'] field_order = ['family', 'rir', 'tenant_group_id', 'tenant_id']
q = forms.CharField( field_groups = [
required=False, ['family', 'rir'],
label=_('Search') ['tenant_group_id', 'tenant_id']
) ]
family = forms.ChoiceField( family = forms.ChoiceField(
required=False, required=False,
choices=add_blank_choice(IPAddressFamilyChoices), choices=add_blank_choice(IPAddressFamilyChoices),
@ -601,16 +602,18 @@ class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditF
class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = Prefix model = Prefix
field_order = [ field_order = [
'q', 'within_include', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'region_id', 'within_include', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'region_id',
'site_group_id', 'site_id', 'role_id', 'tenant_group_id', 'tenant_id', 'is_pool', 'mark_utilized', 'site_group_id', 'site_id', 'role_id', 'tenant_group_id', 'tenant_id', 'is_pool', 'mark_utilized',
] ]
field_groups = [
['role_id', 'within_include', 'family', 'mask_length'],
['vrf_id', 'present_in_vrf_id', 'is_pool', 'mark_utilized'],
['region_id', 'site_group_id', 'site_id'],
['tenant_group_id', 'tenant_id', 'status', 'tag']
]
mask_length__lte = forms.IntegerField( mask_length__lte = forms.IntegerField(
widget=forms.HiddenInput() widget=forms.HiddenInput()
) )
q = forms.CharField(
required=False,
label=_('Search')
)
within_include = forms.CharField( within_include = forms.CharField(
required=False, required=False,
widget=forms.TextInput( widget=forms.TextInput(
@ -1087,13 +1090,15 @@ class IPAddressAssignForm(BootstrapMixin, forms.Form):
class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = IPAddress model = IPAddress
field_order = [ field_order = [
'q', 'parent', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'role', 'parent', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'role',
'assigned_to_interface', 'tenant_group_id', 'tenant_id', 'assigned_to_interface', 'tenant_group_id', 'tenant_id',
] ]
q = forms.CharField( field_groups = [
required=False, ['parent', 'family', 'mask_length'],
label=_('Search') ['status', 'vrf_id', 'present_in_vrf_id'],
) ['role', 'assigned_to_interface'],
['tenant_group_id', 'tenant_id'],
]
parent = forms.CharField( parent = forms.CharField(
required=False, required=False,
widget=forms.TextInput( widget=forms.TextInput(
@ -1282,6 +1287,10 @@ class VLANGroupBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
class VLANGroupFilterForm(BootstrapMixin, forms.Form): class VLANGroupFilterForm(BootstrapMixin, forms.Form):
field_groups = [
['region', 'sitegroup', 'site'],
['location', 'rack']
]
region = DynamicModelMultipleChoiceField( region = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -1488,12 +1497,13 @@ class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditFor
class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = VLAN model = VLAN
field_order = [ field_order = [
'q', 'region_id', 'site_group_id', 'site_id', 'group_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id', 'region_id', 'site_group_id', 'site_id', 'group_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id',
]
field_groups = [
['region_id', 'site_group_id', 'site_id'],
['group_id', 'role_id', 'status'],
['tenant_group_id', 'tenant_id'],
] ]
q = forms.CharField(
required=False,
label='Search'
)
region_id = DynamicModelMultipleChoiceField( region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(), queryset=Region.objects.all(),
required=False, required=False,
@ -1585,10 +1595,6 @@ class ServiceForm(BootstrapMixin, CustomFieldModelForm):
class ServiceFilterForm(BootstrapMixin, CustomFieldFilterForm): class ServiceFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = Service model = Service
q = forms.CharField(
required=False,
label=_('Search')
)
protocol = forms.ChoiceField( protocol = forms.ChoiceField(
choices=add_blank_choice(ServiceProtocolChoices), choices=add_blank_choice(ServiceProtocolChoices),
required=False, required=False,

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -78,6 +78,10 @@ table td > .progress {
min-width: 6rem; min-width: 6rem;
} }
div#advanced-search-content div.card div.card-body div.col:not(:last-child) {
margin-right: 1rem;
}
body { body {
background-color: var(--nbx-body-bg); background-color: var(--nbx-body-bg);
color: var(--nbx-body-color); color: var(--nbx-body-color);

View File

@ -6,17 +6,37 @@
{% block extra_controls %}{% export_button content_type %}{% endblock %} {% block extra_controls %}{% export_button content_type %}{% endblock %}
{% block content %} {% block content %}
{% if filter_form %}
<div class="col col-md-12 noprint">
{% include 'inc/advanced_search.html' %}
</div>
{% endif %}
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-9"> <div class="col col-md-12">
<div class="card"> <div class="card">
<div class="card-header">
<div class="row">
<div class="col col-md-4 offset-md-8 d-flex noprint table-controls">
<div class="input-group input-group-sm">
<input type="text" class="form-control object-filter" placeholder="Filter" title="Filter text (regular expressions supported)" />
{% if filter_form %}
<button
type="button"
class="btn btn-sm btn-outline-dark"
data-bs-toggle="collapse"
data-bs-target="#advanced-search-content">
Advanced Search
</button>
{% endif %}
</div>
</div>
</div>
</div>
<div class="card-body"> <div class="card-body">
{% include 'inc/responsive_table.html' %} {% include 'inc/responsive_table.html' %}
</div> </div>
</div> </div>
{% include 'inc/paginator.html' with paginator=table.paginator page=table.page %} {% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
</div> </div>
<div class="col col-md-3 float-end right-side-panel noprint">
{% include 'inc/search_panel.html' %}
</div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -7,6 +7,9 @@
{% block controls %} {% block controls %}
<div class="container mb-2 mx-0"> <div class="container mb-2 mx-0">
<div class="d-flex flex-wrap justify-content-end"> <div class="d-flex flex-wrap justify-content-end">
<button type="button" class="btn btn-sm btn-outline-dark m-1" data-bs-toggle="collapse" data-bs-target="#advanced-search-content">
Advanced Search
</button>
<button class="btn btn-sm btn-outline-dark toggle-images m-1" selected="selected"> <button class="btn btn-sm btn-outline-dark toggle-images m-1" selected="selected">
<span class="mdi mdi mdi-checkbox-marked-circle-outline" aria-hidden="true"></span> Show Images <span class="mdi mdi mdi-checkbox-marked-circle-outline" aria-hidden="true"></span> Show Images
</button> </button>
@ -23,11 +26,11 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="col col-md-12 noprint">
{% include 'inc/advanced_search.html' %}
</div>
<div class="row"> <div class="row">
<div class="col col-md-12"> <div class="col col-md-12">
<div class="col col-md-3 float-end right-side-panel noprint">
{% include 'inc/search_panel.html' %}
</div>
{% if page %} {% if page %}
<div style="white-space: nowrap; overflow-x: scroll;"> <div style="white-space: nowrap; overflow-x: scroll;">
{% for rack in page %} {% for rack in page %}

View File

@ -24,6 +24,11 @@
{% endblock controls %} {% endblock controls %}
{% block content %} {% block content %}
{% if filter_form %}
<div class="col col-md-12 noprint">
{% include 'inc/advanced_search.html' %}
</div>
{% endif %}
{% if table.paginator.num_pages > 1 %} {% if table.paginator.num_pages > 1 %}
{% with bulk_edit_url=content_type.model_class|validated_viewname:"bulk_edit" bulk_delete_url=content_type.model_class|validated_viewname:"bulk_delete" %} {% with bulk_edit_url=content_type.model_class|validated_viewname:"bulk_edit" bulk_delete_url=content_type.model_class|validated_viewname:"bulk_delete" %}
<div class="row mb-3"> <div class="row mb-3">
@ -56,11 +61,11 @@
{% endwith %} {% endwith %}
{% endif %} {% endif %}
<div class="row mb-3"> <div class="row mb-3">
<div class="col{% if filter_form %} col-md-9{% else %} col-md-12{% endif %}"> <div class="col col-md-12">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<div class="row"> <div class="row">
<div class="col col-md-2 offset-md-10 noprint table-controls"> <div class="col col-md-4 offset-md-8 d-flex noprint table-controls">
<div class="input-group input-group-sm"> <div class="input-group input-group-sm">
<input type="text" class="form-control object-filter" placeholder="Filter" title="Filter text (regular expressions supported)" /> <input type="text" class="form-control object-filter" placeholder="Filter" title="Filter text (regular expressions supported)" />
{% if request.user.is_authenticated and table_config_form %} {% if request.user.is_authenticated and table_config_form %}
@ -68,6 +73,15 @@
<i class="mdi mdi-table-eye"></i> <i class="mdi mdi-table-eye"></i>
</button> </button>
{% endif %} {% endif %}
{% if filter_form %}
<button
type="button"
class="btn btn-sm btn-outline-dark"
data-bs-toggle="collapse"
data-bs-target="#advanced-search-content">
Advanced Search
</button>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
@ -103,12 +117,6 @@
</div> </div>
</div> </div>
</div> </div>
{% if filter_form %}
<div class="col col-md-3 noprint">
{% block sidebar %}{% endblock %}
{% include 'inc/search_panel.html' %}
</div>
{% endif %}
</div> </div>
{% table_config_form table table_name="ObjectTable" %} {% table_config_form table table_name="ObjectTable" %}
{% endblock content %} {% endblock content %}

View File

@ -0,0 +1,62 @@
{% load form_helpers %}
{% load helpers %}
<div class="collapse" id="advanced-search-content">
<form action="." method="get">
<div class="card">
<h5 class="card-header">
Advanced Search
</h5>
<div class="card-body overflow-visible d-flex flex-wrap justify-content-between py-3">
{% for field in filter_form.hidden_fields %}
{{ field }}
{% endfor %}
{% if filter_form.field_groups %}
{% for group in filter_form.field_groups %}
<div class="col">
{% for name in group %}
{% with field=filter_form|get_item:name %}
{% if field|widget_type == 'checkboxinput' %}
<div class="form-check mb-3">
<label class="form-check-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
</div>
{% else %}
<div class="form-floating mb-3 mx-3">
{{ field }}
{{ field.label_tag }}
</div>
{% endif %}
{% endwith %}
{% endfor %}
</div>
{% endfor %}
{% else %}
{% for field in filter_form.visible_fields %}
<div class="col">
{% if field|widget_type == 'checkboxinput' %}
<div class="form-check mb-3">
<label class="form-check-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
</div>
{% else %}
<div class="form-floating mb-3">
{{ field }}
{{ field.label_tag }}
</div>
{% endif %}
</div>
{% endfor %}
{% endif %}
</div>
<div class="card-footer text-end noprint border-0">
<a href="." class="btn btn-sm btn-outline-dark m-1">
<i class="mdi mdi-close"></i> Clear
</a>
<button type="submit" class="btn btn-sm btn-primary m-1">
<i class="mdi mdi-magnify"></i> Search
</button>
</div>
</div>
</form>
</div>

View File

@ -1,42 +0,0 @@
{% load form_helpers %}
<div class="card">
<h5 class="card-header">
Search
</h5>
<div class="card-body overflow-visible">
<form action="." method="get">
{% for field in filter_form.hidden_fields %}
{{ field }}
{% endfor %}
{% for field in filter_form.visible_fields %}
{% if field.name == "q" %}
<div class="input-group mb-3">
<input type="text" name="q" class="form-control" placeholder="Search" {% if request.GET.q %}value="{{ request.GET.q }}" {% endif %}/>
<button type="submit" class="btn btn-primary">
<i class="mdi mdi-magnify"></i>
</button>
</div>
{% elif field|widget_type == 'checkboxinput' %}
<div class="form-check mb-3">
<label class="form-check-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
</div>
{% else %}
<div class="form-floating mb-3">
{{ field }}
{{ field.label_tag }}
</div>
{% endif %}
{% endfor %}
</form>
</div>
<div class="card-footer text-end noprint border-0">
<a href="." class="btn btn-sm btn-outline-dark m-1">
<i class="mdi mdi-close"></i> Clear
</a>
<button type="submit" class="btn btn-sm btn-primary m-1">
<i class="mdi mdi-magnify"></i> Apply
</button>
</div>
</div>

View File

@ -249,6 +249,15 @@ def get_key(value: Dict, arg: str) -> Any:
return value.get(arg, None) return value.get(arg, None)
@register.filter
def get_item(value: object, attr: str) -> Any:
"""
Template implementation of `__getitem__`, for accessing the `__getitem__` method
of a class from a template.
"""
return value[attr]
# #
# Tags # Tags
# #

View File

@ -224,12 +224,14 @@ class ClusterBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEdit
class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = Cluster model = Cluster
field_order = [ field_order = [
'q', 'type_id', 'region_id', 'site_id', 'group_id', 'tenant_group_id', 'tenant_id', 'type_id', 'region_id', 'site_id', 'group_id', 'tenant_group_id', 'tenant_id',
]
field_groups = [
['type_id'],
['region_id', 'site_id'],
['tenant_group_id', 'tenant_id'],
['tag'],
] ]
q = forms.CharField(
required=False,
label=_('Search')
)
type_id = DynamicModelMultipleChoiceField( type_id = DynamicModelMultipleChoiceField(
queryset=ClusterType.objects.all(), queryset=ClusterType.objects.all(),
required=False, required=False,
@ -527,13 +529,17 @@ class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldB
class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = VirtualMachine model = VirtualMachine
field_order = [ field_order = [
'q', 'cluster_group_id', 'cluster_type_id', 'cluster_id', 'status', 'role_id', 'region_id', 'site_id', 'cluster_group_id', 'cluster_type_id', 'cluster_id', 'status', 'role_id', 'region_id', 'site_id',
'tenant_group_id', 'tenant_id', 'platform_id', 'mac_address', 'tenant_group_id', 'tenant_id', 'platform_id', 'mac_address',
] ]
q = forms.CharField( field_groups = [
required=False, ['status', 'role_id'],
label=_('Search') ['platform_id', 'mac_address'],
) ['cluster_group_id', 'cluster_type_id', 'cluster_id'],
['region_id', 'site_id'],
['tenant_group_id', 'tenant_id'],
]
cluster_group_id = DynamicModelMultipleChoiceField( cluster_group_id = DynamicModelMultipleChoiceField(
queryset=ClusterGroup.objects.all(), queryset=ClusterGroup.objects.all(),
required=False, required=False,
@ -830,6 +836,11 @@ class VMInterfaceBulkRenameForm(BulkRenameForm):
class VMInterfaceFilterForm(BootstrapMixin, forms.Form): class VMInterfaceFilterForm(BootstrapMixin, forms.Form):
model = VMInterface model = VMInterface
field_groups = [
['cluster_id', 'virtual_machine_id'],
['enabled', 'mac_address'],
['tag']
]
cluster_id = DynamicModelMultipleChoiceField( cluster_id = DynamicModelMultipleChoiceField(
queryset=Cluster.objects.all(), queryset=Cluster.objects.all(),
required=False, required=False,