77from django_prometheus .models import model_deletes , model_inserts , model_updates
88
99from extras .validators import CustomValidator
10+ from netbox import thread_locals
1011from netbox .config import get_config
12+ from netbox .request_context import get_request
1113from netbox .signals import post_clean
1214from .choices import ObjectChangeActionChoices
1315from .models import ConfigRevision , CustomField , ObjectChange
1416from .webhooks import enqueue_object , get_snapshots , serialize_for_webhook
1517
16-
1718#
1819# Change logging/webhooks
1920#
2223clear_webhooks = Signal ()
2324
2425
25- def _handle_changed_object ( request , webhook_queue , sender , instance , ** kwargs ):
26+ def handle_changed_object ( sender , instance , ** kwargs ):
2627 """
2728 Fires when an object is created or updated.
2829 """
30+ if not hasattr (instance , 'to_objectchange' ):
31+ return
32+
33+ request = get_request ()
34+ m2m_changed = False
35+
2936 def is_same_object (instance , webhook_data ):
3037 return (
3138 ContentType .objects .get_for_model (instance ) == webhook_data ['content_type' ] and
3239 instance .pk == webhook_data ['object_id' ] and
3340 request .id == webhook_data ['request_id' ]
3441 )
3542
36- if not hasattr (instance , 'to_objectchange' ):
37- return
38-
39- m2m_changed = False
40-
4143 # Determine the type of change being made
4244 if kwargs .get ('created' ):
4345 action = ObjectChangeActionChoices .ACTION_CREATE
@@ -67,6 +69,7 @@ def is_same_object(instance, webhook_data):
6769 objectchange .save ()
6870
6971 # If this is an M2M change, update the previously queued webhook (from post_save)
72+ webhook_queue = thread_locals .webhook_queue
7073 if m2m_changed and webhook_queue and is_same_object (instance , webhook_queue [- 1 ]):
7174 instance .refresh_from_db () # Ensure that we're working with fresh M2M assignments
7275 webhook_queue [- 1 ]['data' ] = serialize_for_webhook (instance )
@@ -81,13 +84,15 @@ def is_same_object(instance, webhook_data):
8184 model_updates .labels (instance ._meta .model_name ).inc ()
8285
8386
84- def _handle_deleted_object ( request , webhook_queue , sender , instance , ** kwargs ):
87+ def handle_deleted_object ( sender , instance , ** kwargs ):
8588 """
8689 Fires when an object is deleted.
8790 """
8891 if not hasattr (instance , 'to_objectchange' ):
8992 return
9093
94+ request = get_request ()
95+
9196 # Record an ObjectChange if applicable
9297 if hasattr (instance , 'to_objectchange' ):
9398 objectchange = instance .to_objectchange (ObjectChangeActionChoices .ACTION_DELETE )
@@ -96,19 +101,21 @@ def _handle_deleted_object(request, webhook_queue, sender, instance, **kwargs):
96101 objectchange .save ()
97102
98103 # Enqueue webhooks
104+ webhook_queue = thread_locals .webhook_queue
99105 enqueue_object (webhook_queue , instance , request .user , request .id , ObjectChangeActionChoices .ACTION_DELETE )
100106
101107 # Increment metric counters
102108 model_deletes .labels (instance ._meta .model_name ).inc ()
103109
104110
105- def _clear_webhook_queue ( webhook_queue , sender , ** kwargs ):
111+ def clear_webhook_queue ( sender , ** kwargs ):
106112 """
107113 Delete any queued webhooks (e.g. because of an aborted bulk transaction)
108114 """
109115 logger = logging .getLogger ('webhooks' )
110- logger . info ( f"Clearing { len ( webhook_queue ) } queued webhooks ( { sender } )" )
116+ webhook_queue = thread_locals . webhook_queue
111117
118+ logger .info (f"Clearing { len (webhook_queue )} queued webhooks ({ sender } )" )
112119 webhook_queue .clear ()
113120
114121
0 commit comments