From 31fb6961e96fc6072cd9eeca2eab459c3dfcd3d9 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Mon, 5 Feb 2024 06:52:10 -0800 Subject: [PATCH] 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 --- netbox/extras/signals.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index d1b20961a..4c15e839a 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -68,21 +68,23 @@ def handle_changed_object(sender, instance, **kwargs): else: 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_id=instance.pk, 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) queue = events_queue.get()