2
0

change_logging.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from drf_spectacular.utils import extend_schema_field
  2. from rest_framework import serializers
  3. from extras.choices import *
  4. from extras.models import ObjectChange
  5. from netbox.api.exceptions import SerializerNotFound
  6. from netbox.api.fields import ChoiceField, ContentTypeField
  7. from netbox.api.serializers import BaseModelSerializer
  8. from netbox.constants import NESTED_SERIALIZER_PREFIX
  9. from users.api.serializers_.users import UserSerializer
  10. from utilities.api import get_serializer_for_model
  11. __all__ = (
  12. 'ObjectChangeSerializer',
  13. )
  14. class ObjectChangeSerializer(BaseModelSerializer):
  15. url = serializers.HyperlinkedIdentityField(view_name='extras-api:objectchange-detail')
  16. user = UserSerializer(
  17. nested=True,
  18. read_only=True
  19. )
  20. action = ChoiceField(
  21. choices=ObjectChangeActionChoices,
  22. read_only=True
  23. )
  24. changed_object_type = ContentTypeField(
  25. read_only=True
  26. )
  27. changed_object = serializers.SerializerMethodField(
  28. read_only=True
  29. )
  30. class Meta:
  31. model = ObjectChange
  32. fields = [
  33. 'id', 'url', 'display', 'time', 'user', 'user_name', 'request_id', 'action', 'changed_object_type',
  34. 'changed_object_id', 'changed_object', 'prechange_data', 'postchange_data',
  35. ]
  36. @extend_schema_field(serializers.JSONField(allow_null=True))
  37. def get_changed_object(self, obj):
  38. """
  39. Serialize a nested representation of the changed object.
  40. """
  41. if obj.changed_object is None:
  42. return None
  43. try:
  44. serializer = get_serializer_for_model(obj.changed_object, prefix=NESTED_SERIALIZER_PREFIX)
  45. except SerializerNotFound:
  46. return obj.object_repr
  47. context = {
  48. 'request': self.context['request']
  49. }
  50. data = serializer(obj.changed_object, context=context).data
  51. return data