def create_serializer_class()

in django_airavata/apps/api/thrift_utils.py [0:0]


def create_serializer_class(thrift_data_type, enable_date_time_conversion=False):
    class CustomSerializerMeta(SerializerMetaclass):

        def __new__(cls, name, bases, attrs):
            meta = attrs.get('Meta', None)
            thrift_spec = thrift_data_type.thrift_spec
            for field in thrift_spec:
                # Don't replace existing attrs to allow subclasses to override
                if field and field[2] not in attrs:
                    required = (field[2] in meta.required
                                if meta and hasattr(meta, 'required')
                                else False)
                    read_only = (field[2] in meta.read_only
                                 if meta and hasattr(meta, 'read_only')
                                 else False)
                    allow_null = not required
                    field_serializer = process_field(
                        field, enable_date_time_conversion, required=required, read_only=read_only,
                        allow_null=allow_null)
                    attrs[field[2]] = field_serializer
            return super().__new__(cls, name, bases, attrs)

    class CustomSerializer(Serializer, metaclass=CustomSerializerMeta):
        """
        Custom Serializer which handle the list fields which holds custom class objects
        """

        def process_nested_fields(self, validated_data):
            fields = self.fields
            params = copy.deepcopy(validated_data)
            for field_name, serializer in fields.items():
                if (isinstance(serializer, ListField) or
                        isinstance(serializer, ListSerializer)):
                    if (params.get(field_name, None) is not None or
                            not serializer.allow_null):
                        if isinstance(serializer.child, Serializer):
                            params[field_name] = [serializer.child.create(
                                item) for item in params[field_name]]
                        else:
                            params[field_name] = serializer.to_representation(
                                params[field_name])
                elif isinstance(serializer, Serializer):
                    if field_name in params and params[field_name] is not None:
                        params[field_name] = serializer.create(
                            params[field_name])
            return params

        def create(self, validated_data):
            params = self.process_nested_fields(validated_data)
            return thrift_data_type(**params)

        def update(self, instance, validated_data):
            return self.create(validated_data)

    return CustomSerializer