66from django .dispatch import receiver , Signal
77from django_prometheus .models import model_deletes , model_inserts , model_updates
88
9+ from netbox import thread_locals
10+ from netbox .request_context import get_request
911from netbox .signals import post_clean
1012from .choices import ObjectChangeActionChoices
1113from .models import CustomField , ObjectChange
2022clear_webhooks = Signal ()
2123
2224
23- def _handle_changed_object ( request , webhook_queue , sender , instance , ** kwargs ):
25+ def handle_changed_object ( sender , instance , ** kwargs ):
2426 """
2527 Fires when an object is created or updated.
2628 """
29+ if not hasattr (instance , 'to_objectchange' ):
30+ return
31+
32+ request = get_request ()
33+ m2m_changed = False
34+
2735 def is_same_object (instance , webhook_data ):
2836 return (
2937 ContentType .objects .get_for_model (instance ) == webhook_data ['content_type' ] and
3038 instance .pk == webhook_data ['object_id' ] and
3139 request .id == webhook_data ['request_id' ]
3240 )
3341
34- if not hasattr (instance , 'to_objectchange' ):
35- return
36-
37- m2m_changed = False
38-
3942 # Determine the type of change being made
4043 if kwargs .get ('created' ):
4144 action = ObjectChangeActionChoices .ACTION_CREATE
@@ -65,6 +68,7 @@ def is_same_object(instance, webhook_data):
6568 objectchange .save ()
6669
6770 # If this is an M2M change, update the previously queued webhook (from post_save)
71+ webhook_queue = thread_locals .webhook_queue
6872 if m2m_changed and webhook_queue and is_same_object (instance , webhook_queue [- 1 ]):
6973 instance .refresh_from_db () # Ensure that we're working with fresh M2M assignments
7074 webhook_queue [- 1 ]['data' ] = serialize_for_webhook (instance )
@@ -79,13 +83,15 @@ def is_same_object(instance, webhook_data):
7983 model_updates .labels (instance ._meta .model_name ).inc ()
8084
8185
82- def _handle_deleted_object ( request , webhook_queue , sender , instance , ** kwargs ):
86+ def handle_deleted_object ( sender , instance , ** kwargs ):
8387 """
8488 Fires when an object is deleted.
8589 """
8690 if not hasattr (instance , 'to_objectchange' ):
8791 return
8892
93+ request = get_request ()
94+
8995 # Record an ObjectChange if applicable
9096 if hasattr (instance , 'to_objectchange' ):
9197 objectchange = instance .to_objectchange (ObjectChangeActionChoices .ACTION_DELETE )
@@ -94,19 +100,21 @@ def _handle_deleted_object(request, webhook_queue, sender, instance, **kwargs):
94100 objectchange .save ()
95101
96102 # Enqueue webhooks
103+ webhook_queue = thread_locals .webhook_queue
97104 enqueue_object (webhook_queue , instance , request .user , request .id , ObjectChangeActionChoices .ACTION_DELETE )
98105
99106 # Increment metric counters
100107 model_deletes .labels (instance ._meta .model_name ).inc ()
101108
102109
103- def _clear_webhook_queue ( webhook_queue , sender , ** kwargs ):
110+ def clear_webhook_queue ( sender , ** kwargs ):
104111 """
105112 Delete any queued webhooks (e.g. because of an aborted bulk transaction)
106113 """
107114 logger = logging .getLogger ('webhooks' )
108- logger . info ( f"Clearing { len ( webhook_queue ) } queued webhooks ( { sender } )" )
115+ webhook_queue = thread_locals . webhook_queue
109116
117+ logger .info (f"Clearing { len (webhook_queue )} queued webhooks ({ sender } )" )
110118 webhook_queue .clear ()
111119
112120
0 commit comments