1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Rename SavedFilter.content_types to object_types & use ObjectType proxy

This commit is contained in:
Jeremy Stretch
2024-03-01 16:08:01 -05:00
parent bef17e5a95
commit ce6b2666a9
14 changed files with 51 additions and 39 deletions

View File

@ -243,7 +243,7 @@ class ExportTemplateSerializer(ValidatedModelSerializer):
class SavedFilterSerializer(ValidatedModelSerializer): class SavedFilterSerializer(ValidatedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail')
content_types = ContentTypeField( object_types = ContentTypeField(
queryset=ObjectType.objects.all(), queryset=ObjectType.objects.all(),
many=True many=True
) )
@ -251,7 +251,7 @@ class SavedFilterSerializer(ValidatedModelSerializer):
class Meta: class Meta:
model = SavedFilter model = SavedFilter
fields = [ 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', 'shared', 'parameters', 'created', 'last_updated',
] ]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description') brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description')

View File

@ -248,10 +248,10 @@ class SavedFilterFilterSet(BaseFilterSet):
method='search', method='search',
label=_('Search'), label=_('Search'),
) )
content_type_id = MultiValueNumberFilter( object_types_id = MultiValueNumberFilter(
field_name='content_types__id' field_name='object_types__id'
) )
content_types = ContentTypeFilter() object_types = ContentTypeFilter()
user_id = django_filters.ModelMultipleChoiceFilter( user_id = django_filters.ModelMultipleChoiceFilter(
queryset=get_user_model().objects.all(), queryset=get_user_model().objects.all(),
label=_('User (ID)'), label=_('User (ID)'),
@ -268,7 +268,7 @@ class SavedFilterFilterSet(BaseFilterSet):
class Meta: class Meta:
model = SavedFilter 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): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -149,8 +149,8 @@ class ConfigTemplateImportForm(CSVModelForm):
class SavedFilterImportForm(CSVModelForm): class SavedFilterImportForm(CSVModelForm):
content_types = CSVMultipleContentTypeField( object_types = CSVMultipleContentTypeField(
label=_('Content types'), label=_('Object types'),
queryset=ObjectType.objects.all(), queryset=ObjectType.objects.all(),
help_text=_("One or more assigned object types") help_text=_("One or more assigned object types")
) )
@ -158,7 +158,7 @@ class SavedFilterImportForm(CSVModelForm):
class Meta: class Meta:
model = SavedFilter model = SavedFilter
fields = ( fields = (
'name', 'slug', 'content_types', 'description', 'weight', 'enabled', 'shared', 'parameters', 'name', 'slug', 'object_types', 'description', 'weight', 'enabled', 'shared', 'parameters',
) )

View File

@ -195,10 +195,10 @@ class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm):
class SavedFilterFilterForm(SavedFiltersMixin, FilterForm): class SavedFilterFilterForm(SavedFiltersMixin, FilterForm):
fieldsets = ( fieldsets = (
(None, ('q', 'filter_id')), (None, ('q', 'filter_id')),
(_('Attributes'), ('content_types', 'enabled', 'shared', 'weight')), (_('Attributes'), ('object_types', 'enabled', 'shared', 'weight')),
) )
content_types = ContentTypeMultipleChoiceField( object_types = ContentTypeMultipleChoiceField(
label=_('Content types'), label=_('Object types'),
queryset=ObjectType.objects.public(), queryset=ObjectType.objects.public(),
required=False required=False
) )

View File

@ -192,14 +192,14 @@ class ExportTemplateForm(SyncedDataMixin, forms.ModelForm):
class SavedFilterForm(forms.ModelForm): class SavedFilterForm(forms.ModelForm):
slug = SlugField() slug = SlugField()
content_types = ContentTypeMultipleChoiceField( object_types = ContentTypeMultipleChoiceField(
label=_('Content types'), label=_('Object types'),
queryset=ObjectType.objects.all() queryset=ObjectType.objects.all()
) )
parameters = JSONField() parameters = JSONField()
fieldsets = ( fieldsets = (
(_('Saved Filter'), ('name', 'slug', 'content_types', 'description', 'weight', 'enabled', 'shared')), (_('Saved Filter'), ('name', 'slug', 'object_types', 'description', 'weight', 'enabled', 'shared')),
(_('Parameters'), ('parameters',)), (_('Parameters'), ('parameters',)),
) )

View File

@ -103,7 +103,7 @@ class SavedFilterType(ObjectType):
class Meta: class Meta:
model = models.SavedFilter model = models.SavedFilter
exclude = ('content_types', ) exclude = ('object_types', )
filterset_class = filtersets.SavedFilterFilterSet filterset_class = filtersets.SavedFilterFilterSet

View File

@ -62,4 +62,16 @@ class Migration(migrations.Migration):
name='object_types', name='object_types',
field=models.ManyToManyField(related_name='export_templates', to='core.objecttype'), 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'),
),
] ]

View File

@ -518,8 +518,8 @@ class SavedFilter(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel):
""" """
A set of predefined keyword parameters that can be reused to filter for specific objects. A set of predefined keyword parameters that can be reused to filter for specific objects.
""" """
content_types = models.ManyToManyField( object_types = models.ManyToManyField(
to='contenttypes.ContentType', to='core.ObjectType',
related_name='saved_filters', related_name='saved_filters',
help_text=_('The object type(s) to which this filter applies.') help_text=_('The object type(s) to which this filter applies.')
) )

View File

@ -204,8 +204,8 @@ class SavedFilterTable(NetBoxTable):
verbose_name=_('Name'), verbose_name=_('Name'),
linkify=True linkify=True
) )
content_types = columns.ContentTypesColumn( object_types = columns.ContentTypesColumn(
verbose_name=_('Content Types'), verbose_name=_('Object Types'),
) )
enabled = columns.BooleanColumn( enabled = columns.BooleanColumn(
verbose_name=_('Enabled'), verbose_name=_('Enabled'),
@ -220,11 +220,11 @@ class SavedFilterTable(NetBoxTable):
class Meta(NetBoxTable.Meta): class Meta(NetBoxTable.Meta):
model = SavedFilter model = SavedFilter
fields = ( 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' 'created', 'last_updated', 'parameters'
) )
default_columns = ( default_columns = (
'pk', 'name', 'content_types', 'user', 'description', 'enabled', 'shared', 'pk', 'name', 'object_types', 'user', 'description', 'enabled', 'shared',
) )

View File

@ -333,7 +333,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase):
brief_fields = ['description', 'display', 'id', 'name', 'slug', 'url'] brief_fields = ['description', 'display', 'id', 'name', 'slug', 'url']
create_data = [ create_data = [
{ {
'content_types': ['dcim.site'], 'object_types': ['dcim.site'],
'name': 'Saved Filter 4', 'name': 'Saved Filter 4',
'slug': 'saved-filter-4', 'slug': 'saved-filter-4',
'weight': 100, 'weight': 100,
@ -342,7 +342,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase):
'parameters': {'status': ['active']}, 'parameters': {'status': ['active']},
}, },
{ {
'content_types': ['dcim.site'], 'object_types': ['dcim.site'],
'name': 'Saved Filter 5', 'name': 'Saved Filter 5',
'slug': 'saved-filter-5', 'slug': 'saved-filter-5',
'weight': 200, 'weight': 200,
@ -351,7 +351,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase):
'parameters': {'status': ['planned']}, 'parameters': {'status': ['planned']},
}, },
{ {
'content_types': ['dcim.site'], 'object_types': ['dcim.site'],
'name': 'Saved Filter 6', 'name': 'Saved Filter 6',
'slug': 'saved-filter-6', 'slug': 'saved-filter-6',
'weight': 300, 'weight': 300,
@ -368,7 +368,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
site_ct = ContentType.objects.get_for_model(Site) site_type = ObjectType.objects.get_for_model(Site)
saved_filters = ( saved_filters = (
SavedFilter( SavedFilter(
@ -398,7 +398,7 @@ class SavedFilterTest(APIViewTestCases.APIViewTestCase):
) )
SavedFilter.objects.bulk_create(saved_filters) SavedFilter.objects.bulk_create(saved_filters)
for i, savedfilter in enumerate(saved_filters): for i, savedfilter in enumerate(saved_filters):
savedfilter.content_types.set([site_ct]) savedfilter.object_types.set([site_type])
class BookmarkTest( class BookmarkTest(

View File

@ -466,7 +466,7 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
content_types = ContentType.objects.filter(model__in=['site', 'rack', 'device']) object_types = ObjectType.objects.filter(model__in=['site', 'rack', 'device'])
users = ( users = (
User(username='User 1'), User(username='User 1'),
@ -509,7 +509,7 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
) )
SavedFilter.objects.bulk_create(saved_filters) SavedFilter.objects.bulk_create(saved_filters)
for i, savedfilter in enumerate(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): def test_q(self):
params = {'q': 'foobar1'} params = {'q': 'foobar1'}
@ -527,10 +527,10 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
params = {'description': ['foobar1', 'foobar2']} params = {'description': ['foobar1', 'foobar2']}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_content_types(self): def test_object_types(self):
params = {'content_types': 'dcim.site'} params = {'object_types': 'dcim.site'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) 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) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
def test_user(self): def test_user(self):

View File

@ -100,7 +100,7 @@ class SavedFilterFormTest(TestCase):
form = SavedFilterForm({ form = SavedFilterForm({
'name': 'test-sf', 'name': 'test-sf',
'slug': '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, 'weight': 100,
'parameters': { 'parameters': {
"status": [ "status": [

View File

@ -184,7 +184,7 @@ class SavedFilterTestCase(ViewTestCases.PrimaryObjectViewTestCase):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
site_ct = ContentType.objects.get_for_model(Site) site_type = ObjectType.objects.get_for_model(Site)
users = ( users = (
User(username='User 1'), User(username='User 1'),
@ -218,12 +218,12 @@ class SavedFilterTestCase(ViewTestCases.PrimaryObjectViewTestCase):
) )
SavedFilter.objects.bulk_create(saved_filters) SavedFilter.objects.bulk_create(saved_filters)
for i, savedfilter in enumerate(saved_filters): for i, savedfilter in enumerate(saved_filters):
savedfilter.content_types.set([site_ct]) savedfilter.object_types.set([site_type])
cls.form_data = { cls.form_data = {
'name': 'Saved Filter X', 'name': 'Saved Filter X',
'slug': 'saved-filter-x', 'slug': 'saved-filter-x',
'content_types': [site_ct.pk], 'object_types': [site_type.pk],
'description': 'Foo', 'description': 'Foo',
'weight': 1000, 'weight': 1000,
'enabled': True, 'enabled': True,
@ -232,7 +232,7 @@ class SavedFilterTestCase(ViewTestCases.PrimaryObjectViewTestCase):
} }
cls.csv_data = ( 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 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 5,saved-filter-5,dcim.device,500,True,True,{"foo": "b"}',
'Saved Filter 6,saved-filter-6,dcim.device,600,True,True,{"foo": "c"}', 'Saved Filter 6,saved-filter-6,dcim.device,600,True,True,{"foo": "c"}',

View File

@ -38,9 +38,9 @@
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Assigned Models" %}</h5> <h5 class="card-header">{% trans "Assigned Models" %}</h5>
<table class="table table-hover attr-table"> <table class="table table-hover attr-table">
{% for ct in object.content_types.all %} {% for object_type in object.object_types.all %}
<tr> <tr>
<td>{{ ct }}</td> <td>{{ object_type }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>