diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 450514e66..6cb309580 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -89,10 +89,12 @@ class EventRuleFilterSet(NetBoxModelFilterSet): method='search', label=_('Search'), ) - object_types_id = MultiValueNumberFilter( + object_type_id = MultiValueNumberFilter( field_name='object_types__id' ) - object_types = ContentTypeFilter() + object_type = ContentTypeFilter( + field_name='object_types' + ) action_type = django_filters.MultipleChoiceFilter( choices=EventRuleActionChoices ) @@ -124,10 +126,10 @@ class CustomFieldFilterSet(BaseFilterSet): type = django_filters.MultipleChoiceFilter( choices=CustomFieldTypeChoices ) - object_types_id = MultiValueNumberFilter( + object_type_id = MultiValueNumberFilter( field_name='object_types__id' ) - object_types = ContentTypeFilter( + object_type = ContentTypeFilter( field_name='object_types' ) choice_set_id = django_filters.ModelMultipleChoiceFilter( @@ -142,8 +144,8 @@ class CustomFieldFilterSet(BaseFilterSet): class Meta: model = CustomField fields = [ - 'id', 'object_types', 'name', 'group_name', 'required', 'search_weight', 'filter_logic', 'ui_visible', - 'ui_editable', 'weight', 'is_cloneable', 'description', + 'id', 'name', 'group_name', 'required', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', + 'weight', 'is_cloneable', 'description', ] def search(self, queryset, name, value): @@ -190,15 +192,17 @@ class CustomLinkFilterSet(BaseFilterSet): method='search', label=_('Search'), ) - object_types_id = MultiValueNumberFilter( + object_type_id = MultiValueNumberFilter( field_name='object_types__id' ) - object_types = ContentTypeFilter() + object_type = ContentTypeFilter( + field_name='object_types' + ) class Meta: model = CustomLink fields = [ - 'id', 'object_types', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', 'new_window', + 'id', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', 'new_window', ] def search(self, queryset, name, value): @@ -217,10 +221,12 @@ class ExportTemplateFilterSet(BaseFilterSet): method='search', label=_('Search'), ) - object_types_id = MultiValueNumberFilter( + object_type_id = MultiValueNumberFilter( field_name='object_types__id' ) - object_types = ContentTypeFilter() + object_type = ContentTypeFilter( + field_name='object_types' + ) data_source_id = django_filters.ModelMultipleChoiceFilter( queryset=DataSource.objects.all(), label=_('Data source (ID)'), @@ -232,7 +238,7 @@ class ExportTemplateFilterSet(BaseFilterSet): class Meta: model = ExportTemplate - fields = ['id', 'object_types', 'name', 'description', 'data_synced'] + fields = ['id', 'name', 'description', 'data_synced'] def search(self, queryset, name, value): if not value.strip(): @@ -248,10 +254,12 @@ class SavedFilterFilterSet(BaseFilterSet): method='search', label=_('Search'), ) - object_types_id = MultiValueNumberFilter( + object_type_id = MultiValueNumberFilter( field_name='object_types__id' ) - object_types = ContentTypeFilter() + object_type = ContentTypeFilter( + field_name='object_types' + ) user_id = django_filters.ModelMultipleChoiceFilter( queryset=get_user_model().objects.all(), label=_('User (ID)'), @@ -268,7 +276,7 @@ class SavedFilterFilterSet(BaseFilterSet): class Meta: model = SavedFilter - fields = ['id', 'object_types', 'name', 'slug', 'description', 'enabled', 'shared', 'weight'] + fields = ['id', 'name', 'slug', 'description', 'enabled', 'shared', 'weight'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 75724b108..285e7618f 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -38,11 +38,11 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): fieldsets = ( (None, ('q', 'filter_id')), (_('Attributes'), ( - 'type', 'object_types_id', 'group_name', 'weight', 'required', 'choice_set_id', 'ui_visible', 'ui_editable', + 'type', 'object_type_id', 'group_name', 'weight', 'required', 'choice_set_id', 'ui_visible', 'ui_editable', 'is_cloneable', )), ) - object_types_id = ContentTypeMultipleChoiceField( + object_type_id = ContentTypeMultipleChoiceField( queryset=ObjectType.objects.with_feature('custom_fields'), required=False, label=_('Object type') @@ -108,9 +108,9 @@ class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, FilterForm): class CustomLinkFilterForm(SavedFiltersMixin, FilterForm): fieldsets = ( (None, ('q', 'filter_id')), - (_('Attributes'), ('object_types', 'enabled', 'new_window', 'weight')), + (_('Attributes'), ('object_type', 'enabled', 'new_window', 'weight')), ) - object_types = ContentTypeMultipleChoiceField( + object_type = ContentTypeMultipleChoiceField( label=_('Object types'), queryset=ObjectType.objects.with_feature('custom_links'), required=False @@ -139,7 +139,7 @@ class ExportTemplateFilterForm(SavedFiltersMixin, FilterForm): fieldsets = ( (None, ('q', 'filter_id')), (_('Data'), ('data_source_id', 'data_file_id')), - (_('Attributes'), ('object_types_id', 'mime_type', 'file_extension', 'as_attachment')), + (_('Attributes'), ('object_type_id', 'mime_type', 'file_extension', 'as_attachment')), ) data_source_id = DynamicModelMultipleChoiceField( queryset=DataSource.objects.all(), @@ -154,7 +154,7 @@ class ExportTemplateFilterForm(SavedFiltersMixin, FilterForm): 'source_id': '$data_source_id' } ) - object_types_id = ContentTypeMultipleChoiceField( + object_type_id = ContentTypeMultipleChoiceField( queryset=ObjectType.objects.with_feature('export_templates'), required=False, label=_('Content types') @@ -195,9 +195,9 @@ class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm): class SavedFilterFilterForm(SavedFiltersMixin, FilterForm): fieldsets = ( (None, ('q', 'filter_id')), - (_('Attributes'), ('object_types', 'enabled', 'shared', 'weight')), + (_('Attributes'), ('object_type', 'enabled', 'shared', 'weight')), ) - object_types = ContentTypeMultipleChoiceField( + object_type = ContentTypeMultipleChoiceField( label=_('Object types'), queryset=ObjectType.objects.public(), required=False @@ -250,10 +250,10 @@ class EventRuleFilterForm(NetBoxModelFilterSetForm): fieldsets = ( (None, ('q', 'filter_id', 'tag')), - (_('Attributes'), ('object_types_id', 'action_type', 'enabled')), + (_('Attributes'), ('object_type_id', 'action_type', 'enabled')), (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')), ) - object_types_id = ContentTypeMultipleChoiceField( + object_type_id = ContentTypeMultipleChoiceField( queryset=ObjectType.objects.with_feature('event_rules'), required=False, label=_('Object type') diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index cec0ffe94..4f9279831 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -102,10 +102,10 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): params = {'name': ['Custom Field 1', 'Custom Field 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_object_types(self): - params = {'object_types': 'dcim.site'} + def test_object_type(self): + params = {'object_type': 'dcim.site'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - params = {'object_types_id': [ObjectType.objects.get_by_natural_key('dcim', 'site').pk]} + params = {'object_type_id': [ObjectType.objects.get_by_natural_key('dcim', 'site').pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_required(self): @@ -350,10 +350,10 @@ class EventRuleTestCase(TestCase, BaseFilterSetTests): params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_object_types(self): - params = {'object_types': 'dcim.region'} + def test_object_type(self): + params = {'object_type': 'dcim.region'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - params = {'object_types_id': [ObjectType.objects.get_for_model(Region).pk]} + params = {'object_type_id': [ObjectType.objects.get_for_model(Region).pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_action_type(self): @@ -435,10 +435,10 @@ class CustomLinkTestCase(TestCase, BaseFilterSetTests): params = {'name': ['Custom Link 1', 'Custom Link 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_object_types(self): - params = {'object_types': 'dcim.site'} + def test_object_type(self): + params = {'object_type': 'dcim.site'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - params = {'object_types_id': [ObjectType.objects.get_for_model(Site).pk]} + params = {'object_type_id': [ObjectType.objects.get_for_model(Site).pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_weight(self): @@ -525,10 +525,10 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests): params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_object_types(self): - params = {'object_types': 'dcim.site'} + def test_object_type(self): + params = {'object_type': 'dcim.site'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - params = {'object_types_id': [ObjectType.objects.get_for_model(Site).pk]} + params = {'object_type_id': [ObjectType.objects.get_for_model(Site).pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_user(self): @@ -656,10 +656,10 @@ class ExportTemplateTestCase(TestCase, BaseFilterSetTests): params = {'name': ['Export Template 1', 'Export Template 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_object_types(self): - params = {'object_types': 'dcim.site'} + def test_object_type(self): + params = {'object_type': 'dcim.site'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - params = {'object_types_id': [ObjectType.objects.get_for_model(Site).pk]} + params = {'object_type_id': [ObjectType.objects.get_for_model(Site).pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_description(self):