change_logging.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from drf_spectacular.utils import extend_schema_field
  2. from rest_framework import serializers
  3. from core.choices import *
  4. from core.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. user = UserSerializer(
  15. nested=True,
  16. read_only=True
  17. )
  18. action = ChoiceField(
  19. choices=ObjectChangeActionChoices,
  20. read_only=True
  21. )
  22. changed_object_type = ContentTypeField(
  23. read_only=True
  24. )
  25. changed_object = serializers.SerializerMethodField(
  26. read_only=True
  27. )
  28. prechange_data = serializers.JSONField(
  29. source='prechange_data_clean',
  30. read_only=True,
  31. allow_null=True
  32. )
  33. postchange_data = serializers.JSONField(
  34. source='postchange_data_clean',
  35. read_only=True,
  36. allow_null=True
  37. )
  38. class Meta:
  39. model = ObjectChange
  40. fields = [
  41. 'id', 'url', 'display_url', 'display', 'time', 'user', 'user_name', 'request_id', 'action',
  42. 'changed_object_type', 'changed_object_id', 'changed_object', 'prechange_data', 'postchange_data',
  43. ]
  44. @extend_schema_field(serializers.JSONField(allow_null=True))
  45. def get_changed_object(self, obj):
  46. """
  47. Serialize a nested representation of the changed object.
  48. """
  49. if obj.changed_object is None:
  50. return None
  51. try:
  52. serializer = get_serializer_for_model(obj.changed_object)
  53. except SerializerNotFound:
  54. return obj.object_repr
  55. data = serializer(obj.changed_object, nested=True, context={'request': self.context['request']}).data
  56. return data