serializers.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. from rest_framework import serializers
  2. from django.core.exceptions import ObjectDoesNotExist
  3. from dcim.api.serializers import NestedDeviceSerializer, NestedRackSerializer, NestedSiteSerializer
  4. from dcim.models import Device, Rack, Site
  5. from extras.models import (
  6. ACTION_CHOICES, ExportTemplate, Graph, GRAPH_TYPE_CHOICES, ImageAttachment, TopologyMap, UserAction,
  7. )
  8. from users.api.serializers import NestedUserSerializer
  9. from utilities.api import ChoiceFieldSerializer, ContentTypeFieldSerializer
  10. #
  11. # Graphs
  12. #
  13. class GraphSerializer(serializers.ModelSerializer):
  14. type = ChoiceFieldSerializer(choices=GRAPH_TYPE_CHOICES)
  15. class Meta:
  16. model = Graph
  17. fields = ['id', 'type', 'weight', 'name', 'source', 'link']
  18. class WritableGraphSerializer(serializers.ModelSerializer):
  19. class Meta:
  20. model = Graph
  21. fields = ['id', 'type', 'weight', 'name', 'source', 'link']
  22. class RenderedGraphSerializer(serializers.ModelSerializer):
  23. embed_url = serializers.SerializerMethodField()
  24. embed_link = serializers.SerializerMethodField()
  25. type = ChoiceFieldSerializer(choices=GRAPH_TYPE_CHOICES)
  26. class Meta:
  27. model = Graph
  28. fields = ['id', 'type', 'weight', 'name', 'embed_url', 'embed_link']
  29. def get_embed_url(self, obj):
  30. return obj.embed_url(self.context['graphed_object'])
  31. def get_embed_link(self, obj):
  32. return obj.embed_link(self.context['graphed_object'])
  33. #
  34. # Export templates
  35. #
  36. class ExportTemplateSerializer(serializers.ModelSerializer):
  37. class Meta:
  38. model = ExportTemplate
  39. fields = ['id', 'content_type', 'name', 'description', 'template_code', 'mime_type', 'file_extension']
  40. #
  41. # Topology maps
  42. #
  43. class TopologyMapSerializer(serializers.ModelSerializer):
  44. site = NestedSiteSerializer()
  45. class Meta:
  46. model = TopologyMap
  47. fields = ['id', 'name', 'slug', 'site', 'device_patterns', 'description']
  48. class WritableTopologyMapSerializer(serializers.ModelSerializer):
  49. class Meta:
  50. model = TopologyMap
  51. fields = ['id', 'name', 'slug', 'site', 'device_patterns', 'description']
  52. #
  53. # Image attachments
  54. #
  55. class ImageAttachmentSerializer(serializers.ModelSerializer):
  56. parent = serializers.SerializerMethodField()
  57. class Meta:
  58. model = ImageAttachment
  59. fields = ['id', 'parent', 'name', 'image', 'image_height', 'image_width', 'created']
  60. def get_parent(self, obj):
  61. # Static mapping of models to their nested serializers
  62. if isinstance(obj.parent, Device):
  63. serializer = NestedDeviceSerializer
  64. elif isinstance(obj.parent, Rack):
  65. serializer = NestedRackSerializer
  66. elif isinstance(obj.parent, Site):
  67. serializer = NestedSiteSerializer
  68. else:
  69. raise Exception("Unexpected type of parent object for ImageAttachment")
  70. return serializer(obj.parent, context={'request': self.context['request']}).data
  71. class WritableImageAttachmentSerializer(serializers.ModelSerializer):
  72. content_type = ContentTypeFieldSerializer()
  73. class Meta:
  74. model = ImageAttachment
  75. fields = ['id', 'content_type', 'object_id', 'name', 'image']
  76. def validate(self, data):
  77. # Validate that the parent object exists
  78. try:
  79. data['content_type'].get_object_for_this_type(id=data['object_id'])
  80. except ObjectDoesNotExist:
  81. raise serializers.ValidationError(
  82. "Invalid parent object: {} ID {}".format(data['content_type'], data['object_id'])
  83. )
  84. return data
  85. #
  86. # User actions
  87. #
  88. class UserActionSerializer(serializers.ModelSerializer):
  89. user = NestedUserSerializer()
  90. action = ChoiceFieldSerializer(choices=ACTION_CHOICES)
  91. class Meta:
  92. model = UserAction
  93. fields = ['id', 'time', 'user', 'action', 'message']