Closes #15383: Standardize filtering logic for the parents of recursively-nested models

This commit is contained in:
Jeremy Stretch
2024-03-11 12:32:06 -04:00
parent 21de3f954f
commit d6acc18c29
6 changed files with 262 additions and 90 deletions

View File

@@ -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)'),
)

View File

@@ -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()