Adds Region.comments field in the required locations

- [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
- [ ] 6. Add fields to forms
    - [x] dcim.forms.model_forms.RegionForm, create/edit (e.g. model_forms.py)
    - [x] dcim.forms.buld_edit.RegionBulkEditForm, bulk edit
    - [x] dcim.dorms.bulk_import.RegionImportForm, CSV import
    - [NA] filter (UI and API)
- [x] 7. Extend object filter set
- [x] 8. Add column to object table
- [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-10 17:07:59 -05:00
parent 2e2c815c91
commit 9a9d6cdedb
11 changed files with 48 additions and 16 deletions

View File

@ -27,7 +27,7 @@ class RegionSerializer(NestedGroupModelSerializer):
model = Region model = Region
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', 'site_count', 'prefix_count', '_depth', 'created', 'last_updated', 'site_count', 'prefix_count', 'comments', '_depth',
] ]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'site_count', '_depth') brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'site_count', '_depth')

View File

@ -110,6 +110,15 @@ class RegionFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet):
model = Region model = Region
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(description__icontains=value) |
Q(comments__icontains=value)
).distinct()
class SiteGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet): class SiteGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet):
parent_id = django_filters.ModelMultipleChoiceFilter( parent_id = django_filters.ModelMultipleChoiceFilter(

View File

@ -78,12 +78,13 @@ class RegionBulkEditForm(NetBoxModelBulkEditForm):
max_length=200, max_length=200,
required=False required=False
) )
comments = CommentField()
model = Region model = Region
fieldsets = ( fieldsets = (
FieldSet('parent', 'description'), FieldSet('parent', 'description'),
) )
nullable_fields = ('parent', 'description') nullable_fields = ('parent', 'description', 'comments')
class SiteGroupBulkEditForm(NetBoxModelBulkEditForm): class SiteGroupBulkEditForm(NetBoxModelBulkEditForm):

View File

@ -68,7 +68,7 @@ class RegionImportForm(NetBoxModelImportForm):
class Meta: class Meta:
model = Region model = Region
fields = ('name', 'slug', 'parent', 'description', 'tags') fields = ('name', 'slug', 'parent', 'description', 'tags', 'comments')
class SiteGroupImportForm(NetBoxModelImportForm): class SiteGroupImportForm(NetBoxModelImportForm):

View File

@ -78,6 +78,7 @@ class RegionForm(NetBoxModelForm):
required=False required=False
) )
slug = SlugField() slug = SlugField()
comments = CommentField()
fieldsets = ( fieldsets = (
FieldSet('parent', 'name', 'slug', 'description', 'tags'), FieldSet('parent', 'name', 'slug', 'description', 'tags'),
@ -86,7 +87,7 @@ class RegionForm(NetBoxModelForm):
class Meta: class Meta:
model = Region model = Region
fields = ( fields = (
'parent', 'name', 'slug', 'description', 'tags', 'parent', 'name', 'slug', 'description', 'tags', 'comments',
) )

View File

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

View File

@ -36,8 +36,8 @@ class RegionTable(ContactsColumnMixin, NetBoxTable):
class Meta(NetBoxTable.Meta): class Meta(NetBoxTable.Meta):
model = Region model = Region
fields = ( fields = (
'pk', 'id', 'name', 'slug', 'site_count', 'description', 'contacts', 'tags', 'created', 'last_updated', 'pk', 'id', 'name', 'slug', 'site_count', 'description', 'comments', 'contacts', 'tags',
'actions', 'created', 'last_updated', 'actions',
) )
default_columns = ('pk', 'name', 'site_count', 'description') default_columns = ('pk', 'name', 'site_count', 'description')

View File

@ -74,6 +74,7 @@ class RegionTest(APIViewTestCases.APIViewTestCase):
{ {
'name': 'Region 4', 'name': 'Region 4',
'slug': 'region-4', 'slug': 'region-4',
'comments': 'this is region 4, not region 5',
}, },
{ {
'name': 'Region 5', 'name': 'Region 5',
@ -86,13 +87,14 @@ class RegionTest(APIViewTestCases.APIViewTestCase):
] ]
bulk_update_data = { bulk_update_data = {
'description': 'New description', 'description': 'New description',
'comments': 'New comments',
} }
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
Region.objects.create(name='Region 1', slug='region-1') Region.objects.create(name='Region 1', slug='region-1')
Region.objects.create(name='Region 2', slug='region-2') Region.objects.create(name='Region 2', slug='region-2', comments='what in the world is happening?')
Region.objects.create(name='Region 3', slug='region-3') Region.objects.create(name='Region 3', slug='region-3')

View File

@ -67,9 +67,15 @@ class RegionTestCase(TestCase, ChangeLoggedFilterSetTests):
def setUpTestData(cls): def setUpTestData(cls):
parent_regions = ( parent_regions = (
Region(name='Region 1', slug='region-1', description='foobar1'), Region(
Region(name='Region 2', slug='region-2', description='foobar2'), name='Region 1', slug='region-1', description='foobar1', comments="There's nothing that",
Region(name='Region 3', slug='region-3', description='foobar3'), ),
Region(
name='Region 2', slug='region-2', description='foobar2', comments='a hundred men or more',
),
Region(
name='Region 3', slug='region-3', description='foobar3', comments='could ever do'
),
) )
for region in parent_regions: for region in parent_regions:
region.save() region.save()
@ -100,6 +106,13 @@ class RegionTestCase(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': 'there'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
params = {'q': 'hundred men could'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
def test_name(self): def test_name(self):
params = {'name': ['Region 1', 'Region 2']} params = {'name': ['Region 1', 'Region 2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)

View File

@ -25,8 +25,10 @@ class RegionTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
# Create three Regions # Create three Regions
regions = ( regions = (
Region(name='Region 1', slug='region-1'), Region(name='Region 1', slug='region-1', comments=''),
Region(name='Region 2', slug='region-2'), Region(
name='Region 2', slug='region-2', comments="It's going to take a lot to drag me away from you"
),
Region(name='Region 3', slug='region-3'), Region(name='Region 3', slug='region-3'),
) )
for region in regions: for region in regions:
@ -40,13 +42,14 @@ class RegionTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
'parent': regions[2].pk, 'parent': regions[2].pk,
'description': 'A new region', 'description': 'A new region',
'tags': [t.pk for t in tags], 'tags': [t.pk for t in tags],
'comments': 'This comment is really exciting!',
} }
cls.csv_data = ( cls.csv_data = (
"name,slug,description", "name,slug,description,comments",
"Region 4,region-4,Fourth region", "Region 4,region-4,Fourth region,",
"Region 5,region-5,Fifth region", "Region 5,region-5,Fifth region,hi guys",
"Region 6,region-6,Sixth region", "Region 6,region-6,Sixth region,bye guys",
) )
cls.csv_update_data = ( cls.csv_update_data = (
@ -58,6 +61,7 @@ class RegionTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
cls.bulk_edit_data = { cls.bulk_edit_data = {
'description': 'New description', 'description': 'New description',
'comments': 'This comment is super exciting!!!',
} }

View File

@ -41,6 +41,7 @@
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.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">