serializers.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from django.contrib.contenttypes.models import ContentType
  2. from rest_framework import serializers
  3. from extras.models import CustomField, CustomFieldChoice, Graph
  4. class CustomFieldSerializer(serializers.BaseSerializer):
  5. """
  6. Extends ModelSerializer to render any CustomFields and their values associated with an object.
  7. """
  8. def to_representation(self, manager):
  9. # Initialize custom fields dictionary
  10. data = {f.name: None for f in self.parent._custom_fields}
  11. # Assign CustomFieldValues from database
  12. for cfv in manager.all():
  13. data[cfv.field.name] = cfv.value
  14. return data
  15. class CustomFieldModelSerializer(serializers.ModelSerializer):
  16. custom_fields = CustomFieldSerializer(source='custom_field_values')
  17. def __init__(self, *args, **kwargs):
  18. super(CustomFieldModelSerializer, self).__init__(*args, **kwargs)
  19. # Cache the list of custom fields for this model
  20. content_type = ContentType.objects.get_for_model(self.Meta.model)
  21. self._custom_fields = CustomField.objects.filter(obj_type=content_type)
  22. class CustomFieldChoiceSerializer(serializers.ModelSerializer):
  23. class Meta:
  24. model = CustomFieldChoice
  25. fields = ['id', 'value']
  26. class GraphSerializer(serializers.ModelSerializer):
  27. embed_url = serializers.SerializerMethodField()
  28. embed_link = serializers.SerializerMethodField()
  29. class Meta:
  30. model = Graph
  31. fields = ['name', 'embed_url', 'embed_link']
  32. def get_embed_url(self, obj):
  33. return obj.embed_url(self.context['graphed_object'])
  34. def get_embed_link(self, obj):
  35. return obj.embed_link(self.context['graphed_object'])