change_logging.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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 users.api.serializers_.users import UserSerializer
  9. from utilities.api import get_serializer_for_model
  10. __all__ = (
  11. 'ObjectChangeSerializer',
  12. )
  13. class ObjectChangeSerializer(BaseModelSerializer):
  14. url = serializers.HyperlinkedIdentityField(view_name='extras-api:objectchange-detail')
  15. user = UserSerializer(
  16. nested=True,
  17. read_only=True
  18. )
  19. action = ChoiceField(
  20. choices=ObjectChangeActionChoices,
  21. read_only=True
  22. )
  23. changed_object_type = ContentTypeField(
  24. read_only=True
  25. )
  26. changed_object = serializers.SerializerMethodField(
  27. read_only=True
  28. )
  29. prechange_data = serializers.JSONField(
  30. source='prechange_data_clean',
  31. read_only=True,
  32. allow_null=True
  33. )
  34. postchange_data = serializers.JSONField(
  35. source='postchange_data_clean',
  36. read_only=True,
  37. allow_null=True
  38. )
  39. class Meta:
  40. model = ObjectChange
  41. fields = [
  42. 'id', 'url', 'display', 'time', 'user', 'user_name', 'request_id', 'action', 'changed_object_type',
  43. 'changed_object_id', 'changed_object', 'prechange_data', 'postchange_data',
  44. ]
  45. @extend_schema_field(serializers.JSONField(allow_null=True))
  46. def get_changed_object(self, obj):
  47. """
  48. Serialize a nested representation of the changed object.
  49. """
  50. if obj.changed_object is None:
  51. return None
  52. try:
  53. serializer = get_serializer_for_model(obj.changed_object)
  54. except SerializerNotFound:
  55. return obj.object_repr
  56. data = serializer(obj.changed_object, nested=True, context={'request': self.context['request']}).data
  57. return data