From fdfb20b333b641f15ebaab72b9db42e4ac117ff0 Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 15 Jul 2016 18:27:27 -0700 Subject: [PATCH 1/3] Provide an optional attribute to trigger a sort of the ouput listview fixes #303 --- netbox/dcim/views.py | 1 + netbox/utilities/views.py | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 2fdbbd0a7..65a689764 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -66,6 +66,7 @@ class SiteListView(ObjectListView): queryset = Site.objects.all() filter = filters.SiteFilter table = tables.SiteTable + sorting_attribute = 'name' template_name = 'dcim/site_list.html' diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 9b93301b0..c7d816d18 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -1,3 +1,6 @@ +from natsort import natsorted +from operator import attrgetter + from django_tables2 import RequestConfig from django.contrib import messages @@ -25,6 +28,7 @@ class ObjectListView(View): filter = None filter_form = None table = None + sorting_attribute = None edit_permissions = [] template_name = None redirect_on_single_result = True @@ -68,6 +72,10 @@ class ObjectListView(View): # Provide a hook to tweak the queryset based on the request immediately prior to rendering the object list self.queryset = self.alter_queryset(request) + # If the sorting attribute is set, sort the final result based on the provided attribute key + if self.sorting_attribute: + self.queryset = natsorted(self.queryset, key=attrgetter(self.sorting_attribute)) + # Construct the table based on the user's permissions table = self.table(self.queryset) table.model = model From 1c9f2ba2e4b6b6d098c34e0be1304ec6a4d7b525 Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 15 Jul 2016 19:46:59 -0700 Subject: [PATCH 2/3] Add an api endpoint for listing all connections --- netbox/dcim/api/views.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index d573cddde..27b908d56 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -326,6 +326,14 @@ class InterfaceConnectionView(generics.RetrieveUpdateDestroyAPIView): queryset = InterfaceConnection.objects.all() +class InterfaceConnectionListView(generics.ListAPIView): + """ + Retrieve a list of all interface connections + """ + serializer_class = serializers.InterfaceConnectionSerializer + queryset = InterfaceConnection.objects.all() + + # # Device bays # From 3aeebcbf10b954624ab9aa3141708b18727f8956 Mon Sep 17 00:00:00 2001 From: Joel Date: Fri, 15 Jul 2016 19:48:01 -0700 Subject: [PATCH 3/3] Update the valid urls, to expose the new api connection listing endpoint. Naming convention updated for both interface connections to match the rest. --- netbox/dcim/api/urls.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index 724e244a2..a22a661aa 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -61,7 +61,8 @@ urlpatterns = [ url(r'^interfaces/(?P\d+)/$', InterfaceDetailView.as_view(), name='interface_detail'), url(r'^interfaces/(?P\d+)/graphs/$', GraphListView.as_view(), {'type': GRAPH_TYPE_INTERFACE}, name='interface_graphs'), - url(r'^interface-connections/(?P\d+)/$', InterfaceConnectionView.as_view(), name='interfaceconnection'), + url(r'^interface-connections/$', InterfaceConnectionListView.as_view(), name='interfaceconnection_list'), + url(r'^interface-connections/(?P\d+)/$', InterfaceConnectionView.as_view(), name='interfaceconnection_detail'), # Miscellaneous url(r'^related-connections/$', RelatedConnectionsView.as_view(), name='related_connections'),