Skip to content

Commit c35e7b8

Browse files
committed
#11584: Add bulk edit view & tests
1 parent 1e493f6 commit c35e7b8

File tree

4 files changed

+123
-2
lines changed

4 files changed

+123
-2
lines changed

netbox/tenancy/forms/bulk_edit.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from django import forms
22

33
from netbox.forms import NetBoxModelBulkEditForm
4+
from tenancy.choices import ContactPriorityChoices
45
from tenancy.models import *
5-
from utilities.forms import CommentField, DynamicModelChoiceField
6+
from utilities.forms import CommentField, DynamicModelChoiceField, add_blank_choice
67

78
__all__ = (
9+
'ContactAssignmentBulkEditForm',
810
'ContactBulkEditForm',
911
'ContactGroupBulkEditForm',
1012
'ContactRoleBulkEditForm',
@@ -114,3 +116,24 @@ class ContactBulkEditForm(NetBoxModelBulkEditForm):
114116
(None, ('group', 'title', 'phone', 'email', 'address', 'link', 'description')),
115117
)
116118
nullable_fields = ('group', 'title', 'phone', 'email', 'address', 'link', 'description', 'comments')
119+
120+
121+
class ContactAssignmentBulkEditForm(NetBoxModelBulkEditForm):
122+
contact = DynamicModelChoiceField(
123+
queryset=Contact.objects.all(),
124+
required=False
125+
)
126+
role = DynamicModelChoiceField(
127+
queryset=ContactRole.objects.all(),
128+
required=False
129+
)
130+
priority = forms.ChoiceField(
131+
choices=add_blank_choice(ContactPriorityChoices),
132+
required=False
133+
)
134+
135+
model = ContactAssignment
136+
fieldsets = (
137+
(None, ('contact', 'role', 'priority')),
138+
)
139+
nullable_fields = ('priority',)

netbox/tenancy/tests/test_views.py

+91
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
from django.contrib.contenttypes.models import ContentType
2+
from django.urls import reverse
3+
4+
from dcim.models import Site
5+
from tenancy.choices import ContactPriorityChoices
16
from tenancy.models import *
27
from utilities.testing import ViewTestCases, create_tags
38

@@ -223,3 +228,89 @@ def setUpTestData(cls):
223228
cls.bulk_edit_data = {
224229
'group': contact_groups[1].pk,
225230
}
231+
232+
233+
class ContactAssignmentTestCase(
234+
ViewTestCases.CreateObjectViewTestCase,
235+
ViewTestCases.EditObjectViewTestCase,
236+
ViewTestCases.DeleteObjectViewTestCase,
237+
ViewTestCases.ListObjectsViewTestCase,
238+
ViewTestCases.BulkEditObjectsViewTestCase,
239+
ViewTestCases.BulkDeleteObjectsViewTestCase
240+
):
241+
model = ContactAssignment
242+
243+
@classmethod
244+
def setUpTestData(cls):
245+
246+
sites = (
247+
Site(name='Site 1', slug='site-1'),
248+
Site(name='Site 2', slug='site-2'),
249+
Site(name='Site 3', slug='site-3'),
250+
Site(name='Site 4', slug='site-4'),
251+
)
252+
Site.objects.bulk_create(sites)
253+
254+
contacts = (
255+
Contact(name='Contact 1'),
256+
Contact(name='Contact 2'),
257+
Contact(name='Contact 3'),
258+
Contact(name='Contact 4'),
259+
)
260+
Contact.objects.bulk_create(contacts)
261+
262+
contact_roles = (
263+
ContactRole(name='Contact Role 1', slug='contact-role-1'),
264+
ContactRole(name='Contact Role 2', slug='contact-role-2'),
265+
ContactRole(name='Contact Role 3', slug='contact-role-3'),
266+
ContactRole(name='Contact Role 4', slug='contact-role-4'),
267+
)
268+
ContactRole.objects.bulk_create(contact_roles)
269+
270+
assignments = (
271+
ContactAssignment(
272+
object=sites[0],
273+
contact=contacts[0],
274+
role=contact_roles[0],
275+
priority=ContactPriorityChoices.PRIORITY_PRIMARY
276+
),
277+
ContactAssignment(
278+
object=sites[1],
279+
contact=contacts[1],
280+
role=contact_roles[1],
281+
priority=ContactPriorityChoices.PRIORITY_SECONDARY
282+
),
283+
ContactAssignment(
284+
object=sites[2],
285+
contact=contacts[2],
286+
role=contact_roles[2],
287+
priority=ContactPriorityChoices.PRIORITY_TERTIARY
288+
),
289+
)
290+
ContactAssignment.objects.bulk_create(assignments)
291+
292+
tags = create_tags('Alpha', 'Bravo', 'Charlie')
293+
294+
cls.form_data = {
295+
'content_type': ContentType.objects.get_for_model(Site).pk,
296+
'object_id': sites[3].pk,
297+
'contact': contacts[3].pk,
298+
'role': contact_roles[3].pk,
299+
'priority': ContactPriorityChoices.PRIORITY_INACTIVE,
300+
'tags': [t.pk for t in tags],
301+
}
302+
303+
cls.bulk_edit_data = {
304+
'role': contact_roles[3].pk,
305+
'priority': ContactPriorityChoices.PRIORITY_INACTIVE,
306+
}
307+
308+
def _get_url(self, action, instance=None):
309+
# Override creation URL to append content_type & object_id parameters
310+
if action == 'add':
311+
url = reverse('tenancy:contactassignment_add')
312+
content_type = ContentType.objects.get_for_model(Site).pk
313+
object_id = Site.objects.first().pk
314+
return f"{url}?content_type={content_type}&object_id={object_id}"
315+
316+
return super()._get_url(action, instance=instance)

netbox/tenancy/urls.py

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
# Contact assignments
5050
path('contact-assignments/', views.ContactAssignmentListView.as_view(), name='contactassignment_list'),
5151
path('contact-assignments/add/', views.ContactAssignmentEditView.as_view(), name='contactassignment_add'),
52+
path('contact-assignments/edit/', views.ContactAssignmentBulkEditView.as_view(), name='contactassignment_bulk_edit'),
5253
path('contact-assignments/delete/', views.ContactAssignmentBulkDeleteView.as_view(), name='contactassignment_bulk_delete'),
5354
path('contact-assignments/<int:pk>/', include(get_model_urls('tenancy', 'contactassignment'))),
5455

netbox/tenancy/views.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,6 @@ class ContactAssignmentListView(generic.ObjectListView):
349349
filterset = filtersets.ContactAssignmentFilterSet
350350
filterset_form = forms.ContactAssignmentFilterForm
351351
table = tables.ContactAssignmentTable
352-
actions = ('export', 'bulk_delete')
353352

354353

355354
@register_model_view(ContactAssignment, 'edit')
@@ -372,6 +371,13 @@ def get_extra_addanother_params(self, request):
372371
}
373372

374373

374+
class ContactAssignmentBulkEditView(generic.BulkEditView):
375+
queryset = ContactAssignment.objects.all()
376+
filterset = filtersets.ContactAssignmentFilterSet
377+
table = tables.ContactAssignmentTable
378+
form = forms.ContactAssignmentBulkEditForm
379+
380+
375381
class ContactAssignmentBulkDeleteView(generic.BulkDeleteView):
376382
queryset = ContactAssignment.objects.all()
377383
filterset = filtersets.ContactAssignmentFilterSet

0 commit comments

Comments
 (0)