customfields.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from django.contrib.contenttypes.models import ContentType
  2. from rest_framework import serializers
  3. from extras.models import CF_TYPE_SELECT, CustomField, CustomFieldChoice, CustomFieldValue
  4. #
  5. # Custom fields
  6. #
  7. class CustomFieldsSerializer(serializers.BaseSerializer):
  8. def to_representation(self, obj):
  9. return obj
  10. class CustomFieldModelSerializer(serializers.ModelSerializer):
  11. """
  12. Extends ModelSerializer to render any CustomFields and their values associated with an object.
  13. """
  14. custom_fields = CustomFieldsSerializer()
  15. def __init__(self, *args, **kwargs):
  16. super(CustomFieldModelSerializer, self).__init__(*args, **kwargs)
  17. # Retrieve the set of CustomFields which apply to this type of object
  18. content_type = ContentType.objects.get_for_model(self.Meta.model)
  19. custom_fields = {f.name: None for f in CustomField.objects.filter(obj_type=content_type)}
  20. # Assign CustomFieldValues from database
  21. for cfv in self.instance.custom_field_values.all():
  22. if cfv.field.type == CF_TYPE_SELECT:
  23. custom_fields[cfv.field.name] = CustomFieldChoiceSerializer(cfv.value).data
  24. else:
  25. custom_fields[cfv.field.name] = cfv.value
  26. self.instance.custom_fields = custom_fields
  27. class CustomFieldChoiceSerializer(serializers.ModelSerializer):
  28. """
  29. Imitate utilities.api.ChoiceFieldSerializer
  30. """
  31. value = serializers.IntegerField(source='pk')
  32. label = serializers.CharField(source='value')
  33. class Meta:
  34. model = CustomFieldChoice
  35. fields = ['value', 'label']