Browse Source

Closes #1137: Allow filtering devices list by rack

Jeremy Stretch 8 years ago
parent
commit
d11dfe2ced
2 changed files with 68 additions and 5 deletions
  1. 4 0
      netbox/dcim/forms.py
  2. 64 5
      netbox/templates/dcim/device_list.html

+ 4 - 0
netbox/dcim/forms.py

@@ -814,6 +814,10 @@ class DeviceFilterForm(BootstrapMixin, CustomFieldFilterForm):
         queryset=RackGroup.objects.select_related('site').annotate(filter_count=Count('racks__devices')),
         label='Rack group',
     )
+    rack_id = FilterChoiceField(
+        queryset=Rack.objects.annotate(filter_count=Count('devices')),
+        label='Rack',
+    )
     role = FilterChoiceField(
         queryset=DeviceRole.objects.annotate(filter_count=Count('devices')),
         to_field_name='slug',

+ 64 - 5
netbox/templates/dcim/device_list.html

@@ -31,24 +31,83 @@
 {% block javascript %}
 <script type="text/javascript">
 $(document).ready(function() {
+
+    var site_list = $('#id_site');
+    var rack_group_list = $('#id_rack_group_id');
+    var rack_list = $('#id_rack_id');
+    var manufacturer_list = $('#id_manufacturer_id');
     var model_list = $('#id_device_type_id');
-    $('#id_manufacturer_id').change(function() {
-        model_list.empty();
+
+    // Update device type options based on selected manufacturer
+    manufacturer_list.change(function() {
         var selected_manufacturers = $(this).val();
         if (selected_manufacturers) {
-            var api_url = netbox_api_path + 'dcim/device-types/?manufacturer_id=' + selected_manufacturers.join('&manufacturer_id=');
+            model_list.empty();
             $.ajax({
-                url: api_url,
+                url: netbox_api_path + 'dcim/device-types/?limit=500&manufacturer_id=' + selected_manufacturers.join('&manufacturer_id='),
                 dataType: 'json',
                 success: function (response, status) {
                     $.each(response["results"], function (index, device_type) {
-                        var option = $("<option></option>").attr("value", device_type.id).text(device_type["model"] + " (" + device_type["instance_count"] + ")");
+                        var option = $("<option></option>").attr("value", device_type.id).text(device_type.model + " (" + device_type.instance_count + ")");
                         model_list.append(option);
                     });
                 }
             });
         }
     });
+
+    // Update rack group and rack options based on selected site
+    site_list.change(function() {
+        var selected_sites = $(this).val();
+        if (selected_sites) {
+
+            // Update rack group options
+            rack_group_list.empty();
+            $.ajax({
+                url: netbox_api_path + 'dcim/rack-groups/?limit=500&site=' + selected_sites.join('&site='),
+                dataType: 'json',
+                success: function (response, status) {
+                    $.each(response["results"], function (index, group) {
+                        var option = $("<option></option>").attr("value", group.id).text(group.name);
+                        rack_group_list.append(option);
+                    });
+                }
+            });
+
+            // Update rack options
+            rack_list.empty();
+            $.ajax({
+                url: netbox_api_path + 'dcim/racks/?limit=500&site=' + selected_sites.join('&site='),
+                dataType: 'json',
+                success: function (response, status) {
+                    $.each(response["results"], function (index, rack) {
+                        var option = $("<option></option>").attr("value", rack.id).text(rack.display_name);
+                        rack_list.append(option);
+                    });
+                }
+            });
+
+        }
+    });
+
+    // Update rack options based on selected rack group
+    rack_group_list.change(function() {
+        var selected_rack_groups = $(this).val();
+        if (selected_rack_groups) {
+            rack_list.empty();
+            $.ajax({
+                url: netbox_api_path + 'dcim/racks/?limit=500&group_id=' + selected_rack_groups.join('&group_id='),
+                dataType: 'json',
+                success: function (response, status) {
+                    $.each(response["results"], function (index, rack) {
+                        var option = $("<option></option>").attr("value", rack.id).text(rack.display_name);
+                        rack_list.append(option);
+                    });
+                }
+            });
+        }
+    });
+
 });
 </script>
 {% endblock %}