From 0ebc2e4ac0e43578de482e42dd7a95c2f552abfc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 22 Oct 2019 16:12:25 -0400 Subject: [PATCH] Fix reporting of custom fields in webhook data on object deletion --- netbox/extras/api/customfields.py | 12 ++++++------ netbox/extras/middleware.py | 9 +++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/netbox/extras/api/customfields.py b/netbox/extras/api/customfields.py index 2cdb79f8b..42dc486b8 100644 --- a/netbox/extras/api/customfields.py +++ b/netbox/extras/api/customfields.py @@ -97,13 +97,13 @@ class CustomFieldModelSerializer(ValidatedModelSerializer): def __init__(self, *args, **kwargs): def _populate_custom_fields(instance, fields): - custom_fields = {f.name: None for f in fields} - for cfv in instance.custom_field_values.all(): - if cfv.field.type == CF_TYPE_SELECT: - custom_fields[cfv.field.name] = CustomFieldChoiceSerializer(cfv.value).data + instance.custom_fields = {} + for field in fields: + value = instance.cf.get(field.name) + if field.type == CF_TYPE_SELECT and value is not None: + instance.custom_fields[field.name] = CustomFieldChoiceSerializer(value).data else: - custom_fields[cfv.field.name] = cfv.value - instance.custom_fields = custom_fields + instance.custom_fields[field.name] = value super().__init__(*args, **kwargs) diff --git a/netbox/extras/middleware.py b/netbox/extras/middleware.py index 7f108c8ed..57f8f37d1 100644 --- a/netbox/extras/middleware.py +++ b/netbox/extras/middleware.py @@ -22,7 +22,7 @@ def handle_changed_object(sender, instance, **kwargs): """ Fires when an object is created or updated. """ - # Queue a copy of the object for processing once the request completes + # Queue the object for processing once the request completes action = OBJECTCHANGE_ACTION_CREATE if kwargs['created'] else OBJECTCHANGE_ACTION_UPDATE _thread_locals.changed_objects.append( (instance, action) @@ -44,7 +44,7 @@ def handle_deleted_object(sender, instance, **kwargs): if hasattr(instance, 'tags'): copy.tags = DummyQuerySet(instance.tags.all()) - # Queue a copy of the object for processing once the request completes + # Queue the copy of the object for processing once the request completes _thread_locals.changed_objects.append( (copy, OBJECTCHANGE_ACTION_DELETE) ) @@ -100,6 +100,11 @@ class ObjectChangeMiddleware(object): # Create records for any cached objects that were changed. for instance, action in _thread_locals.changed_objects: + # Refresh cached custom field values + if action in [OBJECTCHANGE_ACTION_CREATE, OBJECTCHANGE_ACTION_UPDATE]: + if hasattr(instance, 'cache_custom_fields'): + instance.cache_custom_fields() + # Record an ObjectChange if applicable if hasattr(instance, 'to_objectchange'): objectchange = instance.to_objectchange(action)