Adds WirelessLANGroup.comments to all the required places

- [x] 1. Add the field to the model class
- [x] 2. Generate and run database migrations
- [NA] 3. Add validation logic to clean()
- [NA] 4. Update relevant querysets
- [x] 5. Update API serializer
- [x] 6. Add fields to forms
    - [x] wireless.forms.model_forms, create/edit (e.g. model_forms.py)
    - [x] wireless.forms.bulk_edit, bulk edit
    - [x] wireless.forms.bulk_import, CSV import
    - [NA] filter (UI and API)
- [x] 7. Extend object filter set
- [NA] 8. Add column to object table (Note: was already present)
- [x] 9. Update the SearchIndex
- [x] 10. Update the UI templates
- [x] 11. Create/extend test cases
    - [NA] models
    - [x] views
    - [NA] forms
    - [x] filtersets
    - [x] api
- [NA] 12. Update the model's documentation
This commit is contained in:
Jason Novinger 2025-03-11 11:51:25 -05:00
parent 157df20ad4
commit c0b019b735
10 changed files with 51 additions and 15 deletions

View File

@ -40,6 +40,7 @@
</table> </table>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/comments.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">

View File

@ -26,7 +26,7 @@ class WirelessLANGroupSerializer(NestedGroupModelSerializer):
model = WirelessLANGroup model = WirelessLANGroup
fields = [ fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields',
'created', 'last_updated', 'wirelesslan_count', '_depth', 'created', 'last_updated', 'wirelesslan_count', 'comments', '_depth',
] ]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'wirelesslan_count', '_depth') brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'wirelesslan_count', '_depth')

View File

@ -43,6 +43,16 @@ class WirelessLANGroupFilterSet(OrganizationalModelFilterSet):
model = WirelessLANGroup model = WirelessLANGroup
fields = ('id', 'name', 'slug', 'description') 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 WirelessLANFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet): class WirelessLANFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet):
group_id = TreeNodeMultipleChoiceFilter( group_id = TreeNodeMultipleChoiceFilter(

View File

@ -32,12 +32,13 @@ class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm):
max_length=200, max_length=200,
required=False required=False
) )
comments = CommentField()
model = WirelessLANGroup model = WirelessLANGroup
fieldsets = ( fieldsets = (
FieldSet('parent', 'description'), FieldSet('parent', 'description'),
) )
nullable_fields = ('parent', 'description') nullable_fields = ('parent', 'description', 'comments')
class WirelessLANBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): class WirelessLANBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm):

View File

@ -30,7 +30,7 @@ class WirelessLANGroupImportForm(NetBoxModelImportForm):
class Meta: class Meta:
model = WirelessLANGroup model = WirelessLANGroup
fields = ('name', 'slug', 'parent', 'description', 'tags') fields = ('name', 'slug', 'parent', 'description', 'tags', 'comments')
class WirelessLANImportForm(ScopedImportForm, NetBoxModelImportForm): class WirelessLANImportForm(ScopedImportForm, NetBoxModelImportForm):

View File

@ -24,6 +24,7 @@ class WirelessLANGroupForm(NetBoxModelForm):
required=False required=False
) )
slug = SlugField() slug = SlugField()
comments = CommentField()
fieldsets = ( fieldsets = (
FieldSet('parent', 'name', 'slug', 'description', 'tags', name=_('Wireless LAN Group')), FieldSet('parent', 'name', 'slug', 'description', 'tags', name=_('Wireless LAN Group')),
@ -32,7 +33,7 @@ class WirelessLANGroupForm(NetBoxModelForm):
class Meta: class Meta:
model = WirelessLANGroup model = WirelessLANGroup
fields = [ fields = [
'parent', 'name', 'slug', 'description', 'tags', 'parent', 'name', 'slug', 'description', 'tags', 'comments',
] ]

View File

@ -21,6 +21,7 @@ class WirelessLANGroupIndex(SearchIndex):
('name', 100), ('name', 100),
('slug', 110), ('slug', 110),
('description', 500), ('description', 500),
('comments', 5000),
) )
display_attrs = ('description',) display_attrs = ('description',)

View File

@ -24,10 +24,12 @@ class WirelessLANGroupTest(APIViewTestCases.APIViewTestCase):
{ {
'name': 'Wireless LAN Group 4', 'name': 'Wireless LAN Group 4',
'slug': 'wireless-lan-group-4', 'slug': 'wireless-lan-group-4',
'comments': '',
}, },
{ {
'name': 'Wireless LAN Group 5', 'name': 'Wireless LAN Group 5',
'slug': 'wireless-lan-group-5', 'slug': 'wireless-lan-group-5',
'comments': 'LAN Group 5 comment',
}, },
{ {
'name': 'Wireless LAN Group 6', 'name': 'Wireless LAN Group 6',
@ -36,6 +38,7 @@ class WirelessLANGroupTest(APIViewTestCases.APIViewTestCase):
] ]
bulk_update_data = { bulk_update_data = {
'description': 'New description', 'description': 'New description',
'comments': 'New comment',
} }
@classmethod @classmethod

View File

@ -21,7 +21,10 @@ class WirelessLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
parent_groups = ( parent_groups = (
WirelessLANGroup(name='Wireless LAN Group 1', slug='wireless-lan-group-1', description='A'), WirelessLANGroup(name='Wireless LAN Group 1', slug='wireless-lan-group-1', description='A'),
WirelessLANGroup(name='Wireless LAN Group 2', slug='wireless-lan-group-2', description='B'), WirelessLANGroup(name='Wireless LAN Group 2', slug='wireless-lan-group-2', description='B'),
WirelessLANGroup(name='Wireless LAN Group 3', slug='wireless-lan-group-3', description='C'), WirelessLANGroup(
name='Wireless LAN Group 3', slug='wireless-lan-group-3', description='C',
comments='Parent Group 3 comment',
),
) )
for group in parent_groups: for group in parent_groups:
group.save() group.save()
@ -38,10 +41,15 @@ class WirelessLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
slug='wireless-lan-group-1b', slug='wireless-lan-group-1b',
parent=parent_groups[0], parent=parent_groups[0],
description='foobar2', description='foobar2',
comments='Child Group 1B comment',
), ),
WirelessLANGroup(name='Wireless LAN Group 2A', slug='wireless-lan-group-2a', parent=parent_groups[1]), WirelessLANGroup(name='Wireless LAN Group 2A', slug='wireless-lan-group-2a', parent=parent_groups[1]),
WirelessLANGroup(name='Wireless LAN Group 2B', slug='wireless-lan-group-2b', parent=parent_groups[1]), WirelessLANGroup(name='Wireless LAN Group 2B', slug='wireless-lan-group-2b', parent=parent_groups[1]),
WirelessLANGroup(name='Wireless LAN Group 3A', slug='wireless-lan-group-3a', parent=parent_groups[2]), WirelessLANGroup(
name='Wireless LAN Group 3A', slug='wireless-lan-group-3a', parent=parent_groups[2],
comments='Wireless LAN Group 3A comment',
),
WirelessLANGroup(name='Wireless LAN Group 3B', slug='wireless-lan-group-3b', parent=parent_groups[2]), WirelessLANGroup(name='Wireless LAN Group 3B', slug='wireless-lan-group-3b', parent=parent_groups[2]),
) )
for group in groups: for group in groups:
@ -62,6 +70,13 @@ class WirelessLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests):
params = {'q': 'foobar1'} params = {'q': 'foobar1'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) 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(), 1)
params = {'q': 'comment'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
def test_name(self): def test_name(self):
params = {'name': ['Wireless LAN Group 1', 'Wireless LAN Group 2']} params = {'name': ['Wireless LAN Group 1', 'Wireless LAN Group 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)

View File

@ -16,7 +16,9 @@ class WirelessLANGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
groups = ( groups = (
WirelessLANGroup(name='Wireless LAN Group 1', slug='wireless-lan-group-1'), WirelessLANGroup(name='Wireless LAN Group 1', slug='wireless-lan-group-1'),
WirelessLANGroup(name='Wireless LAN Group 2', slug='wireless-lan-group-2'), WirelessLANGroup(
name='Wireless LAN Group 2', slug='wireless-lan-group-2', comments='LAN Group 2 comment',
),
WirelessLANGroup(name='Wireless LAN Group 3', slug='wireless-lan-group-3'), WirelessLANGroup(name='Wireless LAN Group 3', slug='wireless-lan-group-3'),
) )
for group in groups: for group in groups:
@ -30,24 +32,26 @@ class WirelessLANGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
'parent': groups[2].pk, 'parent': groups[2].pk,
'description': 'A new wireless LAN group', 'description': 'A new wireless LAN group',
'tags': [t.pk for t in tags], 'tags': [t.pk for t in tags],
'comments': 'LAN Group X comment',
} }
cls.csv_data = ( cls.csv_data = (
"name,slug,description", "name,slug,description,comments",
"Wireless LAN Group 4,wireless-lan-group-4,Fourth wireless LAN group", "Wireless LAN Group 4,wireless-lan-group-4,Fourth wireless LAN group,",
"Wireless LAN Group 5,wireless-lan-group-5,Fifth wireless LAN group", "Wireless LAN Group 5,wireless-lan-group-5,Fifth wireless LAN group,",
"Wireless LAN Group 6,wireless-lan-group-6,Sixth wireless LAN group", "Wireless LAN Group 6,wireless-lan-group-6,Sixth wireless LAN group,LAN Group 6 comment",
) )
cls.csv_update_data = ( cls.csv_update_data = (
"id,name,description", "id,name,description,comments",
f"{groups[0].pk},Wireless LAN Group 7,Fourth wireless LAN group7", f"{groups[0].pk},Wireless LAN Group 7,Fourth wireless LAN group7,Group 7 comment",
f"{groups[1].pk},Wireless LAN Group 8,Fifth wireless LAN group8", f"{groups[1].pk},Wireless LAN Group 8,Fifth wireless LAN group8,",
f"{groups[2].pk},Wireless LAN Group 0,Sixth wireless LAN group9", f"{groups[2].pk},Wireless LAN Group 0,Sixth wireless LAN group9,",
) )
cls.bulk_edit_data = { cls.bulk_edit_data = {
'description': 'New description', 'description': 'New description',
'comments': 'New Comments',
} }