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