Determine search categories from model app by default

This commit is contained in:
jeremystretch 2022-10-10 11:04:39 -04:00
parent cefb96fa1d
commit 56f404b889
11 changed files with 107 additions and 110 deletions

View File

@ -1,35 +1,34 @@
import circuits.filtersets import circuits.filtersets
import circuits.tables import circuits.tables
from circuits.models import Circuit, Provider, ProviderNetwork from circuits.models import Circuit, Provider, ProviderNetwork
from netbox.search.models import SearchMixin from netbox.search import SearchIndex, register_search
from netbox.search import register_search
from utilities.utils import count_related from utilities.utils import count_related
@register_search(Provider) @register_search()
class ProviderIndex(SearchMixin): class ProviderIndex(SearchIndex):
model = Provider
queryset = Provider.objects.annotate(count_circuits=count_related(Circuit, 'provider')) queryset = Provider.objects.annotate(count_circuits=count_related(Circuit, 'provider'))
filterset = circuits.filtersets.ProviderFilterSet filterset = circuits.filtersets.ProviderFilterSet
table = circuits.tables.ProviderTable table = circuits.tables.ProviderTable
url = 'circuits:provider_list' url = 'circuits:provider_list'
choice_header = 'Circuits'
@register_search(Circuit) @register_search()
class CircuitIndex(SearchMixin): class CircuitIndex(SearchIndex):
model = Circuit
queryset = Circuit.objects.prefetch_related( queryset = Circuit.objects.prefetch_related(
'type', 'provider', 'tenant', 'tenant__group', 'terminations__site' 'type', 'provider', 'tenant', 'tenant__group', 'terminations__site'
) )
filterset = circuits.filtersets.CircuitFilterSet filterset = circuits.filtersets.CircuitFilterSet
table = circuits.tables.CircuitTable table = circuits.tables.CircuitTable
url = 'circuits:circuit_list' url = 'circuits:circuit_list'
choice_header = 'Circuits'
@register_search(ProviderNetwork) @register_search()
class ProviderNetworkIndex(SearchMixin): class ProviderNetworkIndex(SearchIndex):
model = ProviderNetwork
queryset = ProviderNetwork.objects.prefetch_related('provider') queryset = ProviderNetwork.objects.prefetch_related('provider')
filterset = circuits.filtersets.ProviderNetworkFilterSet filterset = circuits.filtersets.ProviderNetworkFilterSet
table = circuits.tables.ProviderNetworkTable table = circuits.tables.ProviderNetworkTable
url = 'circuits:providernetwork_list' url = 'circuits:providernetwork_list'
choice_header = 'Circuits'

View File

@ -13,42 +13,42 @@ from dcim.models import (
Site, Site,
VirtualChassis, VirtualChassis,
) )
from netbox.search.models import SearchMixin from netbox.search import SearchIndex, register_search
from netbox.search import register_search
from utilities.utils import count_related from utilities.utils import count_related
@register_search(Site) @register_search()
class SiteIndex(SearchMixin): class SiteIndex(SearchIndex):
model = Site
queryset = Site.objects.prefetch_related('region', 'tenant', 'tenant__group') queryset = Site.objects.prefetch_related('region', 'tenant', 'tenant__group')
filterset = dcim.filtersets.SiteFilterSet filterset = dcim.filtersets.SiteFilterSet
table = dcim.tables.SiteTable table = dcim.tables.SiteTable
url = 'dcim:site_list' url = 'dcim:site_list'
choice_header = 'DCIM'
@register_search(Rack) @register_search()
class RackIndex(SearchMixin): class RackIndex(SearchIndex):
model = Rack
queryset = Rack.objects.prefetch_related('site', 'location', 'tenant', 'tenant__group', 'role').annotate( queryset = Rack.objects.prefetch_related('site', 'location', 'tenant', 'tenant__group', 'role').annotate(
device_count=count_related(Device, 'rack') device_count=count_related(Device, 'rack')
) )
filterset = dcim.filtersets.RackFilterSet filterset = dcim.filtersets.RackFilterSet
table = dcim.tables.RackTable table = dcim.tables.RackTable
url = 'dcim:rack_list' url = 'dcim:rack_list'
choice_header = 'DCIM'
@register_search(RackReservation) @register_search()
class RackReservationIndex(SearchMixin): class RackReservationIndex(SearchIndex):
model = RackReservation
queryset = RackReservation.objects.prefetch_related('rack', 'user') queryset = RackReservation.objects.prefetch_related('rack', 'user')
filterset = dcim.filtersets.RackReservationFilterSet filterset = dcim.filtersets.RackReservationFilterSet
table = dcim.tables.RackReservationTable table = dcim.tables.RackReservationTable
url = 'dcim:rackreservation_list' url = 'dcim:rackreservation_list'
choice_header = 'DCIM'
@register_search(Location) @register_search()
class LocationIndex(SearchMixin): class LocationIndex(SearchIndex):
model = Location
queryset = Location.objects.add_related_count( queryset = Location.objects.add_related_count(
Location.objects.add_related_count(Location.objects.all(), Device, 'location', 'device_count', cumulative=True), Location.objects.add_related_count(Location.objects.all(), Device, 'location', 'device_count', cumulative=True),
Rack, Rack,
@ -59,22 +59,22 @@ class LocationIndex(SearchMixin):
filterset = dcim.filtersets.LocationFilterSet filterset = dcim.filtersets.LocationFilterSet
table = dcim.tables.LocationTable table = dcim.tables.LocationTable
url = 'dcim:location_list' url = 'dcim:location_list'
choice_header = 'DCIM'
@register_search(DeviceType) @register_search()
class DeviceTypeIndex(SearchMixin): class DeviceTypeIndex(SearchIndex):
model = DeviceType
queryset = DeviceType.objects.prefetch_related('manufacturer').annotate( queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(
instance_count=count_related(Device, 'device_type') instance_count=count_related(Device, 'device_type')
) )
filterset = dcim.filtersets.DeviceTypeFilterSet filterset = dcim.filtersets.DeviceTypeFilterSet
table = dcim.tables.DeviceTypeTable table = dcim.tables.DeviceTypeTable
url = 'dcim:devicetype_list' url = 'dcim:devicetype_list'
choice_header = 'DCIM'
@register_search(Device) @register_search()
class DeviceIndex(SearchMixin): class DeviceIndex(SearchIndex):
model = Device
queryset = Device.objects.prefetch_related( queryset = Device.objects.prefetch_related(
'device_type__manufacturer', 'device_type__manufacturer',
'device_role', 'device_role',
@ -88,22 +88,22 @@ class DeviceIndex(SearchMixin):
filterset = dcim.filtersets.DeviceFilterSet filterset = dcim.filtersets.DeviceFilterSet
table = dcim.tables.DeviceTable table = dcim.tables.DeviceTable
url = 'dcim:device_list' url = 'dcim:device_list'
choice_header = 'DCIM'
@register_search(ModuleType) @register_search()
class ModuleTypeIndex(SearchMixin): class ModuleTypeIndex(SearchIndex):
model = ModuleType
queryset = ModuleType.objects.prefetch_related('manufacturer').annotate( queryset = ModuleType.objects.prefetch_related('manufacturer').annotate(
instance_count=count_related(Module, 'module_type') instance_count=count_related(Module, 'module_type')
) )
filterset = dcim.filtersets.ModuleTypeFilterSet filterset = dcim.filtersets.ModuleTypeFilterSet
table = dcim.tables.ModuleTypeTable table = dcim.tables.ModuleTypeTable
url = 'dcim:moduletype_list' url = 'dcim:moduletype_list'
choice_header = 'DCIM'
@register_search(Module) @register_search()
class ModuleIndex(SearchMixin): class ModuleIndex(SearchIndex):
model = Module
queryset = Module.objects.prefetch_related( queryset = Module.objects.prefetch_related(
'module_type__manufacturer', 'module_type__manufacturer',
'device', 'device',
@ -112,33 +112,32 @@ class ModuleIndex(SearchMixin):
filterset = dcim.filtersets.ModuleFilterSet filterset = dcim.filtersets.ModuleFilterSet
table = dcim.tables.ModuleTable table = dcim.tables.ModuleTable
url = 'dcim:module_list' url = 'dcim:module_list'
choice_header = 'DCIM'
@register_search(VirtualChassis) @register_search()
class VirtualChassisIndex(SearchMixin): class VirtualChassisIndex(SearchIndex):
model = VirtualChassis
queryset = VirtualChassis.objects.prefetch_related('master').annotate( queryset = VirtualChassis.objects.prefetch_related('master').annotate(
member_count=count_related(Device, 'virtual_chassis') member_count=count_related(Device, 'virtual_chassis')
) )
filterset = dcim.filtersets.VirtualChassisFilterSet filterset = dcim.filtersets.VirtualChassisFilterSet
table = dcim.tables.VirtualChassisTable table = dcim.tables.VirtualChassisTable
url = 'dcim:virtualchassis_list' url = 'dcim:virtualchassis_list'
choice_header = 'DCIM'
@register_search(Cable) @register_search()
class CableIndex(SearchMixin): class CableIndex(SearchIndex):
model = Cable
queryset = Cable.objects.all() queryset = Cable.objects.all()
filterset = dcim.filtersets.CableFilterSet filterset = dcim.filtersets.CableFilterSet
table = dcim.tables.CableTable table = dcim.tables.CableTable
url = 'dcim:cable_list' url = 'dcim:cable_list'
choice_header = 'DCIM'
@register_search(PowerFeed) @register_search()
class PowerFeedIndex(SearchMixin): class PowerFeedIndex(SearchIndex):
model = PowerFeed
queryset = PowerFeed.objects.all() queryset = PowerFeed.objects.all()
filterset = dcim.filtersets.PowerFeedFilterSet filterset = dcim.filtersets.PowerFeedFilterSet
table = dcim.tables.PowerFeedTable table = dcim.tables.PowerFeedTable
url = 'dcim:powerfeed_list' url = 'dcim:powerfeed_list'
choice_header = 'DCIM'

View File

@ -1,20 +1,14 @@
import extras.filtersets import extras.filtersets
import extras.tables import extras.tables
from django.db import models
from extras.models import JournalEntry from extras.models import JournalEntry
from netbox.search.models import SearchMixin from netbox.search import SearchIndex, register_search
from utilities.utils import count_related
class JournalEntryIndex(SearchMixin): @register_search()
class JournalEntryIndex(SearchIndex):
model = JournalEntry model = JournalEntry
queryset = JournalEntry.objects.prefetch_related('assigned_object', 'created_by') queryset = JournalEntry.objects.prefetch_related('assigned_object', 'created_by')
filterset = extras.filtersets.JournalEntryFilterSet filterset = extras.filtersets.JournalEntryFilterSet
table = extras.tables.JournalEntryTable table = extras.tables.JournalEntryTable
url = 'extras:journalentry_list' url = 'extras:journalentry_list'
choice_header = 'Journal' category = 'Journal'
JOURNAL_SEARCH_TYPES = {
'journalentry': JournalEntryIndex,
}

View File

@ -1,70 +1,69 @@
import ipam.filtersets import ipam.filtersets
import ipam.tables import ipam.tables
from ipam.models import ASN, VLAN, VRF, Aggregate, IPAddress, Prefix, Service from ipam.models import ASN, VLAN, VRF, Aggregate, IPAddress, Prefix, Service
from netbox.search.models import SearchMixin from netbox.search import SearchIndex, register_search
from netbox.search import register_search
@register_search(VRF) @register_search()
class VRFIndex(SearchMixin): class VRFIndex(SearchIndex):
model = VRF
queryset = VRF.objects.prefetch_related('tenant', 'tenant__group') queryset = VRF.objects.prefetch_related('tenant', 'tenant__group')
filterset = ipam.filtersets.VRFFilterSet filterset = ipam.filtersets.VRFFilterSet
table = ipam.tables.VRFTable table = ipam.tables.VRFTable
url = 'ipam:vrf_list' url = 'ipam:vrf_list'
choice_header = 'IPAM'
@register_search(Aggregate) @register_search()
class AggregateIndex(SearchMixin): class AggregateIndex(SearchIndex):
model = Aggregate
queryset = Aggregate.objects.prefetch_related('rir') queryset = Aggregate.objects.prefetch_related('rir')
filterset = ipam.filtersets.AggregateFilterSet filterset = ipam.filtersets.AggregateFilterSet
table = ipam.tables.AggregateTable table = ipam.tables.AggregateTable
url = 'ipam:aggregate_list' url = 'ipam:aggregate_list'
choice_header = 'IPAM'
@register_search(Prefix) @register_search()
class PrefixIndex(SearchMixin): class PrefixIndex(SearchIndex):
model = Prefix
queryset = Prefix.objects.prefetch_related( queryset = Prefix.objects.prefetch_related(
'site', 'vrf__tenant', 'tenant', 'tenant__group', 'vlan', 'role' 'site', 'vrf__tenant', 'tenant', 'tenant__group', 'vlan', 'role'
) )
filterset = ipam.filtersets.PrefixFilterSet filterset = ipam.filtersets.PrefixFilterSet
table = ipam.tables.PrefixTable table = ipam.tables.PrefixTable
url = 'ipam:prefix_list' url = 'ipam:prefix_list'
choice_header = 'IPAM'
@register_search(IPAddress) @register_search()
class IPAddressIndex(SearchMixin): class IPAddressIndex(SearchIndex):
model = IPAddress
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant', 'tenant__group') queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant', 'tenant__group')
filterset = ipam.filtersets.IPAddressFilterSet filterset = ipam.filtersets.IPAddressFilterSet
table = ipam.tables.IPAddressTable table = ipam.tables.IPAddressTable
url = 'ipam:ipaddress_list' url = 'ipam:ipaddress_list'
choice_header = 'IPAM'
@register_search(VLAN) @register_search()
class VLANIndex(SearchMixin): class VLANIndex(SearchIndex):
model = VLAN
queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'tenant__group', 'role') queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'tenant__group', 'role')
filterset = ipam.filtersets.VLANFilterSet filterset = ipam.filtersets.VLANFilterSet
table = ipam.tables.VLANTable table = ipam.tables.VLANTable
url = 'ipam:vlan_list' url = 'ipam:vlan_list'
choice_header = 'IPAM'
@register_search(ASN) @register_search()
class ASNIndex(SearchMixin): class ASNIndex(SearchIndex):
model = ASN
queryset = ASN.objects.prefetch_related('rir', 'tenant', 'tenant__group') queryset = ASN.objects.prefetch_related('rir', 'tenant', 'tenant__group')
filterset = ipam.filtersets.ASNFilterSet filterset = ipam.filtersets.ASNFilterSet
table = ipam.tables.ASNTable table = ipam.tables.ASNTable
url = 'ipam:asn_list' url = 'ipam:asn_list'
choice_header = 'IPAM'
@register_search(Service) @register_search()
class ServiceIndex(SearchMixin): class ServiceIndex(SearchIndex):
model = Service
queryset = Service.objects.prefetch_related('device', 'virtual_machine') queryset = Service.objects.prefetch_related('device', 'virtual_machine')
filterset = ipam.filtersets.ServiceFilterSet filterset = ipam.filtersets.ServiceFilterSet
table = ipam.tables.ServiceTable table = ipam.tables.ServiceTable
url = 'ipam:service_list' url = 'ipam:service_list'
choice_header = 'IPAM'

View File

@ -1 +1,14 @@
from .register import register_search from .register import register_search
class SearchIndex:
"""
Base class for building search indexes.
"""
search_index = True
@classmethod
def get_category(cls):
if hasattr(cls, 'category'):
return cls.category
return cls.model._meta.app_config.verbose_name

View File

@ -93,7 +93,7 @@ class SearchBackend(object):
for name, cls in models.items(): for name, cls in models.items():
model = cls.queryset.model model = cls.queryset.model
title = model._meta.verbose_name.title() title = model._meta.verbose_name.title()
categories[cls.choice_header][name] = title categories[cls.get_category()][name] = title
# Compile a nested tuple of choices for form rendering # Compile a nested tuple of choices for form rendering
results = ( results = (

View File

@ -1,5 +0,0 @@
class SearchMixin(object):
"""
Base class for building search indexes.
"""
search_index = True

View File

@ -44,8 +44,9 @@ def register():
default_search_engine.register(cls_name, cls_obj) default_search_engine.register(cls_name, cls_obj)
def register_search(model): def register_search():
def _wrapper(cls): def _wrapper(cls):
model = cls.model
app_label = model._meta.app_label app_label = model._meta.app_label
model_name = model._meta.model_name model_name = model._meta.model_name

View File

@ -1,26 +1,25 @@
import tenancy.filtersets import tenancy.filtersets
import tenancy.tables import tenancy.tables
from netbox.search.models import SearchMixin from netbox.search import SearchIndex, register_search
from netbox.search import register_search
from tenancy.models import Contact, ContactAssignment, Tenant from tenancy.models import Contact, ContactAssignment, Tenant
from utilities.utils import count_related from utilities.utils import count_related
@register_search(Tenant) @register_search()
class TenantIndex(SearchMixin): class TenantIndex(SearchIndex):
model = Tenant
queryset = Tenant.objects.prefetch_related('group') queryset = Tenant.objects.prefetch_related('group')
filterset = tenancy.filtersets.TenantFilterSet filterset = tenancy.filtersets.TenantFilterSet
table = tenancy.tables.TenantTable table = tenancy.tables.TenantTable
url = 'tenancy:tenant_list' url = 'tenancy:tenant_list'
choice_header = 'Tenancy'
@register_search(Contact) @register_search()
class ContactIndex(SearchMixin): class ContactIndex(SearchIndex):
model = Contact
queryset = Contact.objects.prefetch_related('group', 'assignments').annotate( queryset = Contact.objects.prefetch_related('group', 'assignments').annotate(
assignment_count=count_related(ContactAssignment, 'contact') assignment_count=count_related(ContactAssignment, 'contact')
) )
filterset = tenancy.filtersets.ContactFilterSet filterset = tenancy.filtersets.ContactFilterSet
table = tenancy.tables.ContactTable table = tenancy.tables.ContactTable
url = 'tenancy:contact_list' url = 'tenancy:contact_list'
choice_header = 'Tenancy'

View File

@ -1,25 +1,25 @@
import virtualization.filtersets import virtualization.filtersets
import virtualization.tables import virtualization.tables
from dcim.models import Device from dcim.models import Device
from netbox.search.models import SearchMixin from netbox.search import SearchIndex, register_search
from netbox.search import register_search
from utilities.utils import count_related from utilities.utils import count_related
from virtualization.models import Cluster, VirtualMachine from virtualization.models import Cluster, VirtualMachine
@register_search(Cluster) @register_search()
class ClusterIndex(SearchMixin): class ClusterIndex(SearchIndex):
model = Cluster
queryset = Cluster.objects.prefetch_related('type', 'group').annotate( queryset = Cluster.objects.prefetch_related('type', 'group').annotate(
device_count=count_related(Device, 'cluster'), vm_count=count_related(VirtualMachine, 'cluster') device_count=count_related(Device, 'cluster'), vm_count=count_related(VirtualMachine, 'cluster')
) )
filterset = virtualization.filtersets.ClusterFilterSet filterset = virtualization.filtersets.ClusterFilterSet
table = virtualization.tables.ClusterTable table = virtualization.tables.ClusterTable
url = 'virtualization:cluster_list' url = 'virtualization:cluster_list'
choice_header = 'Virtualization'
@register_search(VirtualMachine) @register_search()
class VirtualMachineIndex(SearchMixin): class VirtualMachineIndex(SearchIndex):
model = VirtualMachine
queryset = VirtualMachine.objects.prefetch_related( queryset = VirtualMachine.objects.prefetch_related(
'cluster', 'cluster',
'tenant', 'tenant',
@ -31,4 +31,3 @@ class VirtualMachineIndex(SearchMixin):
filterset = virtualization.filtersets.VirtualMachineFilterSet filterset = virtualization.filtersets.VirtualMachineFilterSet
table = virtualization.tables.VirtualMachineTable table = virtualization.tables.VirtualMachineTable
url = 'virtualization:virtualmachine_list' url = 'virtualization:virtualmachine_list'
choice_header = 'Virtualization'

View File

@ -1,27 +1,26 @@
import wireless.filtersets import wireless.filtersets
import wireless.tables import wireless.tables
from dcim.models import Interface from dcim.models import Interface
from netbox.search.models import SearchMixin from netbox.search import SearchIndex, register_search
from netbox.search import register_search
from utilities.utils import count_related from utilities.utils import count_related
from wireless.models import WirelessLAN, WirelessLink from wireless.models import WirelessLAN, WirelessLink
@register_search(WirelessLAN) @register_search()
class WirelessLANIndex(SearchMixin): class WirelessLANIndex(SearchIndex):
model = WirelessLAN
queryset = WirelessLAN.objects.prefetch_related('group', 'vlan').annotate( queryset = WirelessLAN.objects.prefetch_related('group', 'vlan').annotate(
interface_count=count_related(Interface, 'wireless_lans') interface_count=count_related(Interface, 'wireless_lans')
) )
filterset = wireless.filtersets.WirelessLANFilterSet filterset = wireless.filtersets.WirelessLANFilterSet
table = wireless.tables.WirelessLANTable table = wireless.tables.WirelessLANTable
url = 'wireless:wirelesslan_list' url = 'wireless:wirelesslan_list'
choice_header = 'Wireless'
@register_search(WirelessLink) @register_search()
class WirelessLinkIndex(SearchMixin): class WirelessLinkIndex(SearchIndex):
model = WirelessLink
queryset = WirelessLink.objects.prefetch_related('interface_a__device', 'interface_b__device') queryset = WirelessLink.objects.prefetch_related('interface_a__device', 'interface_b__device')
filterset = wireless.filtersets.WirelessLinkFilterSet filterset = wireless.filtersets.WirelessLinkFilterSet
table = wireless.tables.WirelessLinkTable table = wireless.tables.WirelessLinkTable
url = 'wireless:wirelesslink_list' url = 'wireless:wirelesslink_list'
choice_header = 'Wireless'