From ce6b2666a99f11127827dd6c17f5da58ed979c23 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Mar 2024 16:08:01 -0500 Subject: [PATCH] Rename SavedFilter.content_types to object_types & use ObjectType proxy --- netbox/extras/api/serializers.py | 4 ++-- netbox/extras/filtersets.py | 8 ++++---- netbox/extras/forms/bulk_import.py | 6 +++--- netbox/extras/forms/filtersets.py | 6 +++--- netbox/extras/forms/model_forms.py | 6 +++--- netbox/extras/graphql/types.py | 2 +- .../extras/migrations/0111_rename_content_types.py | 12 ++++++++++++ netbox/extras/models/models.py | 4 ++-- netbox/extras/tables/tables.py | 8 ++++---- netbox/extras/tests/test_api.py | 10 +++++----- netbox/extras/tests/test_filtersets.py | 10 +++++----- netbox/extras/tests/test_forms.py | 2 +- netbox/extras/tests/test_views.py | 8 ++++---- netbox/templates/extras/savedfilter.html | 4 ++-- 14 files changed, 51 insertions(+), 39 deletions(-) diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 3871fcc70..d2e296ffa 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -243,7 +243,7 @@ class ExportTemplateSerializer(ValidatedModelSerializer): class SavedFilterSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') - content_types = ContentTypeField( + object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True ) @@ -251,7 +251,7 @@ class SavedFilterSerializer(ValidatedModelSerializer): class Meta: model = SavedFilter fields = [ - 'id', 'url', 'display', 'content_types', 'name', 'slug', 'description', 'user', 'weight', 'enabled', + 'id', 'url', 'display', 'object_types', 'name', 'slug', 'description', 'user', 'weight', 'enabled', 'shared', 'parameters', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description') diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 83978806a..fb5f972d1 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -248,10 +248,10 @@ class SavedFilterFilterSet(BaseFilterSet): method='search', label=_('Search'), ) - content_type_id = MultiValueNumberFilter( - field_name='content_types__id' + object_types_id = MultiValueNumberFilter( + field_name='object_types__id' ) - content_types = ContentTypeFilter() + object_types = ContentTypeFilter() user_id = django_filters.ModelMultipleChoiceFilter( queryset=get_user_model().objects.all(), label=_('User (ID)'), @@ -268,7 +268,7 @@ class SavedFilterFilterSet(BaseFilterSet): class Meta: model = SavedFilter - fields = ['id', 'content_types', 'name', 'slug', 'description', 'enabled', 'shared', 'weight'] + fields = ['id', 'object_types', 'name', 'slug', 'description', 'enabled', 'shared', 'weight'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 9c68c7ba3..39d2933a7 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -149,8 +149,8 @@ class ConfigTemplateImportForm(CSVModelForm): class SavedFilterImportForm(CSVModelForm): - content_types = CSVMultipleContentTypeField( - label=_('Content types'), + object_types = CSVMultipleContentTypeField( + label=_('Object types'), queryset=ObjectType.objects.all(), help_text=_("One or more assigned object types") ) @@ -158,7 +158,7 @@ class SavedFilterImportForm(CSVModelForm): class Meta: model = SavedFilter fields = ( - 'name', 'slug', 'content_types', 'description', 'weight', 'enabled', 'shared', 'parameters', + 'name', 'slug', 'object_types', 'description', 'weight', 'enabled', 'shared', 'parameters', ) diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index daad010c1..42ba5618c 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -195,10 +195,10 @@ class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm): class SavedFilterFilterForm(SavedFiltersMixin, FilterForm): fieldsets = ( (None, ('q', 'filter_id')), - (_('Attributes'), ('content_types', 'enabled', 'shared', 'weight')), + (_('Attributes'), ('object_types', 'enabled', 'shared', 'weight')), ) - content_types = ContentTypeMultipleChoiceField( - label=_('Content types'), + object_types = ContentTypeMultipleChoiceField( + label=_('Object types'), queryset=ObjectType.objects.public(), required=False ) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 95af8fb3b..7f36db657 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -192,14 +192,14 @@ class ExportTemplateForm(SyncedDataMixin, forms.ModelForm): class SavedFilterForm(forms.ModelForm): slug = SlugField() - content_types = ContentTypeMultipleChoiceField( - label=_('Content types'), + object_types = ContentTypeMultipleChoiceField( + label=_('Object types'), queryset=ObjectType.objects.all() ) parameters = JSONField() fieldsets = ( - (_('Saved Filter'), ('name', 'slug', 'content_types', 'description', 'weight', 'enabled', 'shared')), + (_('Saved Filter'), ('name', 'slug', 'object_types', 'description', 'weight', 'enabled', 'shared')), (_('Parameters'), ('parameters',)), ) diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py index 1000925bb..9e0444da6 100644 --- a/netbox/extras/graphql/types.py +++ b/netbox/extras/graphql/types.py @@ -103,7 +103,7 @@ class SavedFilterType(ObjectType): class Meta: model = models.SavedFilter - exclude = ('content_types', ) + exclude = ('object_types', ) filterset_class = filtersets.SavedFilterFilterSet diff --git a/netbox/extras/migrations/0111_rename_content_types.py b/netbox/extras/migrations/0111_rename_content_types.py index 87f721589..df347dffd 100644 --- a/netbox/extras/migrations/0111_rename_content_types.py +++ b/netbox/extras/migrations/0111_rename_content_types.py @@ -62,4 +62,16 @@ class Migration(migrations.Migration): name='object_types', field=models.ManyToManyField(related_name='export_templates', to='core.objecttype'), ), + + # Saved filters + migrations.RenameField( + model_name='savedfilter', + old_name='content_types', + new_name='object_types', + ), + migrations.AlterField( + model_name='savedfilter', + name='object_types', + field=models.ManyToManyField(related_name='saved_filters', to='core.objecttype'), + ), ] diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 77e703dc0..c5e35c9c7 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -518,8 +518,8 @@ class SavedFilter(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): """ A set of predefined keyword parameters that can be reused to filter for specific objects. """ - content_types = models.ManyToManyField( - to='contenttypes.ContentType', + object_types = models.ManyToManyField( + to='core.ObjectType', related_name='saved_filters', help_text=_('The object type(s) to which this filter applies.') ) diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index abc73c5ba..479cb568e 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -204,8 +204,8 @@ class SavedFilterTable(NetBoxTable): verbose_name=_('Name'), linkify=True ) - content_types = columns.ContentTypesColumn( - verbose_name=_('Content Types'), + object_types = columns.ContentTypesColumn( + verbose_name=_('Object Types'), ) enabled = columns.BooleanColumn( verbose_name=_('Enabled'), @@ -220,11 +220,11 @@ class SavedFilterTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = SavedFilter fields = ( - 'pk', 'id', 'name', 'slug', 'content_types', 'description', 'user', 'weight', 'enabled', 'shared', + 'pk', 'id', 'name', 'slug', 'object_types', 'description', 'user', 'weight', 'enabled', 'shared', 'created', 'last_updated', 'parameters' ) default_columns = ( - 'pk', 'name', 'content_types', 'user', 'description', 'enabled', 'shared', + 'pk', 'name', 'object_types', 'user', 'description', 'enabled', 'shared', ) diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index 34a1bdc40..eaa031837 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -333,7 +333,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase): brief_fields = ['description', 'display', 'id', 'name', 'slug', 'url'] create_data = [ { - 'content_types': ['dcim.site'], + 'object_types': ['dcim.site'], 'name': 'Saved Filter 4', 'slug': 'saved-filter-4', 'weight': 100, @@ -342,7 +342,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase): 'parameters': {'status': ['active']}, }, { - 'content_types': ['dcim.site'], + 'object_types': ['dcim.site'], 'name': 'Saved Filter 5', 'slug': 'saved-filter-5', 'weight': 200, @@ -351,7 +351,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase): 'parameters': {'status': ['planned']}, }, { - 'content_types': ['dcim.site'], + 'object_types': ['dcim.site'], 'name': 'Saved Filter 6', 'slug': 'saved-filter-6', 'weight': 300, @@ -368,7 +368,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase): @classmethod def setUpTestData(cls): - site_ct = ContentType.objects.get_for_model(Site) + site_type = ObjectType.objects.get_for_model(Site) saved_filters = ( SavedFilter( @@ -398,7 +398,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase): ) SavedFilter.objects.bulk_create(saved_filters) for i, savedfilter in enumerate(saved_filters): - savedfilter.content_types.set([site_ct]) + savedfilter.object_types.set([site_type]) class BookmarkTest( diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index af079786b..a45da8e20 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -466,7 +466,7 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests): @classmethod def setUpTestData(cls): - content_types = ContentType.objects.filter(model__in=['site', 'rack', 'device']) + object_types = ObjectType.objects.filter(model__in=['site', 'rack', 'device']) users = ( User(username='User 1'), @@ -509,7 +509,7 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests): ) SavedFilter.objects.bulk_create(saved_filters) for i, savedfilter in enumerate(saved_filters): - savedfilter.content_types.set([content_types[i]]) + savedfilter.object_types.set([object_types[i]]) def test_q(self): params = {'q': 'foobar1'} @@ -527,10 +527,10 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests): params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_content_types(self): - params = {'content_types': 'dcim.site'} + def test_object_types(self): + params = {'object_types': 'dcim.site'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - params = {'content_type_id': [ContentType.objects.get_for_model(Site).pk]} + params = {'object_types_id': [ContentType.objects.get_for_model(Site).pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_user(self): diff --git a/netbox/extras/tests/test_forms.py b/netbox/extras/tests/test_forms.py index 5adb57fb2..7642ee2a8 100644 --- a/netbox/extras/tests/test_forms.py +++ b/netbox/extras/tests/test_forms.py @@ -100,7 +100,7 @@ class SavedFilterFormTest(TestCase): form = SavedFilterForm({ 'name': 'test-sf', 'slug': 'test-sf', - 'content_types': [ContentType.objects.get_for_model(Site).pk], + 'object_types': [ContentType.objects.get_for_model(Site).pk], 'weight': 100, 'parameters': { "status": [ diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index 02114d035..ca6ad9174 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -184,7 +184,7 @@ class SavedFilterTestCase(ViewTestCases.PrimaryObjectViewTestCase): @classmethod def setUpTestData(cls): - site_ct = ContentType.objects.get_for_model(Site) + site_type = ObjectType.objects.get_for_model(Site) users = ( User(username='User 1'), @@ -218,12 +218,12 @@ class SavedFilterTestCase(ViewTestCases.PrimaryObjectViewTestCase): ) SavedFilter.objects.bulk_create(saved_filters) for i, savedfilter in enumerate(saved_filters): - savedfilter.content_types.set([site_ct]) + savedfilter.object_types.set([site_type]) cls.form_data = { 'name': 'Saved Filter X', 'slug': 'saved-filter-x', - 'content_types': [site_ct.pk], + 'object_types': [site_type.pk], 'description': 'Foo', 'weight': 1000, 'enabled': True, @@ -232,7 +232,7 @@ class SavedFilterTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - 'name,slug,content_types,weight,enabled,shared,parameters', + 'name,slug,object_types,weight,enabled,shared,parameters', 'Saved Filter 4,saved-filter-4,dcim.device,400,True,True,{"foo": "a"}', 'Saved Filter 5,saved-filter-5,dcim.device,500,True,True,{"foo": "b"}', 'Saved Filter 6,saved-filter-6,dcim.device,600,True,True,{"foo": "c"}', diff --git a/netbox/templates/extras/savedfilter.html b/netbox/templates/extras/savedfilter.html index 840852c7f..9b10f1375 100644 --- a/netbox/templates/extras/savedfilter.html +++ b/netbox/templates/extras/savedfilter.html @@ -38,9 +38,9 @@
{% trans "Assigned Models" %}
- {% for ct in object.content_types.all %} + {% for object_type in object.object_types.all %} - + {% endfor %}
{{ ct }}{{ object_type }}