mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-22 11:38:45 -06:00
Closes #15383: Standardize filtering logic for the parents of recursively-nested models
This commit is contained in:
@@ -26,12 +26,25 @@ __all__ = (
|
||||
class ContactGroupFilterSet(OrganizationalModelFilterSet):
|
||||
parent_id = django_filters.ModelMultipleChoiceFilter(
|
||||
queryset=ContactGroup.objects.all(),
|
||||
label=_('Contact group (ID)'),
|
||||
label=_('Parent contact group (ID)'),
|
||||
)
|
||||
parent = django_filters.ModelMultipleChoiceFilter(
|
||||
field_name='parent__slug',
|
||||
queryset=ContactGroup.objects.all(),
|
||||
to_field_name='slug',
|
||||
label=_('Parent contact group (slug)'),
|
||||
)
|
||||
ancestor_id = TreeNodeMultipleChoiceFilter(
|
||||
queryset=ContactGroup.objects.all(),
|
||||
field_name='parent',
|
||||
lookup_expr='in',
|
||||
label=_('Contact group (ID)'),
|
||||
)
|
||||
ancestor = TreeNodeMultipleChoiceFilter(
|
||||
queryset=ContactGroup.objects.all(),
|
||||
field_name='parent',
|
||||
lookup_expr='in',
|
||||
to_field_name='slug',
|
||||
label=_('Contact group (slug)'),
|
||||
)
|
||||
|
||||
@@ -155,12 +168,25 @@ class ContactModelFilterSet(django_filters.FilterSet):
|
||||
class TenantGroupFilterSet(OrganizationalModelFilterSet):
|
||||
parent_id = django_filters.ModelMultipleChoiceFilter(
|
||||
queryset=TenantGroup.objects.all(),
|
||||
label=_('Tenant group (ID)'),
|
||||
label=_('Parent tenant group (ID)'),
|
||||
)
|
||||
parent = django_filters.ModelMultipleChoiceFilter(
|
||||
field_name='parent__slug',
|
||||
queryset=TenantGroup.objects.all(),
|
||||
to_field_name='slug',
|
||||
label=_('Parent tenant group (slug)'),
|
||||
)
|
||||
ancestor_id = TreeNodeMultipleChoiceFilter(
|
||||
queryset=TenantGroup.objects.all(),
|
||||
field_name='parent',
|
||||
lookup_expr='in',
|
||||
label=_('Tenant group (ID)'),
|
||||
)
|
||||
ancestor = TreeNodeMultipleChoiceFilter(
|
||||
queryset=TenantGroup.objects.all(),
|
||||
field_name='parent',
|
||||
lookup_expr='in',
|
||||
to_field_name='slug',
|
||||
label=_('Tenant group (slug)'),
|
||||
)
|
||||
|
||||
|
||||
@@ -15,35 +15,43 @@ class TenantGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
|
||||
def setUpTestData(cls):
|
||||
|
||||
parent_tenant_groups = (
|
||||
TenantGroup(name='Parent Tenant Group 1', slug='parent-tenant-group-1'),
|
||||
TenantGroup(name='Parent Tenant Group 2', slug='parent-tenant-group-2'),
|
||||
TenantGroup(name='Parent Tenant Group 3', slug='parent-tenant-group-3'),
|
||||
TenantGroup(name='Tenant Group 1', slug='tenant-group-1'),
|
||||
TenantGroup(name='Tenant Group 2', slug='tenant-group-2'),
|
||||
TenantGroup(name='Tenant Group 3', slug='tenant-group-3'),
|
||||
)
|
||||
for tenantgroup in parent_tenant_groups:
|
||||
tenantgroup.save()
|
||||
for tenant_group in parent_tenant_groups:
|
||||
tenant_group.save()
|
||||
|
||||
tenant_groups = (
|
||||
TenantGroup(
|
||||
name='Tenant Group 1',
|
||||
slug='tenant-group-1',
|
||||
name='Tenant Group 1A',
|
||||
slug='tenant-group-1a',
|
||||
parent=parent_tenant_groups[0],
|
||||
description='foobar1'
|
||||
),
|
||||
TenantGroup(
|
||||
name='Tenant Group 2',
|
||||
slug='tenant-group-2',
|
||||
name='Tenant Group 2A',
|
||||
slug='tenant-group-2a',
|
||||
parent=parent_tenant_groups[1],
|
||||
description='foobar2'
|
||||
),
|
||||
TenantGroup(
|
||||
name='Tenant Group 3',
|
||||
slug='tenant-group-3',
|
||||
name='Tenant Group 3A',
|
||||
slug='tenant-group-3a',
|
||||
parent=parent_tenant_groups[2],
|
||||
description='foobar3'
|
||||
),
|
||||
)
|
||||
for tenantgroup in tenant_groups:
|
||||
tenantgroup.save()
|
||||
for tenant_group in tenant_groups:
|
||||
tenant_group.save()
|
||||
|
||||
child_tenant_groups = (
|
||||
TenantGroup(name='Tenant Group 1A1', slug='tenant-group-1a1', parent=tenant_groups[0]),
|
||||
TenantGroup(name='Tenant Group 2A1', slug='tenant-group-2a1', parent=tenant_groups[1]),
|
||||
TenantGroup(name='Tenant Group 3A1', slug='tenant-group-3a1', parent=tenant_groups[2]),
|
||||
)
|
||||
for tenant_group in child_tenant_groups:
|
||||
tenant_group.save()
|
||||
|
||||
def test_q(self):
|
||||
params = {'q': 'foobar1'}
|
||||
@@ -62,12 +70,19 @@ class TenantGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||
|
||||
def test_parent(self):
|
||||
parent_groups = TenantGroup.objects.filter(name__startswith='Parent')[:2]
|
||||
params = {'parent_id': [parent_groups[0].pk, parent_groups[1].pk]}
|
||||
tenant_groups = TenantGroup.objects.filter(parent__isnull=True)[:2]
|
||||
params = {'parent_id': [tenant_groups[0].pk, tenant_groups[1].pk]}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||
params = {'parent': [parent_groups[0].slug, parent_groups[1].slug]}
|
||||
params = {'parent': [tenant_groups[0].slug, tenant_groups[1].slug]}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||
|
||||
def test_ancestor(self):
|
||||
tenant_groups = TenantGroup.objects.filter(parent__isnull=True)[:2]
|
||||
params = {'ancestor_id': [tenant_groups[0].pk, tenant_groups[1].pk]}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||
params = {'ancestor': [tenant_groups[0].slug, tenant_groups[1].slug]}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||
|
||||
|
||||
class TenantTestCase(TestCase, ChangeLoggedFilterSetTests):
|
||||
queryset = Tenant.objects.all()
|
||||
@@ -123,35 +138,43 @@ class ContactGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
|
||||
def setUpTestData(cls):
|
||||
|
||||
parent_contact_groups = (
|
||||
ContactGroup(name='Parent Contact Group 1', slug='parent-contact-group-1'),
|
||||
ContactGroup(name='Parent Contact Group 2', slug='parent-contact-group-2'),
|
||||
ContactGroup(name='Parent Contact Group 3', slug='parent-contact-group-3'),
|
||||
ContactGroup(name='Contact Group 1', slug='contact-group-1'),
|
||||
ContactGroup(name='Contact Group 2', slug='contact-group-2'),
|
||||
ContactGroup(name='Contact Group 3', slug='contact-group-3'),
|
||||
)
|
||||
for contactgroup in parent_contact_groups:
|
||||
contactgroup.save()
|
||||
for contact_group in parent_contact_groups:
|
||||
contact_group.save()
|
||||
|
||||
contact_groups = (
|
||||
ContactGroup(
|
||||
name='Contact Group 1',
|
||||
slug='contact-group-1',
|
||||
name='Contact Group 1A',
|
||||
slug='contact-group-1a',
|
||||
parent=parent_contact_groups[0],
|
||||
description='foobar1'
|
||||
),
|
||||
ContactGroup(
|
||||
name='Contact Group 2',
|
||||
slug='contact-group-2',
|
||||
name='Contact Group 2A',
|
||||
slug='contact-group-2a',
|
||||
parent=parent_contact_groups[1],
|
||||
description='foobar2'
|
||||
),
|
||||
ContactGroup(
|
||||
name='Contact Group 3',
|
||||
slug='contact-group-3',
|
||||
name='Contact Group 3A',
|
||||
slug='contact-group-3a',
|
||||
parent=parent_contact_groups[2],
|
||||
description='foobar3'
|
||||
),
|
||||
)
|
||||
for contactgroup in contact_groups:
|
||||
contactgroup.save()
|
||||
for contact_group in contact_groups:
|
||||
contact_group.save()
|
||||
|
||||
child_contact_groups = (
|
||||
ContactGroup(name='Contact Group 1A1', slug='contact-group-1a1', parent=contact_groups[0]),
|
||||
ContactGroup(name='Contact Group 2A1', slug='contact-group-2a1', parent=contact_groups[1]),
|
||||
ContactGroup(name='Contact Group 3A1', slug='contact-group-3a1', parent=contact_groups[2]),
|
||||
)
|
||||
for contact_group in child_contact_groups:
|
||||
contact_group.save()
|
||||
|
||||
def test_q(self):
|
||||
params = {'q': 'foobar1'}
|
||||
@@ -170,12 +193,19 @@ class ContactGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||
|
||||
def test_parent(self):
|
||||
parent_groups = ContactGroup.objects.filter(parent__isnull=True)[:2]
|
||||
params = {'parent_id': [parent_groups[0].pk, parent_groups[1].pk]}
|
||||
contact_groups = ContactGroup.objects.filter(parent__isnull=True)[:2]
|
||||
params = {'parent_id': [contact_groups[0].pk, contact_groups[1].pk]}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||
params = {'parent': [parent_groups[0].slug, parent_groups[1].slug]}
|
||||
params = {'parent': [contact_groups[0].slug, contact_groups[1].slug]}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||
|
||||
def test_ancestor(self):
|
||||
contact_groups = ContactGroup.objects.filter(parent__isnull=True)[:2]
|
||||
params = {'ancestor_id': [contact_groups[0].pk, contact_groups[1].pk]}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||
params = {'ancestor': [contact_groups[0].slug, contact_groups[1].slug]}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||
|
||||
|
||||
class ContactRoleTestCase(TestCase, ChangeLoggedFilterSetTests):
|
||||
queryset = ContactRole.objects.all()
|
||||
|
||||
Reference in New Issue
Block a user