serializers.py 3.9 KB

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