mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-26 10:28:37 -06:00
Add REST API support for changelog messages (WIP)
This commit is contained in:
parent
f600429b7e
commit
ac26665f29
@ -10,7 +10,12 @@ from .nested import *
|
|||||||
# Base model serializers
|
# Base model serializers
|
||||||
#
|
#
|
||||||
|
|
||||||
class NetBoxModelSerializer(TaggableModelSerializer, CustomFieldModelSerializer, ValidatedModelSerializer):
|
class NetBoxModelSerializer(
|
||||||
|
ChangeLogMessageSerializer,
|
||||||
|
TaggableModelSerializer,
|
||||||
|
CustomFieldModelSerializer,
|
||||||
|
ValidatedModelSerializer
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Adds support for custom fields and tags.
|
Adds support for custom fields and tags.
|
||||||
"""
|
"""
|
||||||
@ -24,5 +29,5 @@ class NestedGroupModelSerializer(NetBoxModelSerializer):
|
|||||||
_depth = serializers.IntegerField(source='level', read_only=True)
|
_depth = serializers.IntegerField(source='level', read_only=True)
|
||||||
|
|
||||||
|
|
||||||
class BulkOperationSerializer(serializers.Serializer):
|
class BulkOperationSerializer(ChangeLogMessageSerializer):
|
||||||
id = serializers.IntegerField()
|
id = serializers.IntegerField()
|
||||||
|
@ -5,6 +5,7 @@ from extras.api.customfields import CustomFieldsDataField, CustomFieldDefaultVal
|
|||||||
from .nested import NestedTagSerializer
|
from .nested import NestedTagSerializer
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
|
'ChangeLogMessageSerializer',
|
||||||
'CustomFieldModelSerializer',
|
'CustomFieldModelSerializer',
|
||||||
'TaggableModelSerializer',
|
'TaggableModelSerializer',
|
||||||
)
|
)
|
||||||
@ -54,3 +55,22 @@ class TaggableModelSerializer(serializers.Serializer):
|
|||||||
instance.tags.clear()
|
instance.tags.clear()
|
||||||
|
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
|
|
||||||
|
class ChangeLogMessageSerializer(serializers.Serializer):
|
||||||
|
changelog_message = serializers.CharField(write_only=True)
|
||||||
|
|
||||||
|
def to_internal_value(self, data):
|
||||||
|
ret = super().to_internal_value(data)
|
||||||
|
|
||||||
|
# Workaround to bypass requirement to include changelog_message in Meta.fields on every serializer
|
||||||
|
if 'changelog_message' in data and 'changelog_message' not in ret:
|
||||||
|
# TODO: Validation
|
||||||
|
ret['changelog_message'] = data['changelog_message']
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def save(self, **kwargs):
|
||||||
|
if self.instance is not None:
|
||||||
|
self.instance._changelog_message = self.validated_data.get('changelog_message')
|
||||||
|
return super().save(**kwargs)
|
||||||
|
@ -7,9 +7,11 @@ from django.db.models import ProtectedError, RestrictedError
|
|||||||
from django_pglocks import advisory_lock
|
from django_pglocks import advisory_lock
|
||||||
from netbox.constants import ADVISORY_LOCK_KEYS
|
from netbox.constants import ADVISORY_LOCK_KEYS
|
||||||
from rest_framework import mixins as drf_mixins
|
from rest_framework import mixins as drf_mixins
|
||||||
|
from rest_framework import status
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.viewsets import GenericViewSet
|
from rest_framework.viewsets import GenericViewSet
|
||||||
|
|
||||||
|
from netbox.api.serializers.features import ChangeLogMessageSerializer
|
||||||
from utilities.api import get_annotations_for_serializer, get_prefetches_for_serializer
|
from utilities.api import get_annotations_for_serializer, get_prefetches_for_serializer
|
||||||
from utilities.exceptions import AbortRequest
|
from utilities.exceptions import AbortRequest
|
||||||
from utilities.query import reapply_model_ordering
|
from utilities.query import reapply_model_ordering
|
||||||
@ -199,9 +201,16 @@ class NetBoxModelViewSet(
|
|||||||
# Deletes
|
# Deletes
|
||||||
|
|
||||||
def destroy(self, request, *args, **kwargs):
|
def destroy(self, request, *args, **kwargs):
|
||||||
# Hotwire get_object() to ensure we save a pre-change snapshot
|
instance = self.get_object_with_snapshot()
|
||||||
self.get_object = self.get_object_with_snapshot
|
|
||||||
return super().destroy(request, *args, **kwargs)
|
# Attach changelog message (if any)
|
||||||
|
serializer = ChangeLogMessageSerializer(data=request.data)
|
||||||
|
serializer.is_valid(raise_exception=True)
|
||||||
|
instance._changelog_message = serializer.validated_data.get('changelog_message')
|
||||||
|
|
||||||
|
self.perform_destroy(instance)
|
||||||
|
|
||||||
|
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
def perform_destroy(self, instance):
|
def perform_destroy(self, instance):
|
||||||
model = self.queryset.model
|
model = self.queryset.model
|
||||||
|
@ -63,11 +63,14 @@ class ChangeLoggingMixin(DeleteMixin, models.Model):
|
|||||||
null=True
|
null=True
|
||||||
)
|
)
|
||||||
|
|
||||||
_changelog_message = None
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
changelog_message = kwargs.pop('changelog_message', None)
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self._changelog_message = changelog_message
|
||||||
|
|
||||||
def serialize_object(self, exclude=None):
|
def serialize_object(self, exclude=None):
|
||||||
"""
|
"""
|
||||||
Return a JSON representation of the instance. Models can override this method to replace or extend the default
|
Return a JSON representation of the instance. Models can override this method to replace or extend the default
|
||||||
|
Loading…
Reference in New Issue
Block a user