customfields.py 1.4 KB

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