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

Fix some instances where RestrictedQuerySet is evaluated prematurely

This commit is contained in:
Jeremy Stretch
2020-06-26 12:22:02 -04:00
parent 9777f25b9f
commit 95965d65c9
7 changed files with 60 additions and 20 deletions

View File

@@ -5,7 +5,7 @@ from django.contrib import messages
from django.contrib.contenttypes.models import ContentType
from django.core.paginator import EmptyPage, PageNotAnInteger
from django.db import transaction
from django.db.models import Count, F
from django.db.models import Count, F, Prefetch
from django.forms import ModelMultipleChoiceField, MultipleHiddenInput, modelformset_factory
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
@@ -16,7 +16,7 @@ from django.views.generic import View
from circuits.models import Circuit
from extras.models import Graph
from extras.views import ObjectConfigContextView
from ipam.models import Prefix, Service, VLAN
from ipam.models import IPAddress, Prefix, Service, VLAN
from ipam.tables import InterfaceIPAddressTable, InterfaceVLANTable
from secrets.models import Secret
from utilities.forms import ConfirmationForm
@@ -517,6 +517,7 @@ class DeviceTypeView(ObjectView):
def get(self, request, pk):
devicetype = get_object_or_404(self.queryset, pk=pk)
instance_count = Device.objects.restrict(request.user).filter(device_type=devicetype).count()
# Component tables
consoleport_table = tables.ConsolePortTemplateTable(
@@ -563,6 +564,7 @@ class DeviceTypeView(ObjectView):
return render(request, 'dcim/devicetype.html', {
'devicetype': devicetype,
'instance_count': instance_count,
'consoleport_table': consoleport_table,
'consoleserverport_table': consoleserverport_table,
'powerport_table': powerport_table,
@@ -987,8 +989,10 @@ class DeviceView(ObjectView):
# Interfaces
interfaces = device.vc_interfaces.restrict(request.user, 'view').filter(device=device).prefetch_related(
Prefetch('ip_addresses', queryset=IPAddress.objects.restrict(request.user)),
Prefetch('member_interfaces', queryset=Interface.objects.restrict(request.user)),
'lag', '_connected_interface__device', '_connected_circuittermination__circuit', 'cable',
'cable__termination_a', 'cable__termination_b', 'ip_addresses', 'tags'
'cable__termination_a', 'cable__termination_b', 'tags'
)
# Front ports
@@ -1438,7 +1442,7 @@ class InterfaceView(ObjectView):
if interface.untagged_vlan is not None:
vlans.append(interface.untagged_vlan)
vlans[0].tagged = False
for vlan in interface.tagged_vlans.prefetch_related('site', 'group', 'tenant', 'role'):
for vlan in interface.tagged_vlans.restrict(request.user).prefetch_related('site', 'group', 'tenant', 'role'):
vlan.tagged = True
vlans.append(vlan)
vlan_table = InterfaceVLANTable(
@@ -2149,13 +2153,15 @@ class VirtualChassisListView(ObjectListView):
class VirtualChassisView(ObjectView):
queryset = VirtualChassis.objects.prefetch_related('members')
queryset = VirtualChassis.objects.all()
def get(self, request, pk):
virtualchassis = get_object_or_404(self.queryset, pk=pk)
members = Device.objects.restrict(request.user).filter(virtual_chassis=virtualchassis)
return render(request, 'dcim/virtualchassis.html', {
'virtualchassis': virtualchassis,
'members': members,
})
@@ -2389,8 +2395,9 @@ class PowerPanelView(ObjectView):
def get(self, request, pk):
powerpanel = get_object_or_404(self.queryset, pk=pk)
power_feeds = PowerFeed.objects.restrict(request.user).filter(power_panel=powerpanel).prefetch_related('rack')
powerfeed_table = tables.PowerFeedTable(
data=PowerFeed.objects.filter(power_panel=powerpanel).prefetch_related('rack'),
data=power_feeds,
orderable=False
)
powerfeed_table.exclude = ['power_panel']