Răsfoiți Sursa

Fixes #4285: Include A/Z termination sites in provider circuits table

Jeremy Stretch 6 ani în urmă
părinte
comite
5a00939512

+ 1 - 0
docs/release-notes/version-2.7.md

@@ -9,6 +9,7 @@
 ## Bug Fixes
 
 * [#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
 
 ---
 

+ 2 - 0
netbox/circuits/models.py

@@ -10,6 +10,7 @@ from extras.models import CustomFieldModel, ObjectChange, TaggedItem
 from utilities.models import ChangeLoggedModel
 from utilities.utils import serialize_object
 from .choices import *
+from .querysets import CircuitQuerySet
 
 
 __all__ = (
@@ -184,6 +185,7 @@ class Circuit(ChangeLoggedModel, CustomFieldModel):
         object_id_field='obj_id'
     )
 
+    objects = CircuitQuerySet.as_manager()
     tags = TaggableManager(through=TaggedItem)
 
     csv_headers = [

+ 15 - 0
netbox/circuits/querysets.py

@@ -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]),
+        )

+ 7 - 6
netbox/circuits/views.py

@@ -37,10 +37,14 @@ class ProviderView(PermissionRequiredMixin, View):
     def get(self, request, 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()
 
-        circuits_table = tables.CircuitTable(circuits, orderable=False)
+        circuits_table = tables.CircuitTable(circuits)
         circuits_table.columns.hide('provider')
 
         paginate = {
@@ -142,10 +146,7 @@ class CircuitListView(PermissionRequiredMixin, ObjectListView):
     _terminations = CircuitTermination.objects.filter(circuit=OuterRef('pk'))
     queryset = Circuit.objects.prefetch_related(
         'provider', 'type', 'tenant', 'terminations__site'
-    ).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]),
-    )
+    ).annotate_sites()
     filterset = filters.CircuitFilterSet
     filterset_form = forms.CircuitFilterForm
     table = tables.CircuitTable

+ 3 - 11
netbox/netbox/views.py

@@ -1,6 +1,6 @@
 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.views.generic import View
 from rest_framework.response import Response
@@ -8,7 +8,7 @@ from rest_framework.reverse import reverse
 from rest_framework.views import APIView
 
 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 dcim.filters import (
     CableFilterSet, DeviceFilterSet, DeviceTypeFilterSet, PowerFeedFilterSet, RackFilterSet, RackGroupFilterSet, SiteFilterSet,
@@ -50,15 +50,7 @@ SEARCH_TYPES = OrderedDict((
         'permission': 'circuits.view_circuit',
         'queryset': Circuit.objects.prefetch_related(
             'type', 'provider', 'tenant', 'terminations__site'
-        ).annotate(
-            # 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]
-            ),
-        ),
+        ).annotate_sites(),
         'filterset': CircuitFilterSet,
         'table': CircuitTable,
         'url': 'circuits:circuit_list',