1
0
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:
Jeremy Stretch
2020-02-26 16:41:59 -05:00
parent 4431259cd8
commit 5a00939512
5 changed files with 28 additions and 17 deletions

View File

@ -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
--- ---

View File

@ -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 = [

View 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]),
)

View File

@ -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

View File

@ -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',