Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions netbox/core/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db.models import CASCADE
from django.db.models import CASCADE, RESTRICT
from django.db.models.fields.reverse_related import ManyToManyRel, ManyToOneRel
from django.db.models.signals import m2m_changed, post_migrate, post_save, pre_delete
from django.dispatch import receiver, Signal
Expand Down Expand Up @@ -47,6 +47,7 @@
# Object types
#


@receiver(post_migrate)
def update_object_types(sender, **kwargs):
"""
Expand Down Expand Up @@ -133,7 +134,7 @@ def handle_changed_object(sender, instance, **kwargs):
prev_change := ObjectChange.objects.filter(
changed_object_type=ContentType.objects.get_for_model(instance),
changed_object_id=instance.pk,
request_id=request.id
request_id=request.id,
).first()
):
prev_change.postchange_data = objectchange.postchange_data
Expand Down Expand Up @@ -172,9 +173,7 @@ def handle_deleted_object(sender, instance, **kwargs):
try:
run_validators(instance, validators)
except ValidationError as e:
raise AbortRequest(
_("Deletion is prevented by a protection rule: {message}").format(message=e)
)
raise AbortRequest(_("Deletion is prevented by a protection rule: {message}").format(message=e))

# Get the current request, or bail if not set
request = current_request.get()
Expand Down Expand Up @@ -221,7 +220,12 @@ def handle_deleted_object(sender, instance, **kwargs):
obj.snapshot() # Ensure the change record includes the "before" state
if type(relation) is ManyToManyRel:
getattr(obj, related_field_name).remove(instance)
elif type(relation) is ManyToOneRel and relation.null and relation.on_delete is not CASCADE:
elif (
type(relation) is ManyToOneRel
and relation.null
and relation.on_delete is not CASCADE
and relation.on_delete is not RESTRICT
):
setattr(obj, related_field_name, None)
obj.save()

Expand Down Expand Up @@ -256,6 +260,7 @@ def clear_events_queue(sender, **kwargs):
# DataSource handlers
#


@receiver(post_save, sender=DataSource)
def enqueue_sync_job(instance, created, **kwargs):
"""
Expand All @@ -267,9 +272,10 @@ def enqueue_sync_job(instance, created, **kwargs):
SyncDataSourceJob.enqueue_once(instance, interval=instance.sync_interval)
elif not created:
# Delete any previously scheduled recurring jobs for this DataSource
for job in SyncDataSourceJob.get_jobs(instance).defer('data').filter(
interval__isnull=False,
status=JobStatusChoices.STATUS_SCHEDULED
for job in (
SyncDataSourceJob.get_jobs(instance)
.defer('data')
.filter(interval__isnull=False, status=JobStatusChoices.STATUS_SCHEDULED)
):
# Call delete() per instance to ensure the associated background task is deleted as well
job.delete()
Expand Down
Loading