Skip to content

Commit 929d4d2

Browse files
committed
Fixes #14522: Fix filtering contact assignments by group
1 parent d14e4ab commit 929d4d2

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

netbox/tenancy/filtersets.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,19 @@ class ContactAssignmentFilterSet(ChangeLoggedModelFilterSet):
9191
queryset=Contact.objects.all(),
9292
label=_('Contact (ID)'),
9393
)
94+
group_id = TreeNodeMultipleChoiceFilter(
95+
queryset=ContactGroup.objects.all(),
96+
field_name='contact__group',
97+
lookup_expr='in',
98+
label=_('Contact group (ID)'),
99+
)
100+
group = TreeNodeMultipleChoiceFilter(
101+
queryset=ContactGroup.objects.all(),
102+
field_name='contact__group',
103+
lookup_expr='in',
104+
to_field_name='slug',
105+
label=_('Contact group (slug)'),
106+
)
94107
role_id = django_filters.ModelMultipleChoiceFilter(
95108
queryset=ContactRole.objects.all(),
96109
label=_('Contact role (ID)'),

netbox/tenancy/tests/test_filtersets.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from django.contrib.contenttypes.models import ContentType
12
from django.test import TestCase
23

4+
from dcim.models import Manufacturer, Site
35
from tenancy.filtersets import *
46
from tenancy.models import *
57
from utilities.testing import ChangeLoggedFilterSetTests
@@ -192,3 +194,72 @@ def test_group(self):
192194
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
193195
params = {'group': [group[0].slug, group[1].slug]}
194196
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
197+
198+
199+
class ContactAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests):
200+
queryset = ContactAssignment.objects.all()
201+
filterset = ContactAssignmentFilterSet
202+
203+
@classmethod
204+
def setUpTestData(cls):
205+
206+
manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
207+
sites = (
208+
Site(name='Site 1', slug='site-1'),
209+
Site(name='Site 2', slug='site-2'),
210+
Site(name='Site 3', slug='site-3'),
211+
)
212+
Site.objects.bulk_create(sites)
213+
214+
contact_groups = (
215+
ContactGroup(name='Contact Group 1', slug='contact-group-1'),
216+
ContactGroup(name='Contact Group 2', slug='contact-group-2'),
217+
ContactGroup(name='Contact Group 3', slug='contact-group-3'),
218+
)
219+
for contactgroup in contact_groups:
220+
contactgroup.save()
221+
222+
contact_roles = (
223+
ContactRole(name='Contact Role 1', slug='contact-role-1'),
224+
ContactRole(name='Contact Role 2', slug='contact-role-2'),
225+
ContactRole(name='Contact Role 3', slug='contact-role-3'),
226+
)
227+
ContactRole.objects.bulk_create(contact_roles)
228+
229+
contacts = (
230+
Contact(name='Contact 1', group=contact_groups[0]),
231+
Contact(name='Contact 2', group=contact_groups[1]),
232+
Contact(name='Contact 3', group=contact_groups[2]),
233+
)
234+
Contact.objects.bulk_create(contacts)
235+
236+
assignments = (
237+
ContactAssignment(object=sites[0], contact=contacts[0], role=contact_roles[0]),
238+
ContactAssignment(object=sites[1], contact=contacts[1], role=contact_roles[1]),
239+
ContactAssignment(object=sites[2], contact=contacts[2], role=contact_roles[2]),
240+
ContactAssignment(object=manufacturer, contact=contacts[2], role=contact_roles[2]),
241+
)
242+
ContactAssignment.objects.bulk_create(assignments)
243+
244+
def test_content_type(self):
245+
params = {'content_type_id': ContentType.objects.get_by_natural_key('dcim', 'site')}
246+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
247+
248+
def test_contact(self):
249+
contacts = Contact.objects.all()[:2]
250+
params = {'contact_id': [contacts[0].pk, contacts[1].pk]}
251+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
252+
253+
def test_group(self):
254+
group = ContactGroup.objects.all()[:2]
255+
params = {'group_id': [group[0].pk, group[1].pk]}
256+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
257+
params = {'group': [group[0].slug, group[1].slug]}
258+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
259+
260+
def test_role(self):
261+
role = ContactRole.objects.all()[:2]
262+
params = {'role_id': [role[0].pk, role[1].pk]}
263+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
264+
params = {'role': [role[0].slug, role[1].slug]}
265+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)

0 commit comments

Comments
 (0)