mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Fixes #4285: Include A/Z termination sites in provider circuits table
This commit is contained in:
@ -9,6 +9,7 @@
|
|||||||
## Bug Fixes
|
## Bug Fixes
|
||||||
|
|
||||||
* [#4277](https://github.com/netbox-community/netbox/issues/4277) - Fix filtering of clusters by tenant
|
* [#4277](https://github.com/netbox-community/netbox/issues/4277) - Fix filtering of clusters by tenant
|
||||||
|
* [#4285](https://github.com/netbox-community/netbox/issues/4285) - Include A/Z termination sites in provider circuits table
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ from extras.models import CustomFieldModel, ObjectChange, TaggedItem
|
|||||||
from utilities.models import ChangeLoggedModel
|
from utilities.models import ChangeLoggedModel
|
||||||
from utilities.utils import serialize_object
|
from utilities.utils import serialize_object
|
||||||
from .choices import *
|
from .choices import *
|
||||||
|
from .querysets import CircuitQuerySet
|
||||||
|
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -184,6 +185,7 @@ class Circuit(ChangeLoggedModel, CustomFieldModel):
|
|||||||
object_id_field='obj_id'
|
object_id_field='obj_id'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
objects = CircuitQuerySet.as_manager()
|
||||||
tags = TaggableManager(through=TaggedItem)
|
tags = TaggableManager(through=TaggedItem)
|
||||||
|
|
||||||
csv_headers = [
|
csv_headers = [
|
||||||
|
15
netbox/circuits/querysets.py
Normal file
15
netbox/circuits/querysets.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from django.db.models import OuterRef, QuerySet, Subquery
|
||||||
|
|
||||||
|
|
||||||
|
class CircuitQuerySet(QuerySet):
|
||||||
|
|
||||||
|
def annotate_sites(self):
|
||||||
|
"""
|
||||||
|
Annotate the A and Z termination site names for ordering.
|
||||||
|
"""
|
||||||
|
from circuits.models import CircuitTermination
|
||||||
|
_terminations = CircuitTermination.objects.filter(circuit=OuterRef('pk'))
|
||||||
|
return self.annotate(
|
||||||
|
a_side=Subquery(_terminations.filter(term_side='A').values('site__name')[:1]),
|
||||||
|
z_side=Subquery(_terminations.filter(term_side='Z').values('site__name')[:1]),
|
||||||
|
)
|
@ -37,10 +37,14 @@ class ProviderView(PermissionRequiredMixin, View):
|
|||||||
def get(self, request, slug):
|
def get(self, request, slug):
|
||||||
|
|
||||||
provider = get_object_or_404(Provider, slug=slug)
|
provider = get_object_or_404(Provider, slug=slug)
|
||||||
circuits = Circuit.objects.filter(provider=provider).prefetch_related('type', 'tenant', 'terminations__site')
|
circuits = Circuit.objects.filter(
|
||||||
|
provider=provider
|
||||||
|
).prefetch_related(
|
||||||
|
'type', 'tenant', 'terminations__site'
|
||||||
|
).annotate_sites()
|
||||||
show_graphs = Graph.objects.filter(type__model='provider').exists()
|
show_graphs = Graph.objects.filter(type__model='provider').exists()
|
||||||
|
|
||||||
circuits_table = tables.CircuitTable(circuits, orderable=False)
|
circuits_table = tables.CircuitTable(circuits)
|
||||||
circuits_table.columns.hide('provider')
|
circuits_table.columns.hide('provider')
|
||||||
|
|
||||||
paginate = {
|
paginate = {
|
||||||
@ -142,10 +146,7 @@ class CircuitListView(PermissionRequiredMixin, ObjectListView):
|
|||||||
_terminations = CircuitTermination.objects.filter(circuit=OuterRef('pk'))
|
_terminations = CircuitTermination.objects.filter(circuit=OuterRef('pk'))
|
||||||
queryset = Circuit.objects.prefetch_related(
|
queryset = Circuit.objects.prefetch_related(
|
||||||
'provider', 'type', 'tenant', 'terminations__site'
|
'provider', 'type', 'tenant', 'terminations__site'
|
||||||
).annotate(
|
).annotate_sites()
|
||||||
a_side=Subquery(_terminations.filter(term_side='A').values('site__name')[:1]),
|
|
||||||
z_side=Subquery(_terminations.filter(term_side='Z').values('site__name')[:1]),
|
|
||||||
)
|
|
||||||
filterset = filters.CircuitFilterSet
|
filterset = filters.CircuitFilterSet
|
||||||
filterset_form = forms.CircuitFilterForm
|
filterset_form = forms.CircuitFilterForm
|
||||||
table = tables.CircuitTable
|
table = tables.CircuitTable
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
from django.db.models import Count, F, OuterRef, Subquery
|
from django.db.models import Count, F
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.views.generic import View
|
from django.views.generic import View
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
@ -8,7 +8,7 @@ from rest_framework.reverse import reverse
|
|||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
from circuits.filters import CircuitFilterSet, ProviderFilterSet
|
from circuits.filters import CircuitFilterSet, ProviderFilterSet
|
||||||
from circuits.models import Circuit, CircuitTermination, Provider
|
from circuits.models import Circuit, Provider
|
||||||
from circuits.tables import CircuitTable, ProviderTable
|
from circuits.tables import CircuitTable, ProviderTable
|
||||||
from dcim.filters import (
|
from dcim.filters import (
|
||||||
CableFilterSet, DeviceFilterSet, DeviceTypeFilterSet, PowerFeedFilterSet, RackFilterSet, RackGroupFilterSet, SiteFilterSet,
|
CableFilterSet, DeviceFilterSet, DeviceTypeFilterSet, PowerFeedFilterSet, RackFilterSet, RackGroupFilterSet, SiteFilterSet,
|
||||||
@ -50,15 +50,7 @@ SEARCH_TYPES = OrderedDict((
|
|||||||
'permission': 'circuits.view_circuit',
|
'permission': 'circuits.view_circuit',
|
||||||
'queryset': Circuit.objects.prefetch_related(
|
'queryset': Circuit.objects.prefetch_related(
|
||||||
'type', 'provider', 'tenant', 'terminations__site'
|
'type', 'provider', 'tenant', 'terminations__site'
|
||||||
).annotate(
|
).annotate_sites(),
|
||||||
# Annotate A/Z terminations
|
|
||||||
a_side=Subquery(
|
|
||||||
CircuitTermination.objects.filter(circuit=OuterRef('pk')).filter(term_side='A').values('site__name')[:1]
|
|
||||||
),
|
|
||||||
z_side=Subquery(
|
|
||||||
CircuitTermination.objects.filter(circuit=OuterRef('pk')).filter(term_side='Z').values('site__name')[:1]
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'filterset': CircuitFilterSet,
|
'filterset': CircuitFilterSet,
|
||||||
'table': CircuitTable,
|
'table': CircuitTable,
|
||||||
'url': 'circuits:circuit_list',
|
'url': 'circuits:circuit_list',
|
||||||
|
Reference in New Issue
Block a user