From 157bf89e899874d2ed28a603ac7cd7ddae0b59f8 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 26 Jan 2023 09:46:28 -0500 Subject: [PATCH] Closes #11584: Add a list view for contact assignments --- docs/release-notes/version-3.5.md | 1 + netbox/netbox/navigation/menu.py | 1 + netbox/tenancy/forms/filtersets.py | 41 +++++++++++++++++++++++++++++- netbox/tenancy/urls.py | 1 + netbox/tenancy/views.py | 7 +++++ 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.5.md b/docs/release-notes/version-3.5.md index be0dca39c..69a0b8d31 100644 --- a/docs/release-notes/version-3.5.md +++ b/docs/release-notes/version-3.5.md @@ -4,6 +4,7 @@ ### Enhancements +* [#11584](https://github.com/netbox-community/netbox/issues/11584) - Add a list view for contact assignments * [#11254](https://github.com/netbox-community/netbox/issues/11254) - Introduce the `X-Request-ID` HTTP header to annotate the unique ID of each request for change logging * [#11440](https://github.com/netbox-community/netbox/issues/11440) - Add an `enabled` field for device type interfaces diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 09a35489d..83a81690f 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -46,6 +46,7 @@ ORGANIZATION_MENU = Menu( get_model_item('tenancy', 'contact', _('Contacts')), get_model_item('tenancy', 'contactgroup', _('Contact Groups')), get_model_item('tenancy', 'contactrole', _('Contact Roles')), + get_model_item('tenancy', 'contactassignment', _('Contact Assignments'), actions=[]), ), ), ), diff --git a/netbox/tenancy/forms/filtersets.py b/netbox/tenancy/forms/filtersets.py index c5d7fca0c..7f843d9a4 100644 --- a/netbox/tenancy/forms/filtersets.py +++ b/netbox/tenancy/forms/filtersets.py @@ -1,11 +1,17 @@ +from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext as _ +from extras.utils import FeatureQuery from netbox.forms import NetBoxModelFilterSetForm +from tenancy.choices import * from tenancy.models import * from tenancy.forms import ContactModelFilterForm -from utilities.forms import DynamicModelMultipleChoiceField, TagFilterField +from utilities.forms.fields import ( + ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, MultipleChoiceField, TagFilterField, +) __all__ = ( + 'ContactAssignmentFilterForm', 'ContactFilterForm', 'ContactGroupFilterForm', 'ContactRoleFilterForm', @@ -71,3 +77,36 @@ class ContactFilterForm(NetBoxModelFilterSetForm): label=_('Group') ) tag = TagFilterField(model) + + +class ContactAssignmentFilterForm(NetBoxModelFilterSetForm): + model = ContactAssignment + fieldsets = ( + (None, ('q', 'filter_id')), + ('Assignment', ('content_type_id', 'group_id', 'contact_id', 'role_id', 'priority')), + ) + content_type_id = ContentTypeMultipleChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_fields'), + required=False, + label=_('Object type') + ) + group_id = DynamicModelMultipleChoiceField( + queryset=ContactGroup.objects.all(), + required=False, + label=_('Group') + ) + contact_id = DynamicModelMultipleChoiceField( + queryset=Contact.objects.all(), + required=False, + label=_('Contact') + ) + role_id = DynamicModelMultipleChoiceField( + queryset=ContactRole.objects.all(), + required=False, + label=_('Role') + ) + priority = MultipleChoiceField( + choices=ContactPriorityChoices, + required=False + ) diff --git a/netbox/tenancy/urls.py b/netbox/tenancy/urls.py index 3b5addaec..cb8715f70 100644 --- a/netbox/tenancy/urls.py +++ b/netbox/tenancy/urls.py @@ -47,6 +47,7 @@ urlpatterns = [ path('contacts//', include(get_model_urls('tenancy', 'contact'))), # Contact assignments + path('contact-assignments/', views.ContactAssignmentListView.as_view(), name='contactassignment_list'), path('contact-assignments/add/', views.ContactAssignmentEditView.as_view(), name='contactassignment_add'), path('contact-assignments//', include(get_model_urls('tenancy', 'contactassignment'))), diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 93830bd55..b13a9c12c 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -366,6 +366,13 @@ class ContactBulkDeleteView(generic.BulkDeleteView): # Contact assignments # +class ContactAssignmentListView(generic.ObjectListView): + queryset = ContactAssignment.objects.all() + filterset = filtersets.ContactAssignmentFilterSet + filterset_form = forms.ContactAssignmentFilterForm + table = tables.ContactAssignmentTable + + @register_model_view(ContactAssignment, 'edit') class ContactAssignmentEditView(generic.ObjectEditView): queryset = ContactAssignment.objects.all()