diff --git a/netbox/templates/tenancy/contactgroup.html b/netbox/templates/tenancy/contactgroup.html
index bf6928c15..25b1da440 100644
--- a/netbox/templates/tenancy/contactgroup.html
+++ b/netbox/templates/tenancy/contactgroup.html
@@ -32,6 +32,7 @@
{% include 'inc/panels/tags.html' %}
+ {% include 'inc/panels/comments.html' %}
{% plugin_left_page object %}
diff --git a/netbox/tenancy/api/serializers_/contacts.py b/netbox/tenancy/api/serializers_/contacts.py
index 8c24df734..846e618b4 100644
--- a/netbox/tenancy/api/serializers_/contacts.py
+++ b/netbox/tenancy/api/serializers_/contacts.py
@@ -26,7 +26,7 @@ class ContactGroupSerializer(NestedGroupModelSerializer):
model = ContactGroup
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields',
- 'created', 'last_updated', 'contact_count', '_depth',
+ 'created', 'last_updated', 'contact_count', 'comments', '_depth',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'contact_count', '_depth')
diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py
index e2de18231..ff5563f1a 100644
--- a/netbox/tenancy/filtersets.py
+++ b/netbox/tenancy/filtersets.py
@@ -51,6 +51,16 @@ class ContactGroupFilterSet(OrganizationalModelFilterSet):
model = ContactGroup
fields = ('id', 'name', 'slug', 'description')
+ def search(self, queryset, name, value):
+ if not value.strip():
+ return queryset
+ return queryset.filter(
+ Q(name__icontains=value) |
+ Q(slug__icontains=value) |
+ Q(description__icontains=value) |
+ Q(comments__icontains=value)
+ )
+
class ContactRoleFilterSet(OrganizationalModelFilterSet):
diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py
index 5af3f22ac..a8528aec8 100644
--- a/netbox/tenancy/forms/bulk_edit.py
+++ b/netbox/tenancy/forms/bulk_edit.py
@@ -67,12 +67,13 @@ class ContactGroupBulkEditForm(NetBoxModelBulkEditForm):
max_length=200,
required=False
)
+ comments = CommentField()
model = ContactGroup
fieldsets = (
FieldSet('parent', 'description'),
)
- nullable_fields = ('parent', 'description')
+ nullable_fields = ('parent', 'description', 'comments')
class ContactRoleBulkEditForm(NetBoxModelBulkEditForm):
diff --git a/netbox/tenancy/forms/bulk_import.py b/netbox/tenancy/forms/bulk_import.py
index f37317549..d227cef14 100644
--- a/netbox/tenancy/forms/bulk_import.py
+++ b/netbox/tenancy/forms/bulk_import.py
@@ -65,7 +65,7 @@ class ContactGroupImportForm(NetBoxModelImportForm):
class Meta:
model = ContactGroup
- fields = ('name', 'slug', 'parent', 'description', 'tags')
+ fields = ('name', 'slug', 'parent', 'description', 'tags', 'comments')
class ContactRoleImportForm(NetBoxModelImportForm):
diff --git a/netbox/tenancy/forms/model_forms.py b/netbox/tenancy/forms/model_forms.py
index bc18deed6..d65d47f1f 100644
--- a/netbox/tenancy/forms/model_forms.py
+++ b/netbox/tenancy/forms/model_forms.py
@@ -70,6 +70,7 @@ class ContactGroupForm(NetBoxModelForm):
required=False
)
slug = SlugField()
+ comments = CommentField()
fieldsets = (
FieldSet('parent', 'name', 'slug', 'description', 'tags', name=_('Contact Group')),
@@ -77,7 +78,7 @@ class ContactGroupForm(NetBoxModelForm):
class Meta:
model = ContactGroup
- fields = ('parent', 'name', 'slug', 'description', 'tags')
+ fields = ('parent', 'name', 'slug', 'description', 'tags', 'comments')
class ContactRoleForm(NetBoxModelForm):
diff --git a/netbox/tenancy/search.py b/netbox/tenancy/search.py
index 56903d6b1..5050114a6 100644
--- a/netbox/tenancy/search.py
+++ b/netbox/tenancy/search.py
@@ -25,6 +25,7 @@ class ContactGroupIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
+ ('comments', 5000),
)
display_attrs = ('description',)
diff --git a/netbox/tenancy/tables/contacts.py b/netbox/tenancy/tables/contacts.py
index c4e35ab1b..e8761720e 100644
--- a/netbox/tenancy/tables/contacts.py
+++ b/netbox/tenancy/tables/contacts.py
@@ -31,7 +31,8 @@ class ContactGroupTable(NetBoxTable):
class Meta(NetBoxTable.Meta):
model = ContactGroup
fields = (
- 'pk', 'name', 'contact_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions',
+ 'pk', 'name', 'contact_count', 'description', 'comments', 'slug', 'tags', 'created',
+ 'last_updated', 'actions',
)
default_columns = ('pk', 'name', 'contact_count', 'description')
diff --git a/netbox/tenancy/tests/test_api.py b/netbox/tenancy/tests/test_api.py
index c32ad3826..4dc33f943 100644
--- a/netbox/tenancy/tests/test_api.py
+++ b/netbox/tenancy/tests/test_api.py
@@ -107,13 +107,18 @@ class ContactGroupTest(APIViewTestCases.APIViewTestCase):
def setUpTestData(cls):
parent_contact_groups = (
- ContactGroup.objects.create(name='Parent Contact Group 1', slug='parent-contact-group-1'),
+ ContactGroup.objects.create(
+ name='Parent Contact Group 1', slug='parent-contact-group-1', comments='Parent 1 comment'
+ ),
ContactGroup.objects.create(name='Parent Contact Group 2', slug='parent-contact-group-2'),
)
ContactGroup.objects.create(name='Contact Group 1', slug='contact-group-1', parent=parent_contact_groups[0])
ContactGroup.objects.create(name='Contact Group 2', slug='contact-group-2', parent=parent_contact_groups[0])
- ContactGroup.objects.create(name='Contact Group 3', slug='contact-group-3', parent=parent_contact_groups[0])
+ ContactGroup.objects.create(
+ name='Contact Group 3', slug='contact-group-3', parent=parent_contact_groups[0],
+ comments='Child Group 3 comment',
+ )
cls.create_data = [
{
@@ -125,11 +130,13 @@ class ContactGroupTest(APIViewTestCases.APIViewTestCase):
'name': 'Contact Group 5',
'slug': 'contact-group-5',
'parent': parent_contact_groups[1].pk,
+ 'comments': '',
},
{
'name': 'Contact Group 6',
'slug': 'contact-group-6',
'parent': parent_contact_groups[1].pk,
+ 'comments': 'Child Group 6 comment',
},
]
diff --git a/netbox/tenancy/tests/test_filtersets.py b/netbox/tenancy/tests/test_filtersets.py
index f6890a3d4..97005dd1e 100644
--- a/netbox/tenancy/tests/test_filtersets.py
+++ b/netbox/tenancy/tests/test_filtersets.py
@@ -139,7 +139,7 @@ class ContactGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
parent_contact_groups = (
ContactGroup(name='Contact Group 1', slug='contact-group-1'),
- ContactGroup(name='Contact Group 2', slug='contact-group-2'),
+ ContactGroup(name='Contact Group 2', slug='contact-group-2', comments='Parent group 2'),
ContactGroup(name='Contact Group 3', slug='contact-group-3'),
)
for contact_group in parent_contact_groups:
@@ -162,14 +162,18 @@ class ContactGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
name='Contact Group 3A',
slug='contact-group-3a',
parent=parent_contact_groups[2],
- description='foobar3'
+ description='foobar3',
+ comments='Contact Group 3A comment, not a parent',
),
)
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 1A1', slug='contact-group-1a1', parent=contact_groups[0],
+ comments='Contact Group 1A1 comment',
+ ),
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]),
)
@@ -180,6 +184,13 @@ class ContactGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
+ def test_q_comments(self):
+ params = {'q': 'parent'}
+ self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+
+ params = {'q': '1A1'}
+ self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
+
def test_name(self):
params = {'name': ['Contact Group 1', 'Contact Group 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
diff --git a/netbox/tenancy/tests/test_views.py b/netbox/tenancy/tests/test_views.py
index cbdecc0d0..b67ea428b 100644
--- a/netbox/tenancy/tests/test_views.py
+++ b/netbox/tenancy/tests/test_views.py
@@ -106,7 +106,7 @@ class ContactGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
def setUpTestData(cls):
contact_groups = (
- ContactGroup(name='Contact Group 1', slug='contact-group-1'),
+ ContactGroup(name='Contact Group 1', slug='contact-group-1', comments='Comment 1'),
ContactGroup(name='Contact Group 2', slug='contact-group-2'),
ContactGroup(name='Contact Group 3', slug='contact-group-3'),
)
@@ -120,24 +120,26 @@ class ContactGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
'slug': 'contact-group-x',
'description': 'A new contact group',
'tags': [t.pk for t in tags],
+ 'comments': 'Form data comment',
}
cls.csv_data = (
- "name,slug,description",
- "Contact Group 4,contact-group-4,Fourth contact group",
- "Contact Group 5,contact-group-5,Fifth contact group",
- "Contact Group 6,contact-group-6,Sixth contact group",
+ "name,slug,description,comments",
+ "Contact Group 4,contact-group-4,Fourth contact group,",
+ "Contact Group 5,contact-group-5,Fifth contact group,Fifth comment",
+ "Contact Group 6,contact-group-6,Sixth contact group,",
)
cls.csv_update_data = (
- "id,name,description",
- f"{contact_groups[0].pk},Contact Group 7,Fourth contact group7",
- f"{contact_groups[1].pk},Contact Group 8,Fifth contact group8",
- f"{contact_groups[2].pk},Contact Group 0,Sixth contact group9",
+ "id,name,description,comments",
+ f"{contact_groups[0].pk},Contact Group 7,Fourth contact group7,",
+ f"{contact_groups[1].pk},Contact Group 8,Fifth contact group8,Group 8 comment",
+ f"{contact_groups[2].pk},Contact Group 0,Sixth contact group9,",
)
cls.bulk_edit_data = {
'description': 'New description',
+ 'comments': 'Bulk update comment',
}