Closes #782: Allow filtering devices list by manufacturer

This commit is contained in:
Jeremy Stretch 2017-01-24 10:53:59 -05:00
parent ed8fdd9292
commit bbc633b004
4 changed files with 67 additions and 13 deletions

View File

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

View File

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

View File

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

View File

@ -28,3 +28,28 @@
</div> </div>
</div> </div>
{% endblock %} {% 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 %}