|
|
@@ -1,8 +1,12 @@
|
|
|
+from django.contrib.contenttypes.models import ContentType
|
|
|
from django.core.exceptions import FieldError, MultipleObjectsReturned, ObjectDoesNotExist
|
|
|
from django.db.models import ManyToManyField
|
|
|
from rest_framework import serializers
|
|
|
from rest_framework.exceptions import ValidationError
|
|
|
+from rest_framework.fields import CreateOnlyDefault
|
|
|
|
|
|
+from extras.api.customfields import CustomFieldsDataField, CustomFieldDefaultValues
|
|
|
+from extras.models import CustomField
|
|
|
from utilities.utils import dict_to_filter_params
|
|
|
|
|
|
|
|
|
@@ -35,10 +39,45 @@ class ValidatedModelSerializer(serializers.ModelSerializer):
|
|
|
return data
|
|
|
|
|
|
|
|
|
-class OrganizationalModelSerializer(ValidatedModelSerializer):
|
|
|
+class CustomFieldModelSerializer(ValidatedModelSerializer):
|
|
|
+ """
|
|
|
+ Extends ModelSerializer to render any CustomFields and their values associated with an object.
|
|
|
+ """
|
|
|
+ custom_fields = CustomFieldsDataField(
|
|
|
+ source='custom_field_data',
|
|
|
+ default=CreateOnlyDefault(CustomFieldDefaultValues())
|
|
|
+ )
|
|
|
+
|
|
|
+ def __init__(self, *args, **kwargs):
|
|
|
+ super().__init__(*args, **kwargs)
|
|
|
+
|
|
|
+ if self.instance is not None:
|
|
|
+
|
|
|
+ # Retrieve the set of CustomFields which apply to this type of object
|
|
|
+ content_type = ContentType.objects.get_for_model(self.Meta.model)
|
|
|
+ fields = CustomField.objects.filter(content_types=content_type)
|
|
|
+
|
|
|
+ # Populate CustomFieldValues for each instance from database
|
|
|
+ if type(self.instance) in (list, tuple):
|
|
|
+ for obj in self.instance:
|
|
|
+ self._populate_custom_fields(obj, fields)
|
|
|
+ else:
|
|
|
+ self._populate_custom_fields(self.instance, fields)
|
|
|
+
|
|
|
+ def _populate_custom_fields(self, instance, custom_fields):
|
|
|
+ instance.custom_fields = {}
|
|
|
+ for field in custom_fields:
|
|
|
+ instance.custom_fields[field.name] = instance.cf.get(field.name)
|
|
|
+
|
|
|
+
|
|
|
+class OrganizationalModelSerializer(CustomFieldModelSerializer):
|
|
|
pass
|
|
|
|
|
|
|
|
|
+class NestedGroupModelSerializer(CustomFieldModelSerializer):
|
|
|
+ _depth = serializers.IntegerField(source='level', read_only=True)
|
|
|
+
|
|
|
+
|
|
|
class WritableNestedSerializer(serializers.ModelSerializer):
|
|
|
"""
|
|
|
Returns a nested representation of an object on read, but accepts only a primary key on write.
|