1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00
Files
netbox-community-netbox/netbox/netbox/views.py

248 lines
8.6 KiB
Python
Raw Normal View History

2017-05-24 11:33:11 -04:00
from __future__ import unicode_literals
2016-05-24 12:38:06 -04:00
from collections import OrderedDict
2017-03-09 15:05:01 -05:00
2016-03-01 11:23:03 -05:00
from django.shortcuts import render
2017-03-29 12:04:57 -04:00
from django.views.generic import View
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework.views import APIView
2017-03-29 12:04:57 -04:00
from circuits.filters import CircuitFilter, ProviderFilter
from circuits.models import Circuit, Provider
from circuits.tables import CircuitTable, ProviderTable
2017-03-29 12:04:57 -04:00
from dcim.filters import DeviceFilter, DeviceTypeFilter, RackFilter, SiteFilter
from dcim.models import ConsolePort, Device, DeviceType, InterfaceConnection, PowerPort, Rack, Site
from dcim.tables import DeviceDetailTable, DeviceTypeTable, RackTable, SiteTable
from extras.models import TopologyMap, UserAction
2017-03-29 12:04:57 -04:00
from ipam.filters import AggregateFilter, IPAddressFilter, PrefixFilter, VLANFilter, VRFFilter
from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF
from ipam.tables import AggregateTable, IPAddressTable, PrefixTable, VLANTable, VRFTable
2017-03-29 12:04:57 -04:00
from secrets.filters import SecretFilter
2016-03-01 11:23:03 -05:00
from secrets.models import Secret
from secrets.tables import SecretTable
2017-03-29 12:04:57 -04:00
from tenancy.filters import TenantFilter
2016-07-26 14:58:37 -04:00
from tenancy.models import Tenant
from tenancy.tables import TenantTable
from virtualization.filters import ClusterFilter, VirtualMachineFilter
from virtualization.models import Cluster, VirtualMachine
from virtualization.tables import ClusterTable, VirtualMachineDetailTable
2017-03-29 12:04:57 -04:00
from .forms import SearchForm
SEARCH_MAX_RESULTS = 15
SEARCH_TYPES = OrderedDict((
2017-03-29 12:04:57 -04:00
# Circuits
('provider', {
'queryset': Provider.objects.all(),
2017-03-29 12:04:57 -04:00
'filter': ProviderFilter,
'table': ProviderTable,
2017-03-29 12:04:57 -04:00
'url': 'circuits:provider_list',
}),
('circuit', {
'queryset': Circuit.objects.select_related('type', 'provider', 'tenant').prefetch_related('terminations__site'),
2017-03-29 12:04:57 -04:00
'filter': CircuitFilter,
'table': CircuitTable,
2017-03-29 12:04:57 -04:00
'url': 'circuits:circuit_list',
}),
2017-03-29 12:04:57 -04:00
# DCIM
('site', {
2017-03-29 12:04:57 -04:00
'queryset': Site.objects.select_related('region', 'tenant'),
'filter': SiteFilter,
'table': SiteTable,
2017-03-29 12:04:57 -04:00
'url': 'dcim:site_list',
}),
('rack', {
'queryset': Rack.objects.select_related('site', 'group', 'tenant', 'role'),
2017-03-29 12:04:57 -04:00
'filter': RackFilter,
'table': RackTable,
2017-03-29 12:04:57 -04:00
'url': 'dcim:rack_list',
}),
('devicetype', {
'queryset': DeviceType.objects.select_related('manufacturer'),
2017-03-29 12:04:57 -04:00
'filter': DeviceTypeFilter,
'table': DeviceTypeTable,
2017-03-29 12:04:57 -04:00
'url': 'dcim:devicetype_list',
}),
('device', {
'queryset': Device.objects.select_related(
'device_type__manufacturer', 'device_role', 'tenant', 'site', 'rack', 'primary_ip4', 'primary_ip6',
),
2017-03-29 12:04:57 -04:00
'filter': DeviceFilter,
'table': DeviceDetailTable,
2017-03-29 12:04:57 -04:00
'url': 'dcim:device_list',
}),
2017-03-29 12:04:57 -04:00
# IPAM
('vrf', {
2017-03-29 12:04:57 -04:00
'queryset': VRF.objects.select_related('tenant'),
'filter': VRFFilter,
'table': VRFTable,
2017-03-29 12:04:57 -04:00
'url': 'ipam:vrf_list',
}),
('aggregate', {
2017-03-29 12:04:57 -04:00
'queryset': Aggregate.objects.select_related('rir'),
'filter': AggregateFilter,
'table': AggregateTable,
2017-03-29 12:04:57 -04:00
'url': 'ipam:aggregate_list',
}),
('prefix', {
2017-03-29 12:04:57 -04:00
'queryset': Prefix.objects.select_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role'),
'filter': PrefixFilter,
'table': PrefixTable,
2017-03-29 12:04:57 -04:00
'url': 'ipam:prefix_list',
}),
('ipaddress', {
'queryset': IPAddress.objects.select_related('vrf__tenant', 'tenant'),
2017-03-29 12:04:57 -04:00
'filter': IPAddressFilter,
'table': IPAddressTable,
2017-03-29 12:04:57 -04:00
'url': 'ipam:ipaddress_list',
}),
('vlan', {
'queryset': VLAN.objects.select_related('site', 'group', 'tenant', 'role'),
2017-03-29 12:04:57 -04:00
'filter': VLANFilter,
'table': VLANTable,
2017-03-29 12:04:57 -04:00
'url': 'ipam:vlan_list',
}),
2017-03-29 12:04:57 -04:00
# Secrets
('secret', {
2017-03-29 12:04:57 -04:00
'queryset': Secret.objects.select_related('role', 'device'),
'filter': SecretFilter,
'table': SecretTable,
2017-03-29 12:04:57 -04:00
'url': 'secrets:secret_list',
}),
2017-03-29 12:04:57 -04:00
# Tenancy
('tenant', {
2017-03-29 12:04:57 -04:00
'queryset': Tenant.objects.select_related('group'),
'filter': TenantFilter,
'table': TenantTable,
2017-03-29 12:04:57 -04:00
'url': 'tenancy:tenant_list',
}),
# Virtualization
('cluster', {
'queryset': Cluster.objects.all(),
'filter': ClusterFilter,
'table': ClusterTable,
'url': 'virtualization:cluster_list',
}),
('virtualmachine', {
'queryset': VirtualMachine.objects.select_related(
'cluster', 'tenant', 'platform', 'primary_ip4', 'primary_ip6',
),
'filter': VirtualMachineFilter,
'table': VirtualMachineDetailTable,
'url': 'virtualization:virtualmachine_list',
}),
))
2016-03-01 11:23:03 -05:00
2017-05-19 16:03:51 -04:00
class HomeView(View):
template_name = 'home.html'
2016-03-01 11:23:03 -05:00
2017-05-19 16:03:51 -04:00
def get(self, request):
stats = {
2016-03-01 11:23:03 -05:00
2017-05-19 16:03:51 -04:00
# Organization
'site_count': Site.objects.count(),
'tenant_count': Tenant.objects.count(),
2016-07-26 14:58:37 -04:00
2017-05-19 16:03:51 -04:00
# DCIM
'rack_count': Rack.objects.count(),
'device_count': Device.objects.count(),
'interface_connections_count': InterfaceConnection.objects.count(),
'console_connections_count': ConsolePort.objects.filter(cs_port__isnull=False).count(),
'power_connections_count': PowerPort.objects.filter(power_outlet__isnull=False).count(),
2016-03-01 11:23:03 -05:00
2017-05-19 16:03:51 -04:00
# IPAM
'vrf_count': VRF.objects.count(),
'aggregate_count': Aggregate.objects.count(),
'prefix_count': Prefix.objects.count(),
'ipaddress_count': IPAddress.objects.count(),
'vlan_count': VLAN.objects.count(),
2016-03-01 11:23:03 -05:00
2017-05-19 16:03:51 -04:00
# Circuits
'provider_count': Provider.objects.count(),
'circuit_count': Circuit.objects.count(),
2016-03-01 11:23:03 -05:00
2017-05-19 16:03:51 -04:00
# Secrets
'secret_count': Secret.objects.count(),
2016-03-01 11:23:03 -05:00
# Virtualization
'cluster_count': Cluster.objects.count(),
'virtualmachine_count': VirtualMachine.objects.count(),
2017-05-19 16:03:51 -04:00
}
2016-03-01 11:23:03 -05:00
2017-05-19 16:03:51 -04:00
return render(request, self.template_name, {
'search_form': SearchForm(),
'stats': stats,
'topology_maps': TopologyMap.objects.filter(site__isnull=True),
'recent_activity': UserAction.objects.select_related('user')[:50]
})
2016-03-01 11:23:03 -05:00
2017-03-29 12:04:57 -04:00
class SearchView(View):
def get(self, request):
# No query
if 'q' not in request.GET:
return render(request, 'search.html', {
'form': SearchForm(),
})
form = SearchForm(request.GET)
results = []
if form.is_valid():
# Searching for a single type of object
if form.cleaned_data['obj_type']:
obj_types = [form.cleaned_data['obj_type']]
# Searching all object types
else:
obj_types = SEARCH_TYPES.keys()
for obj_type in obj_types:
2017-03-29 12:04:57 -04:00
queryset = SEARCH_TYPES[obj_type]['queryset']
filter_cls = SEARCH_TYPES[obj_type]['filter']
2017-03-29 12:04:57 -04:00
table = SEARCH_TYPES[obj_type]['table']
url = SEARCH_TYPES[obj_type]['url']
# Construct the results table for this object type
filtered_queryset = filter_cls({'q': form.cleaned_data['q']}, queryset=queryset).qs
table = table(filtered_queryset, orderable=False)
table.paginate(per_page=SEARCH_MAX_RESULTS)
if table.page:
2017-03-29 12:04:57 -04:00
results.append({
'name': queryset.model._meta.verbose_name_plural,
'table': table,
2017-05-24 11:33:11 -04:00
'url': '{}?q={}'.format(reverse(url), form.cleaned_data['q'])
2017-03-29 12:04:57 -04:00
})
return render(request, 'search.html', {
'form': form,
'results': results,
})
2017-03-09 15:05:01 -05:00
class APIRootView(APIView):
2017-03-09 15:18:50 -05:00
_ignore_model_permissions = True
exclude_from_schema = True
2017-03-09 15:05:01 -05:00
def get_view_name(self):
2017-05-24 11:33:11 -04:00
return "API Root"
2017-03-09 15:05:01 -05:00
def get(self, request, format=None):
2017-08-31 11:36:29 -04:00
return Response(OrderedDict((
('circuits', reverse('circuits-api:api-root', request=request, format=format)),
('dcim', reverse('dcim-api:api-root', request=request, format=format)),
('extras', reverse('extras-api:api-root', request=request, format=format)),
('ipam', reverse('ipam-api:api-root', request=request, format=format)),
('secrets', reverse('secrets-api:api-root', request=request, format=format)),
('tenancy', reverse('tenancy-api:api-root', request=request, format=format)),
('virtualization', reverse('virtualization-api:api-root', request=request, format=format)),
)))