diff --git a/netbox_topology_views/filters.py b/netbox_topology_views/filters.py index f6b148e..98ca06a 100644 --- a/netbox_topology_views/filters.py +++ b/netbox_topology_views/filters.py @@ -1,6 +1,6 @@ import django_filters from dcim.choices import DeviceStatusChoices -from dcim.models import Device, DeviceRole, Location, Rack, Region, Site +from dcim.models import Device, DeviceRole, Location, Rack, Region, Site, SiteGroup from django.db.models import Q from netbox.filtersets import NetBoxModelFilterSet from tenancy.filtersets import TenancyFilterSet @@ -27,6 +27,12 @@ class DeviceFilterSet(TenancyFilterSet, NetBoxModelFilterSet): queryset=Site.objects.all(), label="Site (ID)", ) + sitegroup_id = TreeNodeMultipleChoiceFilter( + queryset=SiteGroup.objects.all(), + field_name="site__group", + lookup_expr="in", + label="Site Group (ID)", + ) location_id = TreeNodeMultipleChoiceFilter( queryset=Location.objects.all(), field_name="location", diff --git a/netbox_topology_views/forms.py b/netbox_topology_views/forms.py index f6ee86a..030dab4 100644 --- a/netbox_topology_views/forms.py +++ b/netbox_topology_views/forms.py @@ -5,7 +5,7 @@ from django.conf import settings from django.utils.translation import gettext as _ -from dcim.models import Device, Site, Region, DeviceRole, Location, Rack +from dcim.models import Device, Site, SiteGroup, Region, DeviceRole, Location, Rack from django import forms from dcim.choices import DeviceStatusChoices @@ -52,7 +52,7 @@ class DeviceFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): "tenant_id", ), ), - (None, ("region_id", "site_id", "location_id", "rack_id")), + (None, ("region_id", "sitegroup_id", "site_id", "location_id", "rack_id")), ( None, ( @@ -69,10 +69,14 @@ class DeviceFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): label=_("Coordinate group"), ) region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), required=False, label=_("Region") + queryset=Region.objects.all(), + required=False, + label=_("Region") ) role_id = DynamicModelMultipleChoiceField( - queryset=DeviceRole.objects.all(), required=False, label=_("Device Role") + queryset=DeviceRole.objects.all(), + required=False, + label=_("Device Role") ) id = DynamicModelMultipleChoiceField( queryset=Device.objects.all(), @@ -81,6 +85,7 @@ class DeviceFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): query_params={ "location_id": "$location_id", "region_id": "$region_id", + "site_group_id": "$sitegroup_id", "site_id": "$site_id", "role_id": "$role_id", }, @@ -90,14 +95,21 @@ class DeviceFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): required=False, query_params={ "region_id": "$region_id", + "group_id": "$sitegroup_id", }, label=_("Site"), ) + sitegroup_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_("Site Group"), + ) location_id = DynamicModelMultipleChoiceField( queryset=Location.objects.all(), required=False, query_params={ "region_id": "$region_id", + "site_group_id": "$sitegroup_id", "site_id": "$site_id", }, label=_("Location"), @@ -107,6 +119,7 @@ class DeviceFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): required=False, query_params={ "region_id": "$region_id", + "site_group_id": "$sitegroup_id", "site_id": "$site_id", "location_id": "$location_id", },