Source code for library_sample_shared.serializers

from rest_framework.serializers import (
    ModelSerializer,
    ListSerializer,
    SerializerMethodField,
)

from .models import (
    Organism,
    ReadLength,
    IndexType,
    LibraryProtocol,
    LibraryType,
    IndexI7,
    IndexI5,
    ConcentrationMethod,
)


class OrganismSerializer(ModelSerializer):
    class Meta:
        model = Organism
        fields = ('id', 'name')


class ReadLengthSerializer(ModelSerializer):
    class Meta:
        model = ReadLength
        fields = ('id', 'name','obsolete')


class ConcentrationMethodSerializer(ModelSerializer):
    class Meta:
        model = ConcentrationMethod
        fields = ('id', 'name')


class IndexTypeSerializer(ModelSerializer):
    index_reads = SerializerMethodField()
    index_length = SerializerMethodField()

    class Meta:
        model = IndexType
        fields = ('id', 'name', 'index_reads', 'is_dual', 'format',
                  'index_length', 'obsolete', 'read_type')

    def get_index_reads(self, obj):
        return 2 if obj.is_dual else 1

    def get_index_length(self, obj):
        return int(obj.get_index_length_display())


class IndexBaseSerializer(ModelSerializer):
    name = SerializerMethodField()

    class Meta:
        fields = ('id', 'name', 'prefix', 'number', 'index_id', 'index',)

    def get_name(self, obj):
        return '%s - %s' % (obj.index_id, obj.index)


class IndexI7Serializer(IndexBaseSerializer):
    class Meta(IndexBaseSerializer.Meta):
        model = IndexI7


class IndexI5Serializer(IndexBaseSerializer):
    class Meta(IndexBaseSerializer.Meta):
        model = IndexI5


class LibraryProtocolSerializer(ModelSerializer):
    class Meta:
        model = LibraryProtocol
        fields = '__all__'


class LibraryTypeSerializer(ModelSerializer):
    library_protocol = SerializerMethodField()

    class Meta:
        model = LibraryType
        fields = ('id', 'name', 'library_protocol')

    def get_library_protocol(self, obj):
        return LibraryType.objects.filter(pk=obj.pk).values_list(
            'library_protocol__id', flat=True)


class LibrarySampleBaseListSerializer(ListSerializer):

    def update(self, instance, validated_data):
        # Maps for id->instance and id->data item.
        object_mapping = {obj.pk: obj for obj in instance}
        data_mapping = {item['pk']: item for item in validated_data}

        # Perform updates
        ret = []
        for obj_id, data in data_mapping.items():
            obj = object_mapping.get(obj_id, None)
            if obj is not None:
                ret.append(self.child.update(obj, data))
        return ret

    # def delete(self, instance):
    #     pass


class LibrarySampleBaseSerializer(ModelSerializer):
    request_id = SerializerMethodField()
    request_name = SerializerMethodField()
    library_protocol_name = SerializerMethodField()
    library_type_name = SerializerMethodField()
    concentration_method_name = SerializerMethodField()
    read_length_name = SerializerMethodField()
    organism_name = SerializerMethodField()

    class Meta:
        list_serializer_class = LibrarySampleBaseListSerializer
        fields = ('request_id', 'request_name', 'name', 'barcode', 'status',
                  'create_time', 'library_protocol', 'library_protocol_name',
                  'library_type', 'library_type_name', 'organism',
                  'equal_representation_nucleotides', 'concentration',
                  'concentration_method', 'read_length', 'read_length_name',
                  'sequencing_depth', 'comments', 'amplification_cycles',
                  'organism_name',)
        extra_kwargs = {'barcode': {'required': False}}

    def get_request_id(self, obj):
        return obj.request.get().pk

    def get_request_name(self, obj):
        return obj.request.get().name

    def get_library_protocol_name(self, obj):
        return obj.library_protocol.name

    def get_library_type_name(self, obj):
        return obj.library_type.name

    def get_concentration_method_name(self, obj):
        return obj.concentration_method.name

    def get_read_length_name(self, obj):
        return obj.read_length.name

    def get_organism_name(self, obj):
        return obj.organism.name