Przeglądaj źródła

14947 fix for missing changelog if only update m2m (#14986)

* 14947 fix for missing changelog if only update m2m

* 14947 review change

* 14947 DRY save logic

* 14947 DRY save logic

* Refactor logic

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
Arthur Hanson 2 lat temu
rodzic
commit
31fb6961e9
1 zmienionych plików z 14 dodań i 12 usunięć
  1. 14 12
      netbox/extras/signals.py

+ 14 - 12
netbox/extras/signals.py

@@ -68,21 +68,23 @@ def handle_changed_object(sender, instance, **kwargs):
     else:
     else:
         return
         return
 
 
-    # Record an ObjectChange if applicable
-    if m2m_changed:
-        ObjectChange.objects.filter(
+    # Create/update an ObejctChange record for this change
+    objectchange = instance.to_objectchange(action)
+    # If this is a many-to-many field change, check for a previous ObjectChange instance recorded
+    # for this object by this request and update it
+    if m2m_changed and (
+        prev_change := ObjectChange.objects.filter(
             changed_object_type=ContentType.objects.get_for_model(instance),
             changed_object_type=ContentType.objects.get_for_model(instance),
             changed_object_id=instance.pk,
             changed_object_id=instance.pk,
             request_id=request.id
             request_id=request.id
-        ).update(
-            postchange_data=instance.to_objectchange(action).postchange_data
-        )
-    else:
-        objectchange = instance.to_objectchange(action)
-        if objectchange and objectchange.has_changes:
-            objectchange.user = request.user
-            objectchange.request_id = request.id
-            objectchange.save()
+        ).first()
+    ):
+        prev_change.postchange_data = objectchange.postchange_data
+        prev_change.save()
+    elif objectchange and objectchange.has_changes:
+        objectchange.user = request.user
+        objectchange.request_id = request.id
+        objectchange.save()
 
 
     # If this is an M2M change, update the previously queued webhook (from post_save)
     # If this is an M2M change, update the previously queued webhook (from post_save)
     queue = events_queue.get()
     queue = events_queue.get()