diff --git a/netbox/extras/migrations/0111_rename_content_types.py b/netbox/extras/migrations/0111_rename_content_types.py index a9f80b146..1317bb345 100644 --- a/netbox/extras/migrations/0111_rename_content_types.py +++ b/netbox/extras/migrations/0111_rename_content_types.py @@ -18,13 +18,13 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='customfield', name='object_types', - field=models.ManyToManyField(related_name='custom_fields', to='core.objecttype'), + field=models.ManyToManyField(related_name='custom_fields', to='contenttypes.contenttype'), ), migrations.AlterField( model_name='customfield', name='object_type', field=models.ForeignKey( - blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='core.objecttype' + blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='contenttypes.contenttype' ), ), migrations.RunSQL(( @@ -45,7 +45,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='customlink', name='object_types', - field=models.ManyToManyField(related_name='custom_links', to='core.objecttype'), + field=models.ManyToManyField(related_name='custom_links', to='contenttypes.contenttype'), ), migrations.RunSQL( 'ALTER TABLE extras_customlink_content_types_id_seq RENAME TO extras_customlink_object_types_id_seq' @@ -59,7 +59,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='eventrule', name='object_types', - field=models.ManyToManyField(related_name='event_rules', to='core.objecttype'), + field=models.ManyToManyField(related_name='event_rules', to='contenttypes.contenttype'), ), migrations.RunSQL( 'ALTER TABLE extras_eventrule_content_types_id_seq RENAME TO extras_eventrule_object_types_id_seq' @@ -73,7 +73,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='exporttemplate', name='object_types', - field=models.ManyToManyField(related_name='export_templates', to='core.objecttype'), + field=models.ManyToManyField(related_name='export_templates', to='contenttypes.contenttype'), ), migrations.RunSQL( 'ALTER TABLE extras_exporttemplate_content_types_id_seq RENAME TO extras_exporttemplate_object_types_id_seq' @@ -87,7 +87,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='savedfilter', name='object_types', - field=models.ManyToManyField(related_name='saved_filters', to='core.objecttype'), + field=models.ManyToManyField(related_name='saved_filters', to='contenttypes.contenttype'), ), migrations.RunSQL( 'ALTER TABLE extras_savedfilter_content_types_id_seq RENAME TO extras_savedfilter_object_types_id_seq' diff --git a/netbox/extras/migrations/0112_tag_update_object_types.py b/netbox/extras/migrations/0112_tag_update_object_types.py index e863ba8c3..5884ddfd0 100644 --- a/netbox/extras/migrations/0112_tag_update_object_types.py +++ b/netbox/extras/migrations/0112_tag_update_object_types.py @@ -11,6 +11,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='tag', name='object_types', - field=models.ManyToManyField(blank=True, related_name='+', to='core.objecttype'), + field=models.ManyToManyField(blank=True, related_name='+', to='contenttypes.contenttype'), ), ] diff --git a/netbox/extras/migrations/0128_tableconfig.py b/netbox/extras/migrations/0128_tableconfig.py index e6d45199d..98048ee27 100644 --- a/netbox/extras/migrations/0128_tableconfig.py +++ b/netbox/extras/migrations/0128_tableconfig.py @@ -37,7 +37,9 @@ class Migration(migrations.Migration): ( 'object_type', models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, related_name='table_configs', to='core.objecttype' + on_delete=django.db.models.deletion.CASCADE, + related_name='table_configs', + to='contenttypes.contenttype' ), ), ( diff --git a/netbox/extras/migrations/0131_concrete_objecttype.py b/netbox/extras/migrations/0131_concrete_objecttype.py deleted file mode 100644 index b93bdd882..000000000 --- a/netbox/extras/migrations/0131_concrete_objecttype.py +++ /dev/null @@ -1,56 +0,0 @@ -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ('core', '0017_concrete_objecttype'), - ('extras', '0130_imageattachment_description'), - ] - - operations = [ - migrations.AlterField( - model_name='Tag', - name='object_types', - field=models.ManyToManyField(blank=True, related_name='+', to='core.objecttype'), - ), - migrations.AlterField( - model_name='CustomField', - name='related_object_type', - field=models.ForeignKey( - blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='core.objecttype' - ), - ), - migrations.AlterField( - model_name='CustomField', - name='object_types', - field=models.ManyToManyField(related_name='custom_fields', to='core.objecttype'), - ), - migrations.AlterField( - model_name='EventRule', - name='object_types', - field=models.ManyToManyField(related_name='event_rules', to='core.objecttype'), - ), - migrations.AlterField( - model_name='CustomLink', - name='object_types', - field=models.ManyToManyField(related_name='custom_links', to='core.objecttype'), - ), - migrations.AlterField( - model_name='ExportTemplate', - name='object_types', - field=models.ManyToManyField(related_name='export_templates', to='core.objecttype'), - ), - migrations.AlterField( - model_name='SavedFilter', - name='object_types', - field=models.ManyToManyField(related_name='saved_filters', to='core.objecttype'), - ), - migrations.AlterField( - model_name='TableConfig', - name='object_type', - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, related_name='table_configs', to='core.objecttype' - ), - ), - ] diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index aeeb15728..88e6abc27 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -72,7 +72,7 @@ class CustomFieldManager(models.Manager.from_queryset(RestrictedQuerySet)): class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): object_types = models.ManyToManyField( - to='core.ObjectType', + to='contenttypes.ContentType', related_name='custom_fields', help_text=_('The object(s) to which this field applies.') ) @@ -84,7 +84,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): help_text=_('The type of data this custom field holds') ) related_object_type = models.ForeignKey( - to='core.ObjectType', + to='contenttypes.ContentType', on_delete=models.PROTECT, blank=True, null=True, diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index a486ec1ee..fc69e692c 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -49,7 +49,7 @@ class EventRule(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLogged webhook or executing a custom script. """ object_types = models.ManyToManyField( - to='core.ObjectType', + to='contenttypes.ContentType', related_name='event_rules', verbose_name=_('object types'), help_text=_("The object(s) to which this rule applies.") @@ -298,7 +298,7 @@ class CustomLink(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): code to be rendered with an object as context. """ object_types = models.ManyToManyField( - to='core.ObjectType', + to='contenttypes.ContentType', related_name='custom_links', help_text=_('The object type(s) to which this link applies.') ) @@ -394,7 +394,7 @@ class CustomLink(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): class ExportTemplate(SyncedDataMixin, CloningMixin, ExportTemplatesMixin, ChangeLoggedModel, RenderTemplateMixin): object_types = models.ManyToManyField( - to='core.ObjectType', + to='contenttypes.ContentType', related_name='export_templates', help_text=_('The object type(s) to which this template applies.') ) @@ -459,7 +459,7 @@ class SavedFilter(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): A set of predefined keyword parameters that can be reused to filter for specific objects. """ object_types = models.ManyToManyField( - to='core.ObjectType', + to='contenttypes.ContentType', related_name='saved_filters', help_text=_('The object type(s) to which this filter applies.') ) @@ -539,7 +539,7 @@ class TableConfig(CloningMixin, ChangeLoggedModel): A saved configuration of columns and ordering which applies to a specific table. """ object_type = models.ForeignKey( - to='core.ObjectType', + to='contenttypes.ContentType', on_delete=models.CASCADE, related_name='table_configs', help_text=_("The table's object type"), diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index b40327265..c05f44faf 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -35,7 +35,7 @@ class Tag(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel, TagBase): blank=True, ) object_types = models.ManyToManyField( - to='core.ObjectType', + to='contenttypes.ContentType', related_name='+', blank=True, help_text=_("The object type(s) to which this tag can be applied.") diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index 611e61e5e..7105c38b4 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -3,7 +3,6 @@ from django.db.models.signals import m2m_changed, post_save, pre_delete from django.dispatch import receiver from core.events import * -from core.models import ObjectType from core.signals import job_end, job_start from extras.events import process_event_rules from extras.models import EventRule, Notification, Subscription @@ -82,7 +81,7 @@ def validate_assigned_tags(sender, instance, action, model, pk_set, **kwargs): """ if action != 'pre_add': return - ct = ObjectType.objects.get_for_model(instance) + ct = ContentType.objects.get_for_model(instance) # Retrieve any applied Tags that are restricted to certain object types for tag in model.objects.filter(pk__in=pk_set, object_types__isnull=False).prefetch_related('object_types'): if ct not in tag.object_types.all(): diff --git a/netbox/users/migrations/0007_objectpermission_update_object_types.py b/netbox/users/migrations/0007_objectpermission_update_object_types.py index 3be93270b..9e010de97 100644 --- a/netbox/users/migrations/0007_objectpermission_update_object_types.py +++ b/netbox/users/migrations/0007_objectpermission_update_object_types.py @@ -13,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='objectpermission', name='object_types', - field=models.ManyToManyField(related_name='object_permissions', to='core.objecttype'), + field=models.ManyToManyField(related_name='object_permissions', to='contenttypes.contenttype'), ), ] diff --git a/netbox/users/migrations/0009_update_group_perms.py b/netbox/users/migrations/0009_update_group_perms.py index af0f123c5..f607e5d9c 100644 --- a/netbox/users/migrations/0009_update_group_perms.py +++ b/netbox/users/migrations/0009_update_group_perms.py @@ -27,6 +27,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='objectpermission', name='object_types', - field=models.ManyToManyField(related_name='object_permissions', to='core.objecttype'), + field=models.ManyToManyField(related_name='object_permissions', to='contenttypes.contenttype'), ), ] diff --git a/netbox/users/migrations/0010_concrete_objecttype.py b/netbox/users/migrations/0010_concrete_objecttype.py deleted file mode 100644 index bfd9e20e5..000000000 --- a/netbox/users/migrations/0010_concrete_objecttype.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('core', '0017_concrete_objecttype'), - ('users', '0009_update_group_perms'), - ] - - operations = [ - migrations.AlterField( - model_name='ObjectPermission', - name='object_types', - field=models.ManyToManyField(related_name='object_permissions', to='core.objecttype'), - ), - ] diff --git a/netbox/users/models/permissions.py b/netbox/users/models/permissions.py index 772adcdb7..3ae8ff4c1 100644 --- a/netbox/users/models/permissions.py +++ b/netbox/users/models/permissions.py @@ -29,7 +29,7 @@ class ObjectPermission(models.Model): default=True ) object_types = models.ManyToManyField( - to='core.ObjectType', + to='contenttypes.ContentType', related_name='object_permissions' ) actions = ArrayField( diff --git a/netbox/utilities/testing/filtersets.py b/netbox/utilities/testing/filtersets.py index 260c092db..b8fb62821 100644 --- a/netbox/utilities/testing/filtersets.py +++ b/netbox/utilities/testing/filtersets.py @@ -1,19 +1,17 @@ -import django_filters from datetime import datetime, timezone from itertools import chain -from mptt.models import MPTTModel +import django_filters from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.contrib.contenttypes.models import ContentType from django.db.models import ForeignKey, ManyToManyField, ManyToManyRel, ManyToOneRel, OneToOneRel from django.utils.module_loading import import_string +from mptt.models import MPTTModel from taggit.managers import TaggableManager from extras.filters import TagFilter from utilities.filters import ContentTypeFilter, TreeNodeMultipleChoiceFilter -from core.models import ObjectType - __all__ = ( 'BaseFilterSetTests', 'ChangeLoggedFilterSetTests', @@ -61,13 +59,6 @@ class BaseFilterSetTests: if field.related_model is ContentType: return [(None, None)] - # ForeignKeys to ObjectType need two filters: 'app.model' & PK - if field.related_model is ObjectType: - return [ - (filter_name, ContentTypeFilter), - (f'{filter_name}_id', django_filters.ModelMultipleChoiceFilter), - ] - # ForeignKey to an MPTT-enabled model if issubclass(field.related_model, MPTTModel) and field.model is not field.related_model: return [(f'{filter_name}_id', TreeNodeMultipleChoiceFilter)] @@ -79,8 +70,10 @@ class BaseFilterSetTests: filter_name = self.get_m2m_filter_name(field) filter_name = self.filter_name_map.get(filter_name, filter_name) - # ManyToManyFields to ObjectType need two filters: 'app.model' & PK - if field.related_model is ObjectType: + # ManyToManyFields to ContentType need two filters: 'app.model' & PK + if field.related_model is ContentType: + # Standardize on object_type for filter name even though it's technically a ContentType + filter_name = 'object_type' return [ (filter_name, ContentTypeFilter), (f'{filter_name}_id', django_filters.ModelMultipleChoiceFilter),