diff --git a/netbox/extras/constants.py b/netbox/extras/constants.py index 04d065da7..7d4b32eb9 100644 --- a/netbox/extras/constants.py +++ b/netbox/extras/constants.py @@ -1,23 +1,38 @@ +from django.db.models import Q + + # Models which support custom fields -CUSTOMFIELD_MODELS = [ - 'circuits.circuit', - 'circuits.provider', - 'dcim.device', - 'dcim.devicetype', - 'dcim.powerfeed', - 'dcim.rack', - 'dcim.site', - 'ipam.aggregate', - 'ipam.ipaddress', - 'ipam.prefix', - 'ipam.service', - 'ipam.vlan', - 'ipam.vrf', - 'secrets.secret', - 'tenancy.tenant', - 'virtualization.cluster', - 'virtualization.virtualmachine', -] +CUSTOMFIELD_MODELS = Q( + Q(app_label='circuits', model__in=[ + 'circuit', + 'provider', + ]) | + Q(app_label='dcim', model__in=[ + 'device', + 'devicetype', + 'powerfeed', + 'rack', + 'site', + ]) | + Q(app_label='ipam', model__in=[ + 'aggregate', + 'ipaddress', + 'prefix', + 'service', + 'vlan', + 'vrf', + ]) | + Q(app_label='secrets', model__in=[ + 'secret', + ]) | + Q(app_label='tenancy', model__in=[ + 'tenant', + ]) | + Q(app_label='virtualization', model__in=[ + 'cluster', + 'virtualmachine', + ]) +) # Custom links CUSTOMLINK_MODELS = [ diff --git a/netbox/extras/migrations/0022_custom_links.py b/netbox/extras/migrations/0022_custom_links.py index cd204f50a..e977eff8f 100644 --- a/netbox/extras/migrations/0022_custom_links.py +++ b/netbox/extras/migrations/0022_custom_links.py @@ -33,7 +33,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='customfield', name='obj_type', - field=models.ManyToManyField(limit_choices_to=extras.models.get_custom_field_models, related_name='custom_fields', to='contenttypes.ContentType'), + field=models.ManyToManyField(related_name='custom_fields', to='contenttypes.ContentType'), ), migrations.AlterField( model_name='exporttemplate', diff --git a/netbox/extras/migrations/0022_custom_links_squashed_0034_configcontext_tags.py b/netbox/extras/migrations/0022_custom_links_squashed_0034_configcontext_tags.py index 4a591efa0..32ed2d5fc 100644 --- a/netbox/extras/migrations/0022_custom_links_squashed_0034_configcontext_tags.py +++ b/netbox/extras/migrations/0022_custom_links_squashed_0034_configcontext_tags.py @@ -115,7 +115,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='customfield', name='obj_type', - field=models.ManyToManyField(limit_choices_to=extras.models.get_custom_field_models, related_name='custom_fields', to='contenttypes.ContentType'), + field=models.ManyToManyField(related_name='custom_fields', to='contenttypes.ContentType'), ), migrations.AlterField( model_name='exporttemplate', diff --git a/netbox/extras/migrations/0036_contenttype_filters_to_q_objects.py b/netbox/extras/migrations/0036_contenttype_filters_to_q_objects.py new file mode 100644 index 000000000..36a8acc05 --- /dev/null +++ b/netbox/extras/migrations/0036_contenttype_filters_to_q_objects.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.8 on 2020-01-15 21:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0035_deterministic_ordering'), + ] + + operations = [ + migrations.AlterField( + model_name='customfield', + name='obj_type', + field=models.ManyToManyField(limit_choices_to=models.Q(models.Q(models.Q(('app_label', 'circuits'), ('model__in', ['circuit', 'provider'])), models.Q(('app_label', 'dcim'), ('model__in', ['device', 'devicetype', 'powerfeed', 'rack', 'site'])), models.Q(('app_label', 'ipam'), ('model__in', ['aggregate', 'ipaddress', 'prefix', 'service', 'vlan', 'vrf'])), models.Q(('app_label', 'secrets'), ('model__in', ['secret'])), models.Q(('app_label', 'tenancy'), ('model__in', ['tenant'])), models.Q(('app_label', 'virtualization'), ('model__in', ['cluster', 'virtualmachine'])), _connector='OR')), related_name='custom_fields', to='contenttypes.ContentType'), + ), + ] diff --git a/netbox/extras/models.py b/netbox/extras/models.py index 147963589..2df261996 100644 --- a/netbox/extras/models.py +++ b/netbox/extras/models.py @@ -192,16 +192,12 @@ class CustomFieldModel(models.Model): return OrderedDict([(field, None) for field in fields]) -def get_custom_field_models(): - return model_names_to_filter_dict(CUSTOMFIELD_MODELS) - - class CustomField(models.Model): obj_type = models.ManyToManyField( to=ContentType, related_name='custom_fields', verbose_name='Object(s)', - limit_choices_to=get_custom_field_models, + limit_choices_to=CUSTOMFIELD_MODELS, help_text='The object(s) to which this field applies.' ) type = models.CharField(