Skip to content

Commit ac26665

Browse files
committed
Add REST API support for changelog messages (WIP)
1 parent f600429 commit ac26665

File tree

4 files changed

+44
-7
lines changed

4 files changed

+44
-7
lines changed

netbox/netbox/api/serializers/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010
# Base model serializers
1111
#
1212

13-
class NetBoxModelSerializer(TaggableModelSerializer, CustomFieldModelSerializer, ValidatedModelSerializer):
13+
class NetBoxModelSerializer(
14+
ChangeLogMessageSerializer,
15+
TaggableModelSerializer,
16+
CustomFieldModelSerializer,
17+
ValidatedModelSerializer
18+
):
1419
"""
1520
Adds support for custom fields and tags.
1621
"""
@@ -24,5 +29,5 @@ class NestedGroupModelSerializer(NetBoxModelSerializer):
2429
_depth = serializers.IntegerField(source='level', read_only=True)
2530

2631

27-
class BulkOperationSerializer(serializers.Serializer):
32+
class BulkOperationSerializer(ChangeLogMessageSerializer):
2833
id = serializers.IntegerField()

netbox/netbox/api/serializers/features.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .nested import NestedTagSerializer
66

77
__all__ = (
8+
'ChangeLogMessageSerializer',
89
'CustomFieldModelSerializer',
910
'TaggableModelSerializer',
1011
)
@@ -54,3 +55,22 @@ def _save_tags(self, instance, tags):
5455
instance.tags.clear()
5556

5657
return instance
58+
59+
60+
class ChangeLogMessageSerializer(serializers.Serializer):
61+
changelog_message = serializers.CharField(write_only=True)
62+
63+
def to_internal_value(self, data):
64+
ret = super().to_internal_value(data)
65+
66+
# Workaround to bypass requirement to include changelog_message in Meta.fields on every serializer
67+
if 'changelog_message' in data and 'changelog_message' not in ret:
68+
# TODO: Validation
69+
ret['changelog_message'] = data['changelog_message']
70+
71+
return ret
72+
73+
def save(self, **kwargs):
74+
if self.instance is not None:
75+
self.instance._changelog_message = self.validated_data.get('changelog_message')
76+
return super().save(**kwargs)

netbox/netbox/api/viewsets/__init__.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
from django_pglocks import advisory_lock
88
from netbox.constants import ADVISORY_LOCK_KEYS
99
from rest_framework import mixins as drf_mixins
10+
from rest_framework import status
1011
from rest_framework.response import Response
1112
from rest_framework.viewsets import GenericViewSet
1213

14+
from netbox.api.serializers.features import ChangeLogMessageSerializer
1315
from utilities.api import get_annotations_for_serializer, get_prefetches_for_serializer
1416
from utilities.exceptions import AbortRequest
1517
from utilities.query import reapply_model_ordering
@@ -199,9 +201,16 @@ def perform_update(self, serializer):
199201
# Deletes
200202

201203
def destroy(self, request, *args, **kwargs):
202-
# Hotwire get_object() to ensure we save a pre-change snapshot
203-
self.get_object = self.get_object_with_snapshot
204-
return super().destroy(request, *args, **kwargs)
204+
instance = self.get_object_with_snapshot()
205+
206+
# Attach changelog message (if any)
207+
serializer = ChangeLogMessageSerializer(data=request.data)
208+
serializer.is_valid(raise_exception=True)
209+
instance._changelog_message = serializer.validated_data.get('changelog_message')
210+
211+
self.perform_destroy(instance)
212+
213+
return Response(status=status.HTTP_204_NO_CONTENT)
205214

206215
def perform_destroy(self, instance):
207216
model = self.queryset.model

netbox/netbox/models/features.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,14 @@ class ChangeLoggingMixin(DeleteMixin, models.Model):
6363
null=True
6464
)
6565

66-
_changelog_message = None
67-
6866
class Meta:
6967
abstract = True
7068

69+
def __init__(self, *args, **kwargs):
70+
changelog_message = kwargs.pop('changelog_message', None)
71+
super().__init__(*args, **kwargs)
72+
self._changelog_message = changelog_message
73+
7174
def serialize_object(self, exclude=None):
7275
"""
7376
Return a JSON representation of the instance. Models can override this method to replace or extend the default

0 commit comments

Comments
 (0)