Browse Source

Closes #782: Allow filtering devices list by manufacturer

Jeremy Stretch 8 years ago
parent
commit
bbc633b004

+ 2 - 1
netbox/dcim/api/serializers.py

@@ -134,12 +134,13 @@ class ManufacturerNestedSerializer(ManufacturerSerializer):
 class DeviceTypeSerializer(CustomFieldSerializer, serializers.ModelSerializer):
     manufacturer = ManufacturerNestedSerializer()
     subdevice_role = serializers.SerializerMethodField()
+    instance_count = serializers.IntegerField(source='instances.count', read_only=True)
 
     class Meta:
         model = DeviceType
         fields = ['id', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth',
                   'interface_ordering', 'is_console_server', 'is_pdu', 'is_network_device', 'subdevice_role',
-                  'comments', 'custom_fields']
+                  'comments', 'custom_fields', 'instance_count']
 
     def get_subdevice_role(self, obj):
         return {

+ 1 - 0
netbox/dcim/api/views.py

@@ -6,6 +6,7 @@ from rest_framework.views import APIView
 
 from django.conf import settings
 from django.contrib.contenttypes.models import ContentType
+from django.db.models import Count
 from django.http import Http404
 from django.shortcuts import get_object_or_404
 

+ 39 - 12
netbox/dcim/forms.py

@@ -639,18 +639,45 @@ class DeviceBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
 
 class DeviceFilterForm(BootstrapMixin, CustomFieldFilterForm):
     model = Device
-    site = FilterChoiceField(queryset=Site.objects.annotate(filter_count=Count('racks__devices')), to_field_name='slug')
-    rack_group_id = FilterChoiceField(queryset=RackGroup.objects.annotate(filter_count=Count('racks__devices')),
-                                      label='Rack Group')
-    role = FilterChoiceField(queryset=DeviceRole.objects.annotate(filter_count=Count('devices')), to_field_name='slug')
-    tenant = FilterChoiceField(queryset=Tenant.objects.annotate(filter_count=Count('devices')), to_field_name='slug',
-                               null_option=(0, 'None'))
-    device_type_id = FilterChoiceField(queryset=DeviceType.objects.select_related('manufacturer')
-                                       .annotate(filter_count=Count('instances')), label='Type')
-    platform = FilterChoiceField(queryset=Platform.objects.annotate(filter_count=Count('devices')),
-                                 to_field_name='slug', null_option=(0, 'None'))
-    status = forms.NullBooleanField(required=False, widget=forms.Select(choices=FORM_STATUS_CHOICES))
-    mac_address = forms.CharField(required=False, label='MAC address')
+    site = FilterChoiceField(
+        queryset=Site.objects.annotate(filter_count=Count('racks__devices')),
+        to_field_name='slug',
+    )
+    rack_group_id = FilterChoiceField(
+        queryset=RackGroup.objects.select_related('site').annotate(filter_count=Count('racks__devices')),
+        label='Rack Group',
+    )
+    role = FilterChoiceField(
+        queryset=DeviceRole.objects.annotate(filter_count=Count('devices')),
+        to_field_name='slug',
+    )
+    tenant = FilterChoiceField(
+        queryset=Tenant.objects.annotate(filter_count=Count('devices')), to_field_name='slug',
+        null_option=(0, 'None'),
+    )
+    manufacturer_id = FilterChoiceField(
+        queryset=Manufacturer.objects.all(),
+        label='Manufacturer',
+    )
+    device_type_id = FilterChoiceField(
+        queryset=DeviceType.objects.select_related('manufacturer').order_by('model').annotate(
+            filter_count=Count('instances'),
+        ),
+        label='Model',
+    )
+    platform = FilterChoiceField(
+        queryset=Platform.objects.annotate(filter_count=Count('devices')),
+        to_field_name='slug',
+        null_option=(0, 'None'),
+    )
+    status = forms.NullBooleanField(
+        required=False,
+        widget=forms.Select(choices=FORM_STATUS_CHOICES),
+    )
+    mac_address = forms.CharField(
+        required=False,
+        label='MAC address',
+    )
 
 
 #

+ 25 - 0
netbox/templates/dcim/device_list.html

@@ -28,3 +28,28 @@
     </div>
 </div>
 {% endblock %}
+
+{% block javascript %}
+<script type="text/javascript">
+$(document).ready(function() {
+    var model_list = $('#id_device_type_id');
+    $('#id_manufacturer_id').change(function() {
+        model_list.empty();
+        var selected_manufacturers = $(this).val();
+        if (selected_manufacturers) {
+            var api_url = netbox_api_path + 'dcim/device-types/?manufacturer_id=' + selected_manufacturers.join('&manufacturer_id=');
+            $.ajax({
+                url: api_url,
+                dataType: 'json',
+                success: function (response, status) {
+                    $.each(response, function (index, device_type) {
+                        var option = $("<option></option>").attr("value", device_type.id).text(device_type["model"] + " (" + device_type["instance_count"] + ")");
+                        model_list.append(option);
+                    });
+                }
+            });
+        }
+    });
+});
+</script>
+{% endblock %}