ソースを参照

Closes #21303: Cache serialized post-change data on object (#21325)

* Closes #21303: Cache serialized post-change data on object

* Set to_objectchange.alters_data

* Restructure logic for determining post-change snapshot
Jeremy Stretch 2 週間 前
コミット
aa4a9da955
2 ファイル変更21 行追加11 行削除
  1. 18 10
      netbox/extras/events.py
  2. 3 1
      netbox/netbox/models/features.py

+ 18 - 10
netbox/extras/events.py

@@ -51,18 +51,26 @@ def serialize_for_event(instance):
 
 
 
 
 def get_snapshots(instance, event_type):
 def get_snapshots(instance, event_type):
-    snapshots = {
+    """
+    Return a dictionary of pre- and post-change snapshots for the given instance.
+    """
+    if event_type == OBJECT_DELETED:
+        # Post-change snapshot must be empty for deleted objects
+        postchange_snapshot = None
+    elif hasattr(instance, '_postchange_snapshot'):
+        # Use the cached post-change snapshot if one is available
+        postchange_snapshot = instance._postchange_snapshot
+    elif hasattr(instance, 'serialize_object'):
+        # Use model's serialize_object() method if defined
+        postchange_snapshot = instance.serialize_object()
+    else:
+        # Fall back to the serialize_object() utility function
+        postchange_snapshot = serialize_object(instance)
+
+    return {
         'prechange': getattr(instance, '_prechange_snapshot', None),
         'prechange': getattr(instance, '_prechange_snapshot', None),
-        'postchange': None,
+        'postchange': postchange_snapshot,
     }
     }
-    if event_type != OBJECT_DELETED:
-        # Use model's serialize_object() method if defined; fall back to serialize_object() utility function
-        if hasattr(instance, 'serialize_object'):
-            snapshots['postchange'] = instance.serialize_object()
-        else:
-            snapshots['postchange'] = serialize_object(instance)
-
-    return snapshots
 
 
 
 
 def enqueue_event(queue, instance, request, event_type):
 def enqueue_event(queue, instance, request, event_type):

+ 3 - 1
netbox/netbox/models/features.py

@@ -121,9 +121,11 @@ class ChangeLoggingMixin(DeleteMixin, models.Model):
         if hasattr(self, '_prechange_snapshot'):
         if hasattr(self, '_prechange_snapshot'):
             objectchange.prechange_data = self._prechange_snapshot
             objectchange.prechange_data = self._prechange_snapshot
         if action in (ObjectChangeActionChoices.ACTION_CREATE, ObjectChangeActionChoices.ACTION_UPDATE):
         if action in (ObjectChangeActionChoices.ACTION_CREATE, ObjectChangeActionChoices.ACTION_UPDATE):
-            objectchange.postchange_data = self.serialize_object(exclude=exclude)
+            self._postchange_snapshot = self.serialize_object(exclude=exclude)
+            objectchange.postchange_data = self._postchange_snapshot
 
 
         return objectchange
         return objectchange
+    to_objectchange.alters_data = True
 
 
 
 
 class CloningMixin(models.Model):
 class CloningMixin(models.Model):