Fixes #18324: Correct filter names for certain related object listings

This commit is contained in:
Jeremy Stretch 2025-01-07 10:01:05 -05:00
parent 9c960c2387
commit ef6c89ee5d

View File

@ -15,7 +15,7 @@ from jinja2.exceptions import TemplateError
from circuits.models import Circuit, CircuitTermination from circuits.models import Circuit, CircuitTermination
from extras.views import ObjectConfigContextView from extras.views import ObjectConfigContextView
from ipam.models import ASN, IPAddress, VLANGroup from ipam.models import ASN, IPAddress, Prefix, VLANGroup
from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable
from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.constants import DEFAULT_ACTION_PERMISSIONS
from netbox.views import generic from netbox.views import generic
@ -30,8 +30,9 @@ from utilities.views import (
) )
from virtualization.filtersets import VirtualMachineFilterSet from virtualization.filtersets import VirtualMachineFilterSet
from virtualization.forms import VirtualMachineFilterForm from virtualization.forms import VirtualMachineFilterForm
from virtualization.models import VirtualMachine from virtualization.models import Cluster, VirtualMachine
from virtualization.tables import VirtualMachineTable from virtualization.tables import VirtualMachineTable
from wireless.models import WirelessLAN
from . import filtersets, forms, tables from . import filtersets, forms, tables
from .choices import DeviceFaceChoices, InterfaceModeChoices from .choices import DeviceFaceChoices, InterfaceModeChoices
from .models import * from .models import *
@ -238,6 +239,7 @@ class RegionView(GetRelatedModelsMixin, generic.ObjectView):
'related_models': self.get_related_models( 'related_models': self.get_related_models(
request, request,
regions, regions,
omit=(Cluster, Prefix, WirelessLAN),
extra=( extra=(
(Location.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), (Location.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'),
(Rack.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), (Rack.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'),
@ -247,6 +249,11 @@ class RegionView(GetRelatedModelsMixin, generic.ObjectView):
).distinct(), ).distinct(),
'region_id' 'region_id'
), ),
# Handle these relations manually to avoid erroneous filter name resolution
(Cluster.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'),
(Prefix.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'),
(WirelessLAN.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'),
), ),
), ),
} }
@ -331,6 +338,7 @@ class SiteGroupView(GetRelatedModelsMixin, generic.ObjectView):
'related_models': self.get_related_models( 'related_models': self.get_related_models(
request, request,
groups, groups,
omit=(Cluster, Prefix, WirelessLAN),
extra=( extra=(
(Location.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), (Location.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'),
(Rack.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), (Rack.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'),
@ -340,6 +348,20 @@ class SiteGroupView(GetRelatedModelsMixin, generic.ObjectView):
).distinct(), ).distinct(),
'site_group_id' 'site_group_id'
), ),
# Handle these relations manually to avoid erroneous filter name resolution
(
Cluster.objects.restrict(request.user, 'view').filter(_site_group__in=groups),
'site_group_id'
),
(
Prefix.objects.restrict(request.user, 'view').filter(_site_group__in=groups),
'site_group_id'
),
(
WirelessLAN.objects.restrict(request.user, 'view').filter(_site_group__in=groups),
'site_group_id'
),
), ),
), ),
} }
@ -418,8 +440,8 @@ class SiteView(GetRelatedModelsMixin, generic.ObjectView):
'related_models': self.get_related_models( 'related_models': self.get_related_models(
request, request,
instance, instance,
[CableTermination, CircuitTermination], omit=(CableTermination, CircuitTermination, Cluster, Prefix, WirelessLAN),
( extra=(
(VLANGroup.objects.restrict(request.user, 'view').filter( (VLANGroup.objects.restrict(request.user, 'view').filter(
scope_type=ContentType.objects.get_for_model(Site), scope_type=ContentType.objects.get_for_model(Site),
scope_id=instance.pk scope_id=instance.pk
@ -429,6 +451,11 @@ class SiteView(GetRelatedModelsMixin, generic.ObjectView):
Circuit.objects.restrict(request.user, 'view').filter(terminations___site=instance).distinct(), Circuit.objects.restrict(request.user, 'view').filter(terminations___site=instance).distinct(),
'site_id' 'site_id'
), ),
# Handle these relations manually to avoid erroneous filter name resolution
(Cluster.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'),
(Prefix.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'),
(WirelessLAN.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'),
), ),
), ),
} }
@ -506,14 +533,19 @@ class LocationView(GetRelatedModelsMixin, generic.ObjectView):
'related_models': self.get_related_models( 'related_models': self.get_related_models(
request, request,
locations, locations,
[CableTermination], omit=[CableTermination, Cluster, Prefix, WirelessLAN],
( extra=(
( (
Circuit.objects.restrict(request.user, 'view').filter( Circuit.objects.restrict(request.user, 'view').filter(
terminations___location=instance terminations___location=instance
).distinct(), ).distinct(),
'location_id' 'location_id'
), ),
# Handle these relations manually to avoid erroneous filter name resolution
(Cluster.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'),
(Prefix.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'),
(WirelessLAN.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'),
), ),
), ),
} }