|
|
@@ -1,187 +1,23 @@
|
|
|
-from collections import OrderedDict
|
|
|
-
|
|
|
from django.conf import settings
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
-from django.db.models import Count, F
|
|
|
+from django.db.models import F
|
|
|
from django.shortcuts import render
|
|
|
from django.urls import reverse
|
|
|
from django.views.generic import View
|
|
|
from packaging import version
|
|
|
|
|
|
-from circuits.filters import CircuitFilterSet, ProviderFilterSet
|
|
|
from circuits.models import Circuit, Provider
|
|
|
-from circuits.tables import CircuitTable, ProviderTable
|
|
|
-from dcim.filters import (
|
|
|
- CableFilterSet, DeviceFilterSet, DeviceTypeFilterSet, PowerFeedFilterSet, RackFilterSet, RackGroupFilterSet,
|
|
|
- SiteFilterSet, VirtualChassisFilterSet,
|
|
|
-)
|
|
|
-from dcim.models import (
|
|
|
- Cable, ConsolePort, Device, DeviceType, Interface, PowerPanel, PowerFeed, PowerPort, Rack, RackGroup, Site,
|
|
|
- VirtualChassis,
|
|
|
-)
|
|
|
-from dcim.tables import (
|
|
|
- CableTable, DeviceTable, DeviceTypeTable, PowerFeedTable, RackTable, RackGroupTable, SiteTable,
|
|
|
- VirtualChassisTable,
|
|
|
-)
|
|
|
+from dcim.models import Cable, ConsolePort, Device, DeviceType, Interface, PowerPanel, PowerFeed, PowerPort, Rack, Site
|
|
|
from extras.choices import JobResultStatusChoices
|
|
|
from extras.models import ObjectChange, JobResult
|
|
|
-from ipam.filters import AggregateFilterSet, IPAddressFilterSet, PrefixFilterSet, VLANFilterSet, VRFFilterSet
|
|
|
from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF
|
|
|
-from ipam.tables import AggregateTable, IPAddressTable, PrefixTable, VLANTable, VRFTable
|
|
|
from netbox.releases import get_latest_release
|
|
|
-from secrets.filters import SecretFilterSet
|
|
|
from secrets.models import Secret
|
|
|
-from secrets.tables import SecretTable
|
|
|
-from tenancy.filters import TenantFilterSet
|
|
|
from tenancy.models import Tenant
|
|
|
-from tenancy.tables import TenantTable
|
|
|
-from utilities.utils import get_subquery
|
|
|
-from virtualization.filters import ClusterFilterSet, VirtualMachineFilterSet
|
|
|
from virtualization.models import Cluster, VirtualMachine
|
|
|
-from virtualization.tables import ClusterTable, VirtualMachineDetailTable
|
|
|
+from .constants import SEARCH_MAX_RESULTS, SEARCH_TYPES
|
|
|
from .forms import SearchForm
|
|
|
|
|
|
-SEARCH_MAX_RESULTS = 15
|
|
|
-SEARCH_TYPES = OrderedDict((
|
|
|
- # Circuits
|
|
|
- ('provider', {
|
|
|
- 'queryset': Provider.objects.annotate(
|
|
|
- count_circuits=Count('circuits')
|
|
|
- ).order_by(*Provider._meta.ordering),
|
|
|
- 'filterset': ProviderFilterSet,
|
|
|
- 'table': ProviderTable,
|
|
|
- 'url': 'circuits:provider_list',
|
|
|
- }),
|
|
|
- ('circuit', {
|
|
|
- 'queryset': Circuit.objects.prefetch_related(
|
|
|
- 'type', 'provider', 'tenant', 'terminations__site'
|
|
|
- ).annotate_sites(),
|
|
|
- 'filterset': CircuitFilterSet,
|
|
|
- 'table': CircuitTable,
|
|
|
- 'url': 'circuits:circuit_list',
|
|
|
- }),
|
|
|
- # DCIM
|
|
|
- ('site', {
|
|
|
- 'queryset': Site.objects.prefetch_related('region', 'tenant'),
|
|
|
- 'filterset': SiteFilterSet,
|
|
|
- 'table': SiteTable,
|
|
|
- 'url': 'dcim:site_list',
|
|
|
- }),
|
|
|
- ('rack', {
|
|
|
- 'queryset': Rack.objects.prefetch_related('site', 'group', 'tenant', 'role'),
|
|
|
- 'filterset': RackFilterSet,
|
|
|
- 'table': RackTable,
|
|
|
- 'url': 'dcim:rack_list',
|
|
|
- }),
|
|
|
- ('rackgroup', {
|
|
|
- 'queryset': RackGroup.objects.prefetch_related('site').annotate(
|
|
|
- rack_count=Count('racks')
|
|
|
- ).order_by(*RackGroup._meta.ordering),
|
|
|
- 'filterset': RackGroupFilterSet,
|
|
|
- 'table': RackGroupTable,
|
|
|
- 'url': 'dcim:rackgroup_list',
|
|
|
- }),
|
|
|
- ('devicetype', {
|
|
|
- 'queryset': DeviceType.objects.prefetch_related('manufacturer').annotate(
|
|
|
- instance_count=Count('instances')
|
|
|
- ).order_by(*DeviceType._meta.ordering),
|
|
|
- 'filterset': DeviceTypeFilterSet,
|
|
|
- 'table': DeviceTypeTable,
|
|
|
- 'url': 'dcim:devicetype_list',
|
|
|
- }),
|
|
|
- ('device', {
|
|
|
- 'queryset': Device.objects.prefetch_related(
|
|
|
- 'device_type__manufacturer', 'device_role', 'tenant', 'site', 'rack', 'primary_ip4', 'primary_ip6',
|
|
|
- ),
|
|
|
- 'filterset': DeviceFilterSet,
|
|
|
- 'table': DeviceTable,
|
|
|
- 'url': 'dcim:device_list',
|
|
|
- }),
|
|
|
- ('virtualchassis', {
|
|
|
- 'queryset': VirtualChassis.objects.prefetch_related('master').annotate(
|
|
|
- member_count=Count('members', distinct=True)
|
|
|
- ).order_by(*VirtualChassis._meta.ordering),
|
|
|
- 'filterset': VirtualChassisFilterSet,
|
|
|
- 'table': VirtualChassisTable,
|
|
|
- 'url': 'dcim:virtualchassis_list',
|
|
|
- }),
|
|
|
- ('cable', {
|
|
|
- 'queryset': Cable.objects.all(),
|
|
|
- 'filterset': CableFilterSet,
|
|
|
- 'table': CableTable,
|
|
|
- 'url': 'dcim:cable_list',
|
|
|
- }),
|
|
|
- ('powerfeed', {
|
|
|
- 'queryset': PowerFeed.objects.all(),
|
|
|
- 'filterset': PowerFeedFilterSet,
|
|
|
- 'table': PowerFeedTable,
|
|
|
- 'url': 'dcim:powerfeed_list',
|
|
|
- }),
|
|
|
- # Virtualization
|
|
|
- ('cluster', {
|
|
|
- 'queryset': Cluster.objects.prefetch_related('type', 'group').annotate(
|
|
|
- device_count=get_subquery(Device, 'cluster'),
|
|
|
- vm_count=get_subquery(VirtualMachine, 'cluster')
|
|
|
- ),
|
|
|
- 'filterset': ClusterFilterSet,
|
|
|
- 'table': ClusterTable,
|
|
|
- 'url': 'virtualization:cluster_list',
|
|
|
- }),
|
|
|
- ('virtualmachine', {
|
|
|
- 'queryset': VirtualMachine.objects.prefetch_related(
|
|
|
- 'cluster', 'tenant', 'platform', 'primary_ip4', 'primary_ip6',
|
|
|
- ),
|
|
|
- 'filterset': VirtualMachineFilterSet,
|
|
|
- 'table': VirtualMachineDetailTable,
|
|
|
- 'url': 'virtualization:virtualmachine_list',
|
|
|
- }),
|
|
|
- # IPAM
|
|
|
- ('vrf', {
|
|
|
- 'queryset': VRF.objects.prefetch_related('tenant'),
|
|
|
- 'filterset': VRFFilterSet,
|
|
|
- 'table': VRFTable,
|
|
|
- 'url': 'ipam:vrf_list',
|
|
|
- }),
|
|
|
- ('aggregate', {
|
|
|
- 'queryset': Aggregate.objects.prefetch_related('rir'),
|
|
|
- 'filterset': AggregateFilterSet,
|
|
|
- 'table': AggregateTable,
|
|
|
- 'url': 'ipam:aggregate_list',
|
|
|
- }),
|
|
|
- ('prefix', {
|
|
|
- 'queryset': Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role'),
|
|
|
- 'filterset': PrefixFilterSet,
|
|
|
- 'table': PrefixTable,
|
|
|
- 'url': 'ipam:prefix_list',
|
|
|
- }),
|
|
|
- ('ipaddress', {
|
|
|
- 'queryset': IPAddress.objects.prefetch_related('vrf__tenant', 'tenant'),
|
|
|
- 'filterset': IPAddressFilterSet,
|
|
|
- 'table': IPAddressTable,
|
|
|
- 'url': 'ipam:ipaddress_list',
|
|
|
- }),
|
|
|
- ('vlan', {
|
|
|
- 'queryset': VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role'),
|
|
|
- 'filterset': VLANFilterSet,
|
|
|
- 'table': VLANTable,
|
|
|
- 'url': 'ipam:vlan_list',
|
|
|
- }),
|
|
|
- # Secrets
|
|
|
- ('secret', {
|
|
|
- 'queryset': Secret.objects.prefetch_related('role', 'device'),
|
|
|
- 'filterset': SecretFilterSet,
|
|
|
- 'table': SecretTable,
|
|
|
- 'url': 'secrets:secret_list',
|
|
|
- }),
|
|
|
- # Tenancy
|
|
|
- ('tenant', {
|
|
|
- 'queryset': Tenant.objects.prefetch_related('group'),
|
|
|
- 'filterset': TenantFilterSet,
|
|
|
- 'table': TenantTable,
|
|
|
- 'url': 'tenancy:tenant_list',
|
|
|
- }),
|
|
|
-))
|
|
|
-
|
|
|
|
|
|
class HomeView(View):
|
|
|
template_name = 'home.html'
|