attachments.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from django.core.exceptions import ObjectDoesNotExist
  2. from drf_spectacular.utils import extend_schema_field
  3. from rest_framework import serializers
  4. from core.models import ContentType
  5. from extras.models import ImageAttachment
  6. from netbox.api.fields import ContentTypeField
  7. from netbox.api.serializers import ValidatedModelSerializer
  8. from utilities.api import get_serializer_for_model
  9. __all__ = (
  10. 'ImageAttachmentSerializer',
  11. )
  12. class ImageAttachmentSerializer(ValidatedModelSerializer):
  13. url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail')
  14. content_type = ContentTypeField(
  15. queryset=ContentType.objects.all()
  16. )
  17. parent = serializers.SerializerMethodField(read_only=True)
  18. class Meta:
  19. model = ImageAttachment
  20. fields = [
  21. 'id', 'url', 'display', 'content_type', 'object_id', 'parent', 'name', 'image', 'image_height',
  22. 'image_width', 'created', 'last_updated',
  23. ]
  24. brief_fields = ('id', 'url', 'display', 'name', 'image')
  25. def validate(self, data):
  26. # Validate that the parent object exists
  27. try:
  28. data['content_type'].get_object_for_this_type(id=data['object_id'])
  29. except ObjectDoesNotExist:
  30. raise serializers.ValidationError(
  31. "Invalid parent object: {} ID {}".format(data['content_type'], data['object_id'])
  32. )
  33. # Enforce model validation
  34. super().validate(data)
  35. return data
  36. @extend_schema_field(serializers.JSONField(allow_null=True))
  37. def get_parent(self, obj):
  38. serializer = get_serializer_for_model(obj.parent)
  39. context = {'request': self.context['request']}
  40. return serializer(obj.parent, nested=True, context=context).data