Skip to content

Commit 753c402

Browse files
authored
14948 add has_virtual_device_contexts filter to device (netbox-community#16209)
* 14948 add has_virtual_device_cnotexts filter to device * 14948 make singular * 14948 add test
1 parent 8e44668 commit 753c402

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

netbox/dcim/filtersets.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,6 +1100,10 @@ class DeviceFilterSet(
11001100
queryset=IPAddress.objects.all(),
11011101
label=_('OOB IP (ID)'),
11021102
)
1103+
has_virtual_device_context = django_filters.BooleanFilter(
1104+
method='_has_virtual_device_context',
1105+
label=_('Has virtual device context'),
1106+
)
11031107

11041108
class Meta:
11051109
model = Device
@@ -1176,6 +1180,12 @@ def _module_bays(self, queryset, name, value):
11761180
def _device_bays(self, queryset, name, value):
11771181
return queryset.exclude(devicebays__isnull=value)
11781182

1183+
def _has_virtual_device_context(self, queryset, name, value):
1184+
params = Q(vdcs__isnull=False)
1185+
if value:
1186+
return queryset.filter(params).distinct()
1187+
return queryset.exclude(params)
1188+
11791189

11801190
class VirtualDeviceContextFilterSet(NetBoxModelFilterSet, TenancyFilterSet, PrimaryIPFilterSet):
11811191
device_id = django_filters.ModelMultipleChoiceFilter(

netbox/dcim/forms/filtersets.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,7 @@ class DeviceFilterForm(
657657
),
658658
FieldSet(
659659
'has_primary_ip', 'has_oob_ip', 'virtual_chassis_member', 'config_template_id', 'local_context_data',
660+
'has_virtual_device_context',
660661
name=_('Miscellaneous')
661662
)
662663
)
@@ -813,6 +814,13 @@ class DeviceFilterForm(
813814
choices=BOOLEAN_WITH_BLANK_CHOICES
814815
)
815816
)
817+
has_virtual_device_context = forms.NullBooleanField(
818+
required=False,
819+
label=_('Has virtual device contexts'),
820+
widget=forms.Select(
821+
choices=BOOLEAN_WITH_BLANK_CHOICES
822+
)
823+
)
816824
tag = TagFilterField(model)
817825

818826

netbox/dcim/tests/test_filtersets.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,6 +2103,9 @@ def setUpTestData(cls):
21032103
Device.objects.filter(pk=devices[0].pk).update(virtual_chassis=virtual_chassis, vc_position=1, vc_priority=1)
21042104
Device.objects.filter(pk=devices[1].pk).update(virtual_chassis=virtual_chassis, vc_position=2, vc_priority=2)
21052105

2106+
# VirtualDeviceContext assignment for filtering
2107+
VirtualDeviceContext.objects.create(device=devices[0], name="VDC 1", identifier=1, status='active')
2108+
21062109
def test_q(self):
21072110
params = {'q': 'foobar1'}
21082111
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
@@ -2336,6 +2339,12 @@ def test_tenant_group(self):
23362339
params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]}
23372340
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
23382341

2342+
def test_has_virtual_device_context(self):
2343+
params = {'has_virtual_device_context': 'true'}
2344+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
2345+
params = {'has_virtual_device_context': 'false'}
2346+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
2347+
23392348

23402349
class ModuleTestCase(TestCase, ChangeLoggedFilterSetTests):
23412350
queryset = Module.objects.all()

0 commit comments

Comments
 (0)