From 570f64784fd100bedbca9ab8b113677670ab10b0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Mar 2024 09:23:06 -0500 Subject: [PATCH] Update Tag.object_types to reference ObjectType --- netbox/extras/graphql/types.py | 2 +- .../migrations/0112_tag_update_object_types.py | 17 +++++++++++++++++ netbox/extras/models/tags.py | 2 +- netbox/extras/signals.py | 5 +++-- netbox/extras/tests/test_filtersets.py | 10 +++++----- netbox/extras/tests/test_models.py | 4 ++-- 6 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 netbox/extras/migrations/0112_tag_update_object_types.py diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py index 9e0444da6..65819a75a 100644 --- a/netbox/extras/graphql/types.py +++ b/netbox/extras/graphql/types.py @@ -111,7 +111,7 @@ class TagType(ObjectType): class Meta: model = models.Tag - exclude = ('extras_taggeditem_items',) + exclude = ('object_types', 'extras_taggeditem_items',) filterset_class = filtersets.TagFilterSet diff --git a/netbox/extras/migrations/0112_tag_update_object_types.py b/netbox/extras/migrations/0112_tag_update_object_types.py new file mode 100644 index 000000000..87ec117a4 --- /dev/null +++ b/netbox/extras/migrations/0112_tag_update_object_types.py @@ -0,0 +1,17 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0010_gfk_indexes'), + ('extras', '0111_rename_content_types'), + ] + + operations = [ + migrations.AlterField( + model_name='tag', + name='object_types', + field=models.ManyToManyField(blank=True, related_name='+', to='core.objecttype'), + ), + ] diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index 3aba6df60..27b05638e 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -34,7 +34,7 @@ class Tag(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel, TagBase): blank=True, ) object_types = models.ManyToManyField( - to='contenttypes.ContentType', + to='core.ObjectType', related_name='+', blank=True, help_text=_("The object type(s) to which this this tag can be applied.") diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index 85c00169c..cacc5a83a 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -8,6 +8,7 @@ from django.dispatch import receiver, Signal from django.utils.translation import gettext_lazy as _ from django_prometheus.models import model_deletes, model_inserts, model_updates +from core.models import ObjectType from core.signals import job_end, job_start from extras.constants import EVENT_JOB_END, EVENT_JOB_START from extras.events import process_event_rules @@ -240,8 +241,8 @@ def validate_assigned_tags(sender, instance, action, model, pk_set, **kwargs): """ if action != 'pre_add': return - ct = ContentType.objects.get_for_model(instance) - # Retrieve any applied Tags that are restricted to certain object_types + ct = ObjectType.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(): raise AbortRequest(f"Tag {tag} cannot be assigned to {ct.model} objects.") diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index 762818d6d..7be00a5a3 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -1114,9 +1114,9 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): @classmethod def setUpTestData(cls): - content_types = { - 'site': ContentType.objects.get_by_natural_key('dcim', 'site'), - 'provider': ContentType.objects.get_by_natural_key('circuits', 'provider'), + object_types = { + 'site': ObjectType.objects.get_by_natural_key('dcim', 'site'), + 'provider': ObjectType.objects.get_by_natural_key('circuits', 'provider'), } tags = ( @@ -1125,8 +1125,8 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): Tag(name='Tag 3', slug='tag-3', color='0000ff'), ) Tag.objects.bulk_create(tags) - tags[0].object_types.add(content_types['site']) - tags[1].object_types.add(content_types['provider']) + tags[0].object_types.add(object_types['site']) + tags[1].object_types.add(object_types['provider']) # Apply some tags so we can filter by content type site = Site.objects.create(name='Site 1', slug='site-1') diff --git a/netbox/extras/tests/test_models.py b/netbox/extras/tests/test_models.py index cb3f08acb..c92a1bc54 100644 --- a/netbox/extras/tests/test_models.py +++ b/netbox/extras/tests/test_models.py @@ -1,6 +1,6 @@ -from django.contrib.contenttypes.models import ContentType from django.test import TestCase +from core.models import ObjectType from dcim.models import Device, DeviceRole, DeviceType, Location, Manufacturer, Platform, Region, Site, SiteGroup from extras.models import ConfigContext, Tag from tenancy.models import Tenant, TenantGroup @@ -22,7 +22,7 @@ class TagTest(TestCase): # Create a Tag that can only be applied to Regions tag = Tag.objects.create(name='Tag 1', slug='tag-1') - tag.object_types.add(ContentType.objects.get_by_natural_key('dcim', 'region')) + tag.object_types.add(ObjectType.objects.get_by_natural_key('dcim', 'region')) # Apply the Tag to a Region region.tags.add(tag)