mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-25 18:08:38 -06:00
Enabled filtering of sites, racks, and devices by tenant
This commit is contained in:
parent
7ca4c816c0
commit
faa12abc70
@ -6,6 +6,7 @@ from .models import (
|
|||||||
ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, Interface, InterfaceConnection, Manufacturer,
|
ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, Interface, InterfaceConnection, Manufacturer,
|
||||||
Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site,
|
Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site,
|
||||||
)
|
)
|
||||||
|
from tenancy.models import Tenant
|
||||||
|
|
||||||
|
|
||||||
class SiteFilter(django_filters.FilterSet):
|
class SiteFilter(django_filters.FilterSet):
|
||||||
@ -13,6 +14,17 @@ class SiteFilter(django_filters.FilterSet):
|
|||||||
action='search',
|
action='search',
|
||||||
label='Search',
|
label='Search',
|
||||||
)
|
)
|
||||||
|
tenant_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
name='tenant',
|
||||||
|
queryset=Tenant.objects.all(),
|
||||||
|
label='Tenant (ID)',
|
||||||
|
)
|
||||||
|
tenant = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
name='tenant',
|
||||||
|
queryset=Tenant.objects.all(),
|
||||||
|
to_field_name='slug',
|
||||||
|
label='Tenant (slug)',
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Site
|
model = Site
|
||||||
@ -74,6 +86,17 @@ class RackFilter(django_filters.FilterSet):
|
|||||||
to_field_name='slug',
|
to_field_name='slug',
|
||||||
label='Group',
|
label='Group',
|
||||||
)
|
)
|
||||||
|
tenant_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
name='tenant',
|
||||||
|
queryset=Tenant.objects.all(),
|
||||||
|
label='Tenant (ID)',
|
||||||
|
)
|
||||||
|
tenant = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
name='tenant',
|
||||||
|
queryset=Tenant.objects.all(),
|
||||||
|
to_field_name='slug',
|
||||||
|
label='Tenant (slug)',
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Rack
|
model = Rack
|
||||||
@ -143,6 +166,17 @@ class DeviceFilter(django_filters.FilterSet):
|
|||||||
to_field_name='slug',
|
to_field_name='slug',
|
||||||
label='Role (slug)',
|
label='Role (slug)',
|
||||||
)
|
)
|
||||||
|
tenant_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
name='tenant',
|
||||||
|
queryset=Tenant.objects.all(),
|
||||||
|
label='Tenant (ID)',
|
||||||
|
)
|
||||||
|
tenant = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
name='tenant',
|
||||||
|
queryset=Tenant.objects.all(),
|
||||||
|
to_field_name='slug',
|
||||||
|
label='Tenant (slug)',
|
||||||
|
)
|
||||||
device_type_id = django_filters.ModelMultipleChoiceFilter(
|
device_type_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
name='device_type',
|
name='device_type',
|
||||||
queryset=DeviceType.objects.all(),
|
queryset=DeviceType.objects.all(),
|
||||||
|
@ -76,6 +76,16 @@ class SiteImportForm(BulkImportForm, BootstrapMixin):
|
|||||||
csv = CSVDataField(csv_form=SiteFromCSVForm)
|
csv = CSVDataField(csv_form=SiteFromCSVForm)
|
||||||
|
|
||||||
|
|
||||||
|
def site_tenant_choices():
|
||||||
|
tenant_choices = Tenant.objects.annotate(site_count=Count('sites'))
|
||||||
|
return [(t.slug, u'{} ({})'.format(t.name, t.site_count)) for t in tenant_choices]
|
||||||
|
|
||||||
|
|
||||||
|
class SiteFilterForm(forms.Form, BootstrapMixin):
|
||||||
|
tenant = forms.MultipleChoiceField(required=False, choices=site_tenant_choices,
|
||||||
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Rack groups
|
# Rack groups
|
||||||
#
|
#
|
||||||
@ -181,11 +191,18 @@ def rack_group_choices():
|
|||||||
return [(g.pk, u'{} ({})'.format(g, g.rack_count)) for g in group_choices]
|
return [(g.pk, u'{} ({})'.format(g, g.rack_count)) for g in group_choices]
|
||||||
|
|
||||||
|
|
||||||
|
def rack_tenant_choices():
|
||||||
|
tenant_choices = Tenant.objects.annotate(rack_count=Count('racks'))
|
||||||
|
return [(t.slug, u'{} ({})'.format(t.name, t.rack_count)) for t in tenant_choices]
|
||||||
|
|
||||||
|
|
||||||
class RackFilterForm(forms.Form, BootstrapMixin):
|
class RackFilterForm(forms.Form, BootstrapMixin):
|
||||||
site = forms.MultipleChoiceField(required=False, choices=rack_site_choices,
|
site = forms.MultipleChoiceField(required=False, choices=rack_site_choices,
|
||||||
widget=forms.SelectMultiple(attrs={'size': 8}))
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
group_id = forms.MultipleChoiceField(required=False, choices=rack_group_choices, label='Rack Group',
|
group_id = forms.MultipleChoiceField(required=False, choices=rack_group_choices, label='Rack Group',
|
||||||
widget=forms.SelectMultiple(attrs={'size': 8}))
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
|
tenant = forms.MultipleChoiceField(required=False, choices=rack_tenant_choices,
|
||||||
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -542,6 +559,11 @@ def device_role_choices():
|
|||||||
return [(r.slug, u'{} ({})'.format(r.name, r.device_count)) for r in role_choices]
|
return [(r.slug, u'{} ({})'.format(r.name, r.device_count)) for r in role_choices]
|
||||||
|
|
||||||
|
|
||||||
|
def device_tenant_choices():
|
||||||
|
tenant_choices = Tenant.objects.annotate(device_count=Count('devices'))
|
||||||
|
return [(t.slug, u'{} ({})'.format(t.name, t.device_count)) for t in tenant_choices]
|
||||||
|
|
||||||
|
|
||||||
def device_type_choices():
|
def device_type_choices():
|
||||||
type_choices = DeviceType.objects.select_related('manufacturer').annotate(device_count=Count('instances'))
|
type_choices = DeviceType.objects.select_related('manufacturer').annotate(device_count=Count('instances'))
|
||||||
return [(t.pk, u'{} ({})'.format(t, t.device_count)) for t in type_choices]
|
return [(t.pk, u'{} ({})'.format(t, t.device_count)) for t in type_choices]
|
||||||
@ -559,6 +581,8 @@ class DeviceFilterForm(forms.Form, BootstrapMixin):
|
|||||||
widget=forms.SelectMultiple(attrs={'size': 8}))
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
role = forms.MultipleChoiceField(required=False, choices=device_role_choices,
|
role = forms.MultipleChoiceField(required=False, choices=device_role_choices,
|
||||||
widget=forms.SelectMultiple(attrs={'size': 8}))
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
|
tenant = forms.MultipleChoiceField(required=False, choices=device_tenant_choices,
|
||||||
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
device_type_id = forms.MultipleChoiceField(required=False, choices=device_type_choices, label='Type',
|
device_type_id = forms.MultipleChoiceField(required=False, choices=device_type_choices, label='Type',
|
||||||
widget=forms.SelectMultiple(attrs={'size': 8}))
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
platform = forms.MultipleChoiceField(required=False, choices=device_platform_choices)
|
platform = forms.MultipleChoiceField(required=False, choices=device_platform_choices)
|
||||||
|
@ -63,6 +63,7 @@ def expand_pattern(string):
|
|||||||
class SiteListView(ObjectListView):
|
class SiteListView(ObjectListView):
|
||||||
queryset = Site.objects.select_related('tenant')
|
queryset = Site.objects.select_related('tenant')
|
||||||
filter = filters.SiteFilter
|
filter = filters.SiteFilter
|
||||||
|
filter_form = forms.SiteFilterForm
|
||||||
table = tables.SiteTable
|
table = tables.SiteTable
|
||||||
template_name = 'dcim/site_list.html'
|
template_name = 'dcim/site_list.html'
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% include 'inc/filter_panel.html' %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Loading…
Reference in New Issue
Block a user