Skip to content

Commit bb7d3df

Browse files
committed
Closes #13794: Dynamically populate related objects list under tenant view
1 parent 8dcbd66 commit bb7d3df

File tree

2 files changed

+18
-33
lines changed

2 files changed

+18
-33
lines changed

netbox/tenancy/views.py

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,9 @@
22
from django.shortcuts import get_object_or_404
33
from django.utils.translation import gettext as _
44

5-
from circuits.models import Circuit
6-
from dcim.models import Cable, Device, Location, PowerFeed, Rack, RackReservation, Site, VirtualDeviceContext
7-
from ipam.models import Aggregate, ASN, IPAddress, IPRange, L2VPN, Prefix, VLAN, VRF
85
from netbox.views import generic
9-
from utilities.utils import count_related
6+
from utilities.utils import count_related, get_related_models
107
from utilities.views import register_model_view, ViewTab
11-
from virtualization.models import VirtualMachine, Cluster
12-
from wireless.models import WirelessLAN, WirelessLink
138
from . import filtersets, forms, tables
149
from .models import *
1510

@@ -132,32 +127,8 @@ class TenantView(generic.ObjectView):
132127

133128
def get_extra_context(self, request, instance):
134129
related_models = [
135-
# DCIM
136-
(Site.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
137-
(Rack.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
138-
(RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
139-
(Location.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
140-
(Device.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
141-
(VirtualDeviceContext.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
142-
(Cable.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
143-
(PowerFeed.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
144-
# IPAM
145-
(VRF.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
146-
(Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
147-
(Prefix.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
148-
(IPRange.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
149-
(IPAddress.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
150-
(ASN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
151-
(VLAN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
152-
(L2VPN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
153-
# Circuits
154-
(Circuit.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
155-
# Virtualization
156-
(VirtualMachine.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
157-
(Cluster.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
158-
# Wireless
159-
(WirelessLAN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
160-
(WirelessLink.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'),
130+
(model.objects.restrict(request.user, 'view').filter(tenant=instance), f'{field}_id')
131+
for model, field in get_related_models(Tenant)
161132
]
162133

163134
return {

netbox/utilities/utils.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import bleach
99
from django.contrib.contenttypes.models import ContentType
1010
from django.core import serializers
11-
from django.db.models import Count, OuterRef, Subquery
11+
from django.db.models import Count, ManyToOneRel, OuterRef, Subquery
1212
from django.db.models.functions import Coalesce
1313
from django.http import QueryDict
1414
from django.utils import timezone
@@ -567,3 +567,17 @@ def local_now():
567567
Return the current date & time in the system timezone.
568568
"""
569569
return localtime(timezone.now())
570+
571+
572+
def get_related_models(model):
573+
"""
574+
Return a list of all models which have a ForeignKey to the given model and the name of the field.
575+
"""
576+
related_models = []
577+
for field in model._meta.get_fields():
578+
if type(field) is ManyToOneRel:
579+
related_models.append(
580+
(field.related_model, field.remote_field.name)
581+
)
582+
583+
return related_models

0 commit comments

Comments
 (0)