Просмотр исходного кода

Merge pull request #20026 from netbox-community/19998-fixes-missing-changelog-cleared-tags

Fixes: #19998 - Add changelog entry when clearing M2M fields
bctiemann 6 месяцев назад
Родитель
Сommit
2d495d4f32
1 измененных файлов с 12 добавлено и 0 удалено
  1. 12 0
      netbox/core/signals.py

+ 12 - 0
netbox/core/signals.py

@@ -13,6 +13,7 @@ from django_prometheus.models import model_deletes, model_inserts, model_updates
 from core.choices import JobStatusChoices, ObjectChangeActionChoices
 from core.choices import JobStatusChoices, ObjectChangeActionChoices
 from core.events import *
 from core.events import *
 from extras.events import enqueue_event
 from extras.events import enqueue_event
+from extras.models import Tag
 from extras.utils import run_validators
 from extras.utils import run_validators
 from netbox.config import get_config
 from netbox.config import get_config
 from netbox.context import current_request, events_queue
 from netbox.context import current_request, events_queue
@@ -72,6 +73,17 @@ def handle_changed_object(sender, instance, **kwargs):
         # m2m_changed with objects added or removed
         # m2m_changed with objects added or removed
         m2m_changed = True
         m2m_changed = True
         event_type = OBJECT_UPDATED
         event_type = OBJECT_UPDATED
+    elif kwargs.get('action') == 'post_clear':
+        # Handle clearing of an M2M field
+        if kwargs.get('model') == Tag and getattr(instance, '_prechange_snapshot', {}).get('tags'):
+            # Handle generation of M2M changes for Tags which have a previous value (ignoring changes where the
+            # prechange snapshot is empty)
+            m2m_changed = True
+            event_type = OBJECT_UPDATED
+        else:
+            # Other endpoints are unimpacted as they send post_add and post_remove
+            # This will impact changes that utilize clear() however so we may want to give consideration for this branch
+            return
     else:
     else:
         return
         return