mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-19 05:21:55 -06:00
#11584: Add bulk edit view & tests
This commit is contained in:
parent
1e493f6f28
commit
c35e7b8ee5
@ -1,10 +1,12 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
from netbox.forms import NetBoxModelBulkEditForm
|
from netbox.forms import NetBoxModelBulkEditForm
|
||||||
|
from tenancy.choices import ContactPriorityChoices
|
||||||
from tenancy.models import *
|
from tenancy.models import *
|
||||||
from utilities.forms import CommentField, DynamicModelChoiceField
|
from utilities.forms import CommentField, DynamicModelChoiceField, add_blank_choice
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
|
'ContactAssignmentBulkEditForm',
|
||||||
'ContactBulkEditForm',
|
'ContactBulkEditForm',
|
||||||
'ContactGroupBulkEditForm',
|
'ContactGroupBulkEditForm',
|
||||||
'ContactRoleBulkEditForm',
|
'ContactRoleBulkEditForm',
|
||||||
@ -114,3 +116,24 @@ class ContactBulkEditForm(NetBoxModelBulkEditForm):
|
|||||||
(None, ('group', 'title', 'phone', 'email', 'address', 'link', 'description')),
|
(None, ('group', 'title', 'phone', 'email', 'address', 'link', 'description')),
|
||||||
)
|
)
|
||||||
nullable_fields = ('group', 'title', 'phone', 'email', 'address', 'link', 'description', 'comments')
|
nullable_fields = ('group', 'title', 'phone', 'email', 'address', 'link', 'description', 'comments')
|
||||||
|
|
||||||
|
|
||||||
|
class ContactAssignmentBulkEditForm(NetBoxModelBulkEditForm):
|
||||||
|
contact = DynamicModelChoiceField(
|
||||||
|
queryset=Contact.objects.all(),
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
role = DynamicModelChoiceField(
|
||||||
|
queryset=ContactRole.objects.all(),
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
priority = forms.ChoiceField(
|
||||||
|
choices=add_blank_choice(ContactPriorityChoices),
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
|
||||||
|
model = ContactAssignment
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('contact', 'role', 'priority')),
|
||||||
|
)
|
||||||
|
nullable_fields = ('priority',)
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
from django.urls import reverse
|
||||||
|
|
||||||
|
from dcim.models import Site
|
||||||
|
from tenancy.choices import ContactPriorityChoices
|
||||||
from tenancy.models import *
|
from tenancy.models import *
|
||||||
from utilities.testing import ViewTestCases, create_tags
|
from utilities.testing import ViewTestCases, create_tags
|
||||||
|
|
||||||
@ -223,3 +228,89 @@ class ContactTestCase(ViewTestCases.PrimaryObjectViewTestCase):
|
|||||||
cls.bulk_edit_data = {
|
cls.bulk_edit_data = {
|
||||||
'group': contact_groups[1].pk,
|
'group': contact_groups[1].pk,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ContactAssignmentTestCase(
|
||||||
|
ViewTestCases.CreateObjectViewTestCase,
|
||||||
|
ViewTestCases.EditObjectViewTestCase,
|
||||||
|
ViewTestCases.DeleteObjectViewTestCase,
|
||||||
|
ViewTestCases.ListObjectsViewTestCase,
|
||||||
|
ViewTestCases.BulkEditObjectsViewTestCase,
|
||||||
|
ViewTestCases.BulkDeleteObjectsViewTestCase
|
||||||
|
):
|
||||||
|
model = ContactAssignment
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpTestData(cls):
|
||||||
|
|
||||||
|
sites = (
|
||||||
|
Site(name='Site 1', slug='site-1'),
|
||||||
|
Site(name='Site 2', slug='site-2'),
|
||||||
|
Site(name='Site 3', slug='site-3'),
|
||||||
|
Site(name='Site 4', slug='site-4'),
|
||||||
|
)
|
||||||
|
Site.objects.bulk_create(sites)
|
||||||
|
|
||||||
|
contacts = (
|
||||||
|
Contact(name='Contact 1'),
|
||||||
|
Contact(name='Contact 2'),
|
||||||
|
Contact(name='Contact 3'),
|
||||||
|
Contact(name='Contact 4'),
|
||||||
|
)
|
||||||
|
Contact.objects.bulk_create(contacts)
|
||||||
|
|
||||||
|
contact_roles = (
|
||||||
|
ContactRole(name='Contact Role 1', slug='contact-role-1'),
|
||||||
|
ContactRole(name='Contact Role 2', slug='contact-role-2'),
|
||||||
|
ContactRole(name='Contact Role 3', slug='contact-role-3'),
|
||||||
|
ContactRole(name='Contact Role 4', slug='contact-role-4'),
|
||||||
|
)
|
||||||
|
ContactRole.objects.bulk_create(contact_roles)
|
||||||
|
|
||||||
|
assignments = (
|
||||||
|
ContactAssignment(
|
||||||
|
object=sites[0],
|
||||||
|
contact=contacts[0],
|
||||||
|
role=contact_roles[0],
|
||||||
|
priority=ContactPriorityChoices.PRIORITY_PRIMARY
|
||||||
|
),
|
||||||
|
ContactAssignment(
|
||||||
|
object=sites[1],
|
||||||
|
contact=contacts[1],
|
||||||
|
role=contact_roles[1],
|
||||||
|
priority=ContactPriorityChoices.PRIORITY_SECONDARY
|
||||||
|
),
|
||||||
|
ContactAssignment(
|
||||||
|
object=sites[2],
|
||||||
|
contact=contacts[2],
|
||||||
|
role=contact_roles[2],
|
||||||
|
priority=ContactPriorityChoices.PRIORITY_TERTIARY
|
||||||
|
),
|
||||||
|
)
|
||||||
|
ContactAssignment.objects.bulk_create(assignments)
|
||||||
|
|
||||||
|
tags = create_tags('Alpha', 'Bravo', 'Charlie')
|
||||||
|
|
||||||
|
cls.form_data = {
|
||||||
|
'content_type': ContentType.objects.get_for_model(Site).pk,
|
||||||
|
'object_id': sites[3].pk,
|
||||||
|
'contact': contacts[3].pk,
|
||||||
|
'role': contact_roles[3].pk,
|
||||||
|
'priority': ContactPriorityChoices.PRIORITY_INACTIVE,
|
||||||
|
'tags': [t.pk for t in tags],
|
||||||
|
}
|
||||||
|
|
||||||
|
cls.bulk_edit_data = {
|
||||||
|
'role': contact_roles[3].pk,
|
||||||
|
'priority': ContactPriorityChoices.PRIORITY_INACTIVE,
|
||||||
|
}
|
||||||
|
|
||||||
|
def _get_url(self, action, instance=None):
|
||||||
|
# Override creation URL to append content_type & object_id parameters
|
||||||
|
if action == 'add':
|
||||||
|
url = reverse('tenancy:contactassignment_add')
|
||||||
|
content_type = ContentType.objects.get_for_model(Site).pk
|
||||||
|
object_id = Site.objects.first().pk
|
||||||
|
return f"{url}?content_type={content_type}&object_id={object_id}"
|
||||||
|
|
||||||
|
return super()._get_url(action, instance=instance)
|
||||||
|
@ -49,6 +49,7 @@ urlpatterns = [
|
|||||||
# Contact assignments
|
# Contact assignments
|
||||||
path('contact-assignments/', views.ContactAssignmentListView.as_view(), name='contactassignment_list'),
|
path('contact-assignments/', views.ContactAssignmentListView.as_view(), name='contactassignment_list'),
|
||||||
path('contact-assignments/add/', views.ContactAssignmentEditView.as_view(), name='contactassignment_add'),
|
path('contact-assignments/add/', views.ContactAssignmentEditView.as_view(), name='contactassignment_add'),
|
||||||
|
path('contact-assignments/edit/', views.ContactAssignmentBulkEditView.as_view(), name='contactassignment_bulk_edit'),
|
||||||
path('contact-assignments/delete/', views.ContactAssignmentBulkDeleteView.as_view(), name='contactassignment_bulk_delete'),
|
path('contact-assignments/delete/', views.ContactAssignmentBulkDeleteView.as_view(), name='contactassignment_bulk_delete'),
|
||||||
path('contact-assignments/<int:pk>/', include(get_model_urls('tenancy', 'contactassignment'))),
|
path('contact-assignments/<int:pk>/', include(get_model_urls('tenancy', 'contactassignment'))),
|
||||||
|
|
||||||
|
@ -349,7 +349,6 @@ class ContactAssignmentListView(generic.ObjectListView):
|
|||||||
filterset = filtersets.ContactAssignmentFilterSet
|
filterset = filtersets.ContactAssignmentFilterSet
|
||||||
filterset_form = forms.ContactAssignmentFilterForm
|
filterset_form = forms.ContactAssignmentFilterForm
|
||||||
table = tables.ContactAssignmentTable
|
table = tables.ContactAssignmentTable
|
||||||
actions = ('export', 'bulk_delete')
|
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(ContactAssignment, 'edit')
|
@register_model_view(ContactAssignment, 'edit')
|
||||||
@ -372,6 +371,13 @@ class ContactAssignmentEditView(generic.ObjectEditView):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ContactAssignmentBulkEditView(generic.BulkEditView):
|
||||||
|
queryset = ContactAssignment.objects.all()
|
||||||
|
filterset = filtersets.ContactAssignmentFilterSet
|
||||||
|
table = tables.ContactAssignmentTable
|
||||||
|
form = forms.ContactAssignmentBulkEditForm
|
||||||
|
|
||||||
|
|
||||||
class ContactAssignmentBulkDeleteView(generic.BulkDeleteView):
|
class ContactAssignmentBulkDeleteView(generic.BulkDeleteView):
|
||||||
queryset = ContactAssignment.objects.all()
|
queryset = ContactAssignment.objects.all()
|
||||||
filterset = filtersets.ContactAssignmentFilterSet
|
filterset = filtersets.ContactAssignmentFilterSet
|
||||||
|
Loading…
Reference in New Issue
Block a user