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:
@ -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')
|
||||||
|
@ -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():
|
||||||
|
@ -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',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
)
|
)
|
||||||
|
@ -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',)),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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'),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
@ -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.')
|
||||||
)
|
)
|
||||||
|
@ -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',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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(
|
||||||
|
@ -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):
|
||||||
|
@ -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": [
|
||||||
|
@ -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"}',
|
||||||
|
@ -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>
|
||||||
|
Reference in New Issue
Block a user