From 0c9e7aa074f82f7871c8304b9846ea88524b4362 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 25 Jan 2023 12:26:38 -0500 Subject: [PATCH] Clean up related objects for sites, tenants --- netbox/dcim/views.py | 36 ++--- netbox/templates/dcim/site.html | 136 +--------------- .../templates/inc/panels/related_objects.html | 21 +++ netbox/templates/tenancy/tenant.html | 148 ++++-------------- netbox/tenancy/views.py | 52 +++--- 5 files changed, 99 insertions(+), 294 deletions(-) create mode 100644 netbox/templates/inc/panels/related_objects.html diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 63fdc47e0..0edfe213c 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -335,19 +335,25 @@ class SiteView(generic.ObjectView): queryset = Site.objects.prefetch_related('tenant__group') def get_extra_context(self, request, instance): - stats = { - 'location_count': Location.objects.restrict(request.user, 'view').filter(site=instance).count(), - 'rack_count': Rack.objects.restrict(request.user, 'view').filter(site=instance).count(), - 'device_count': Device.objects.restrict(request.user, 'view').filter(site=instance).count(), - 'prefix_count': Prefix.objects.restrict(request.user, 'view').filter(site=instance).count(), - 'vlangroup_count': VLANGroup.objects.restrict(request.user, 'view').filter( + related_models = [ + # DCIM + Location.objects.restrict(request.user, 'view').filter(site=instance), + Rack.objects.restrict(request.user, 'view').filter(site=instance), + Device.objects.restrict(request.user, 'view').filter(site=instance), + # Virtualization + VirtualMachine.objects.restrict(request.user, 'view').filter(cluster__site=instance), + # IPAM + Prefix.objects.restrict(request.user, 'view').filter(site=instance), + ASN.objects.restrict(request.user, 'view').filter(sites=instance), + VLANGroup.objects.restrict(request.user, 'view').filter( scope_type=ContentType.objects.get_for_model(Site), scope_id=instance.pk - ).count(), - 'vlan_count': VLAN.objects.restrict(request.user, 'view').filter(site=instance).count(), - 'circuit_count': Circuit.objects.restrict(request.user, 'view').filter(terminations__site=instance).distinct().count(), - 'vm_count': VirtualMachine.objects.restrict(request.user, 'view').filter(cluster__site=instance).count(), - } + ), + VLAN.objects.restrict(request.user, 'view').filter(site=instance), + # Circuits + Circuit.objects.restrict(request.user, 'view').filter(terminations__site=instance).distinct(), + ] + locations = Location.objects.add_related_count( Location.objects.all(), Rack, @@ -369,15 +375,9 @@ class SiteView(generic.ObjectView): parent_bay__isnull=True ).prefetch_related('device_type__manufacturer', 'parent_bay', 'device_role') - asns = ASN.objects.restrict(request.user, 'view').filter(sites=instance) - asn_count = asns.count() - - stats.update({'asn_count': asn_count}) - return { - 'stats': stats, + 'related_models': related_models, 'locations': locations, - 'asns': asns, 'nonracked_devices': nonracked_devices.order_by('-pk')[:10], 'total_nonracked_devices_count': nonracked_devices.count(), } diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index a4ee4180f..d6de8f3cb 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -126,112 +126,7 @@ {% plugin_left_page object %}
-
-
Related Objects
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Locations - {% if stats.location_count %} - {{ stats.location_count }} - {% else %} - {{ ''|placeholder }} - {% endif %} -
Racks - {% if stats.rack_count %} - - {% else %} - {{ ''|placeholder }} - {% endif %} -
Devices - {% if stats.device_count %} - {{ stats.device_count }} - {% else %} - {{ ''|placeholder }} - {% endif %} -
Virtual Machines - {% if stats.vm_count %} - {{ stats.vm_count }} - {% else %} - {{ ''|placeholder }} - {% endif %} -
Prefixes - {% if stats.prefix_count %} - {{ stats.prefix_count }} - {% else %} - {{ ''|placeholder }} - {% endif %} -
VLAN Groups - {% if stats.vlangroup_count %} - {{ stats.vlangroup_count }} - {% else %} - {{ ''|placeholder }} - {% endif %} -
VLANs - {% if stats.vlan_count %} - {{ stats.vlan_count }} - {% else %} - {{ ''|placeholder }} - {% endif %} -
ASNs - {% if stats.asn_count %} - {{ stats.asn_count }} - {% else %} - {{ ''|placeholder }} - {% endif %} -
Circuits - {% if stats.circuit_count %} - {{ stats.circuit_count }} - {% else %} - {{ ''|placeholder }} - {% endif %} -
-
-
- {% include 'dcim/inc/nonracked_devices.html' %} + {% include 'inc/panels/related_objects.html' with filter_name='site_id' %} {% include 'inc/panels/contacts.html' %}
Locations
@@ -276,40 +171,13 @@
{% endif %}
-
-
ASNs
-
- {% if asns %} - - - - - - {% for asn in asns %} - - - - - {% endfor %} -
ASNDescription
{{ asn|linkify }}{{ asn.description|placeholder }}
- {% else %} - None - {% endif %} -
- {% if perms.ipam.add_asn %} - - {% endif %} -
{% include 'inc/panels/image_attachments.html' %} {% plugin_right_page object %}
+ {% include 'dcim/inc/nonracked_devices.html' %} {% plugin_full_width_page object %}
diff --git a/netbox/templates/inc/panels/related_objects.html b/netbox/templates/inc/panels/related_objects.html new file mode 100644 index 000000000..058d20f0e --- /dev/null +++ b/netbox/templates/inc/panels/related_objects.html @@ -0,0 +1,21 @@ +{% load helpers %} + +
+
Related Objects
+ +
diff --git a/netbox/templates/tenancy/tenant.html b/netbox/templates/tenancy/tenant.html index c13145f42..92d7f51ad 100644 --- a/netbox/templates/tenancy/tenant.html +++ b/netbox/templates/tenancy/tenant.html @@ -10,127 +10,37 @@ {% endblock breadcrumbs %} {% block content %} -
-
-
-
- Tenant -
-
- - - - - - - - - -
Group{{ object.group|linkify|placeholder }}
Description{{ object.description|placeholder }}
-
+
+
+
+
Tenant
+
+ + + + + + + + + +
Group{{ object.group|linkify|placeholder }}
Description{{ object.description|placeholder }}
- {% include 'inc/panels/custom_fields.html' %} - {% include 'inc/panels/tags.html' %} - {% include 'inc/panels/comments.html' %} - {% include 'inc/panels/contacts.html' %} - {% plugin_left_page object %} -
-
-
-
- Stats -
-
- - -
-

{{ stats.rackreservation_count }}

-

Rack reservations

-
-
-

{{ stats.location_count }}

-

Locations

-
-
-

{{ stats.device_count }}

-

Devices

-
-
-

{{ stats.vdc_count }}

-

Virtual Device Contexts

-
- - -
-

{{ stats.aggregate_count }}

-

Aggregates

-
- -
-

{{ stats.prefix_count }}

-

Prefixes

-
-
-

{{ stats.iprange_count }}

-

IP Ranges

-
-
-

{{ stats.ipaddress_count }}

-

IP addresses

-
- - - - -
-

{{ stats.circuit_count }}

-

Circuits

-
-
-

{{ stats.virtualmachine_count }}

-

Virtual machines

-
-
-

{{ stats.cluster_count }}

-

Clusters

-
-
-

{{ stats.wirelesslan_count }}

-

Wireless LANs

-
-
-

{{ stats.wirelesslink_count }}

-

Wireless Links

-
-
-
- {% plugin_right_page object %} +
+ {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% include 'inc/panels/comments.html' %} + {% include 'inc/panels/contacts.html' %} + {% plugin_left_page object %}
-
-
+
+ {% include 'inc/panels/related_objects.html' with filter_name='tenant_id' %} + {% plugin_right_page object %} +
+
+
- {% plugin_full_width_page object %} + {% plugin_full_width_page object %}
-
+
{% endblock %} diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 23a16ec94..7662efd69 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -1,5 +1,6 @@ from django.contrib.contenttypes.models import ContentType from django.shortcuts import get_object_or_404 +from django.utils.translation import gettext as _ from circuits.models import Circuit from dcim.models import Cable, Device, Location, Rack, RackReservation, Site, VirtualDeviceContext @@ -92,31 +93,36 @@ class TenantView(generic.ObjectView): queryset = Tenant.objects.all() def get_extra_context(self, request, instance): - stats = { - 'site_count': Site.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'rack_count': Rack.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'rackreservation_count': RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'location_count': Location.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'device_count': Device.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'vdc_count': VirtualDeviceContext.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'vrf_count': VRF.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'aggregate_count': Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'prefix_count': Prefix.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'iprange_count': IPRange.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'ipaddress_count': IPAddress.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'vlan_count': VLAN.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'l2vpn_count': L2VPN.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'circuit_count': Circuit.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'virtualmachine_count': VirtualMachine.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'cluster_count': Cluster.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'cable_count': Cable.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'asn_count': ASN.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'wirelesslan_count': WirelessLAN.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - 'wirelesslink_count': WirelessLink.objects.restrict(request.user, 'view').filter(tenant=instance).count(), - } + related_models = [ + # DCIM + Site.objects.restrict(request.user, 'view').filter(tenant=instance), + Rack.objects.restrict(request.user, 'view').filter(tenant=instance), + RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance), + Location.objects.restrict(request.user, 'view').filter(tenant=instance), + Device.objects.restrict(request.user, 'view').filter(tenant=instance), + VirtualDeviceContext.objects.restrict(request.user, 'view').filter(tenant=instance), + Cable.objects.restrict(request.user, 'view').filter(tenant=instance), + # IPAM + VRF.objects.restrict(request.user, 'view').filter(tenant=instance), + Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance), + Prefix.objects.restrict(request.user, 'view').filter(tenant=instance), + IPRange.objects.restrict(request.user, 'view').filter(tenant=instance), + IPAddress.objects.restrict(request.user, 'view').filter(tenant=instance), + ASN.objects.restrict(request.user, 'view').filter(tenant=instance), + VLAN.objects.restrict(request.user, 'view').filter(tenant=instance), + L2VPN.objects.restrict(request.user, 'view').filter(tenant=instance), + # Circuits + Circuit.objects.restrict(request.user, 'view').filter(tenant=instance), + # Virtualization + VirtualMachine.objects.restrict(request.user, 'view').filter(tenant=instance), + Cluster.objects.restrict(request.user, 'view').filter(tenant=instance), + # Wireless + WirelessLAN.objects.restrict(request.user, 'view').filter(tenant=instance), + WirelessLink.objects.restrict(request.user, 'view').filter(tenant=instance), + ] return { - 'stats': stats, + 'related_models': related_models, }