From 533fe555eac075124d967c6813f640108f38c166 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 24 Jul 2025 08:25:55 -0400 Subject: [PATCH] Misc cleanup --- netbox/extras/events.py | 4 ++-- netbox/extras/signals.py | 10 ++++++---- netbox/netbox/models/features.py | 1 + netbox/netbox/tests/test_plugins.py | 4 ++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/netbox/extras/events.py b/netbox/extras/events.py index 36fa87661..f8447fdb2 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -9,9 +9,9 @@ from django.utils.translation import gettext as _ from django_rq import get_queue from core.events import * -from core.models import ObjectType from netbox.config import get_config from netbox.constants import RQ_QUEUE_DEFAULT +from netbox.models.features import has_feature from users.models import User from utilities.api import get_serializer_for_model from utilities.rqworker import get_rq_retry @@ -56,7 +56,7 @@ def enqueue_event(queue, instance, user, request_id, event_type): events once the request has completed. """ # Bail if this type of object does not support event rules - if 'event_rules' not in ObjectType.objects.get_for_model(instance).features: + if not has_feature(instance, 'event_rules'): return app_label = instance._meta.app_label diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index bee31acc9..611e61e5e 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -8,6 +8,7 @@ from core.signals import job_end, job_start from extras.events import process_event_rules from extras.models import EventRule, Notification, Subscription from netbox.config import get_config +from netbox.models.features import has_feature from netbox.signals import post_clean from utilities.exceptions import AbortRequest from .models import CustomField, TaggedItem @@ -149,13 +150,14 @@ def notify_object_changed(sender, instance, **kwargs): event_type = OBJECT_DELETED # Skip unsupported object types - object_type = ObjectType.objects.get_for_model(instance) - if 'notifications' not in object_type.features: + if not has_feature(instance, 'notifications'): return + ct = ContentType.objects.get_for_model(instance) + # Find all subscribed Users subscribed_users = Subscription.objects.filter( - object_type=object_type, + object_type=ct, object_id=instance.pk ).values_list('user', flat=True) if not subscribed_users: @@ -163,7 +165,7 @@ def notify_object_changed(sender, instance, **kwargs): # Delete any existing Notifications for the object Notification.objects.filter( - object_type=object_type, + object_type=ct, object_id=instance.pk, user__in=subscribed_users ).delete() diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index db8bdb094..39ae76dea 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -658,6 +658,7 @@ def has_feature(model, feature): """ Returns True if the model supports the specified feature. """ + # Resolve a ContentType to its model class if type(model) is ContentType: model = model.model_class() ot = ObjectType.objects.get_for_model(model) diff --git a/netbox/netbox/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py index f1d2b34c8..45d6cf171 100644 --- a/netbox/netbox/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -24,8 +24,8 @@ class PluginTest(TestCase): self.assertIn('netbox.tests.dummy_plugin.DummyPluginConfig', settings.INSTALLED_APPS) def test_model_registration(self): - self.assertIsNone( - ObjectType.objects.filter(app_label='dummy_plugin', model='dummymodel') + self.assertTrue( + ObjectType.objects.get(app_label='dummy_plugin', model='dummymodel').exists() ) def test_models(self):