Просмотр исходного кода

Limit amount of nonracked devices displayed

Fixes #8920

Limits the amount of non-racked devices on Site and Location view to 10 and provides a link to the device list this is pre-filtered to the relevant site or location.
Jason Yates 3 лет назад
Родитель
Сommit
c3d9910e08
2 измененных файлов с 57 добавлено и 29 удалено
  1. 16 2
      netbox/dcim/views.py
  2. 41 27
      netbox/templates/dcim/inc/nonracked_devices.html

+ 16 - 2
netbox/dcim/views.py

@@ -346,7 +346,13 @@ class SiteView(generic.ObjectView):
             site=instance,
             site=instance,
             position__isnull=True,
             position__isnull=True,
             parent_bay__isnull=True
             parent_bay__isnull=True
-        ).prefetch_related('device_type__manufacturer')
+        ).prefetch_related('device_type__manufacturer').order_by('-pk')[:10]
+
+        total_nonracked_devices_count = Device.objects.filter(
+            site=instance,
+            position__isnull=True,
+            parent_bay__isnull=True
+        ).count()
 
 
         asns = ASN.objects.restrict(request.user, 'view').filter(sites=instance)
         asns = ASN.objects.restrict(request.user, 'view').filter(sites=instance)
         asn_count = asns.count()
         asn_count = asns.count()
@@ -358,6 +364,7 @@ class SiteView(generic.ObjectView):
             'locations': locations,
             'locations': locations,
             'asns': asns,
             'asns': asns,
             'nonracked_devices': nonracked_devices,
             'nonracked_devices': nonracked_devices,
+            'total_nonracked_devices_count': total_nonracked_devices_count,
         }
         }
 
 
 
 
@@ -439,13 +446,20 @@ class LocationView(generic.ObjectView):
             location=instance,
             location=instance,
             position__isnull=True,
             position__isnull=True,
             parent_bay__isnull=True
             parent_bay__isnull=True
-        ).prefetch_related('device_type__manufacturer')
+        ).prefetch_related('device_type__manufacturer').order_by('-pk')[:10]
+
+        total_nonracked_devices_count = Device.objects.filter(
+            location=instance,
+            position__isnull=True,
+            parent_bay__isnull=True
+        ).count()
 
 
         return {
         return {
             'rack_count': rack_count,
             'rack_count': rack_count,
             'device_count': device_count,
             'device_count': device_count,
             'child_locations_table': child_locations_table,
             'child_locations_table': child_locations_table,
             'nonracked_devices': nonracked_devices,
             'nonracked_devices': nonracked_devices,
+            'total_nonracked_devices_count': total_nonracked_devices_count,
         }
         }
 
 
 
 

+ 41 - 27
netbox/templates/dcim/inc/nonracked_devices.html

@@ -1,40 +1,54 @@
 {% load helpers %}
 {% load helpers %}
 
 
 <div class="card">
 <div class="card">
-<h5 class="card-header">
-    Non-Racked Devices
-</h5>
-<div class="card-body">
-{% if nonracked_devices %}
-    <table class="table table-hover">
-        <tr>
-            <th>Name</th>
-            <th>Role</th>
-            <th>Type</th>
-            <th colspan="2">Parent Device</th>
-        </tr>
-        {% for device in nonracked_devices %}
-        <tr{% if device.device_type.u_height %} class="warning"{% endif %}>
-            <td>
-                <a href="{% url 'dcim:device' pk=device.pk %}">{{ device }}</a>
-            </td>
-            <td>{{ device.device_role }}</td>
-            <td>{{ device.device_type }}</td>
-            {% if device.parent_bay %}
-                <td>{{ device.parent_bay.device|linkify }}</td>
-                <td>{{ device.parent_bay }}</td>
-            {% else %}
-                <td colspan="2" class="text-muted">&mdash;</td>
+    <h5 class="card-header">
+        Non-Racked Devices
+    </h5>
+    <div class="card-body">
+    {% if nonracked_devices %}
+        <table class="table table-hover">
+            <tr>
+                <th>Name</th>
+                <th>Role</th>
+                <th>Type</th>
+                <th colspan="2">Parent Device</th>
+            </tr>
+            {% for device in nonracked_devices %}
+            <tr{% if device.device_type.u_height %} class="warning"{% endif %}>
+                <td>
+                    <a href="{% url 'dcim:device' pk=device.pk %}">{{ device }}</a>
+                </td>
+                <td>{{ device.device_role }}</td>
+                <td>{{ device.device_type }}</td>
+                {% if device.parent_bay %}
+                    <td>{{ device.parent_bay.device|linkify }}</td>
+                    <td>{{ device.parent_bay }}</td>
+                {% else %}
+                    <td colspan="2" class="text-muted">&mdash;</td>
+                {% endif %}
+            </tr>
+            {% endfor %}
+        </table>
+
+        {%  if nonracked_devices.count == 10 %}
+            {% if object|meta:'verbose_name' == 'site' %}
+                <div class="text-muted">
+                    Displaying 10 of {{ total_nonracked_devices_count }} devices (<a href="{% url 'dcim:device_list' %}?site_id={{ object.pk }}&rack_id=null">View full list</a>)
+                </div>
+            {% elif object|meta:'verbose_name' == 'location' %}
+                <div class="text-muted">
+                    Displaying 10 of {{ total_nonracked_devices_count }} devices (<a href="{% url 'dcim:device_list' %}?location_id={{ object.pk }}&rack_id=null">View full list</a>)
+                </div>
             {% endif %}
             {% endif %}
-        </tr>
-        {% endfor %}
-    </table>
+        {% endif %}
+
     {% else %}
     {% else %}
         <div class="text-muted">
         <div class="text-muted">
             None
             None
         </div>
         </div>
     {% endif %}
     {% endif %}
     </div>
     </div>
+
     {% if perms.dcim.add_device %}
     {% if perms.dcim.add_device %}
         {% if object|meta:'verbose_name' == 'rack' %}
         {% if object|meta:'verbose_name' == 'rack' %}
         <div class="card-footer text-end noprint">
         <div class="card-footer text-end noprint">