mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-13 11:08:18 -06:00
Implement thread lock for change log signalling
This commit is contained in:
parent
a090955918
commit
9544519798
@ -1,11 +1,14 @@
|
|||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
import threading
|
||||||
from django.db.models.signals import m2m_changed, pre_delete, post_save
|
from django.db.models.signals import m2m_changed, pre_delete, post_save
|
||||||
|
|
||||||
from extras.signals import clear_webhooks, _clear_webhook_queue, _handle_changed_object, _handle_deleted_object
|
from extras.signals import clear_webhooks, _clear_webhook_queue, _handle_changed_object, _handle_deleted_object
|
||||||
from utilities.utils import curry
|
from utilities.utils import curry
|
||||||
from .webhooks import flush_webhooks
|
from .webhooks import flush_webhooks
|
||||||
|
|
||||||
|
changelog_lock = threading.Lock()
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def change_logging(request):
|
def change_logging(request):
|
||||||
@ -15,27 +18,31 @@ def change_logging(request):
|
|||||||
|
|
||||||
:param request: WSGIRequest object with a unique `id` set
|
:param request: WSGIRequest object with a unique `id` set
|
||||||
"""
|
"""
|
||||||
|
|
||||||
webhook_queue = []
|
webhook_queue = []
|
||||||
|
|
||||||
# Curry signals receivers to pass the current request
|
with changelog_lock:
|
||||||
handle_changed_object = curry(_handle_changed_object, request, webhook_queue)
|
|
||||||
handle_deleted_object = curry(_handle_deleted_object, request, webhook_queue)
|
|
||||||
clear_webhook_queue = curry(_clear_webhook_queue, webhook_queue)
|
|
||||||
|
|
||||||
# Connect our receivers to the post_save and post_delete signals.
|
# Curry signals receivers to pass the current request
|
||||||
post_save.connect(handle_changed_object, dispatch_uid='handle_changed_object')
|
handle_changed_object = curry(_handle_changed_object, request, webhook_queue)
|
||||||
m2m_changed.connect(handle_changed_object, dispatch_uid='handle_changed_object')
|
handle_deleted_object = curry(_handle_deleted_object, request, webhook_queue)
|
||||||
pre_delete.connect(handle_deleted_object, dispatch_uid='handle_deleted_object')
|
clear_webhook_queue = curry(_clear_webhook_queue, webhook_queue)
|
||||||
clear_webhooks.connect(clear_webhook_queue, dispatch_uid='clear_webhook_queue')
|
|
||||||
|
|
||||||
yield
|
# Connect our receivers to the post_save and post_delete signals.
|
||||||
|
post_save.connect(handle_changed_object, dispatch_uid='handle_changed_object')
|
||||||
|
m2m_changed.connect(handle_changed_object, dispatch_uid='handle_changed_object')
|
||||||
|
pre_delete.connect(handle_deleted_object, dispatch_uid='handle_deleted_object')
|
||||||
|
clear_webhooks.connect(clear_webhook_queue, dispatch_uid='clear_webhook_queue')
|
||||||
|
|
||||||
|
yield
|
||||||
|
|
||||||
|
# Disconnect change logging signals. This is necessary to avoid recording any errant
|
||||||
|
# changes during test cleanup.
|
||||||
|
post_save.disconnect(handle_changed_object, dispatch_uid='handle_changed_object')
|
||||||
|
m2m_changed.disconnect(handle_changed_object, dispatch_uid='handle_changed_object')
|
||||||
|
pre_delete.disconnect(handle_deleted_object, dispatch_uid='handle_deleted_object')
|
||||||
|
clear_webhooks.disconnect(clear_webhook_queue, dispatch_uid='clear_webhook_queue')
|
||||||
|
|
||||||
# Disconnect change logging signals. This is necessary to avoid recording any errant
|
|
||||||
# changes during test cleanup.
|
|
||||||
post_save.disconnect(handle_changed_object, dispatch_uid='handle_changed_object')
|
|
||||||
m2m_changed.disconnect(handle_changed_object, dispatch_uid='handle_changed_object')
|
|
||||||
pre_delete.disconnect(handle_deleted_object, dispatch_uid='handle_deleted_object')
|
|
||||||
clear_webhooks.disconnect(clear_webhook_queue, dispatch_uid='clear_webhook_queue')
|
|
||||||
|
|
||||||
# Flush queued webhooks to RQ
|
# Flush queued webhooks to RQ
|
||||||
flush_webhooks(webhook_queue)
|
flush_webhooks(webhook_queue)
|
||||||
|
Loading…
Reference in New Issue
Block a user