Skip to content
Snippets Groups Projects
serializers.py 7.4 KiB
Newer Older
# Serializers define the API representation.
import json
from rest_framework import serializers
from drugstone import models
from drugstone.models import Protein, Task, Drug, ProteinDrugInteraction, \
    Tissue, ProteinProteinInteraction, Network, ProteinDisorderAssociation, Disorder, DrugDisorderIndication


class PDIDatasetSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.PDIDataset
        fields = '__all__'


class PPIDatasetSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.PPIDataset
        fields = '__all__'

AndiMajore's avatar
AndiMajore committed
class PDisDatasetSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.PDisDataset
        fields = '__all__'


class DrDisDatasetSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.DrDiDataset
        fields = '__all__'

AndiMajore's avatar
AndiMajore committed
class ProteinNodeSerializer(serializers.ModelSerializer):
    drugstone_id = serializers.SerializerMethodField()
    uniprot = serializers.SerializerMethodField()
AndiMajore's avatar
AndiMajore committed
    symbol = serializers.SerializerMethodField()
    ensg = serializers.SerializerMethodField()
    entrez = serializers.SerializerMethodField()

    def get_drugstone_id(self, obj):
        return [f'p{obj.id}']

    def get_uniprot(self, obj):
AndiMajore's avatar
AndiMajore committed
        return [obj.uniprot_code]

    def get_symbol(self, obj):
        return [obj.gene]

    def get_entrez(self,obj):
        return [obj.entrez]

    def get_ensg(self, obj) -> str:
        """Since ENSG has a many to one relationship to the Protein table,
        return a list of all matching ensg names.

        Args:
            obj (Protein): Protein object

        Returns:
            str: list of all matching ENSG numbers
        """
        return [x.name for x in obj.ensg.all()]

    class Meta:
        model = Protein
        fields = ['drugstone_id', 'uniprot', 'symbol', 'protein_name', 'entrez', 'ensg']

class ProteinSerializer(serializers.ModelSerializer):
    drugstone_id = serializers.SerializerMethodField()
    uniprot = serializers.SerializerMethodField()
    symbol = serializers.SerializerMethodField()
    ensg = serializers.SerializerMethodField()

    def get_drugstone_id(self, obj):
        return f'p{obj.id}'

    def get_uniprot(self, obj):
        return obj.uniprot_code

    def get_symbol(self, obj):
        return obj.gene

    def get_ensg(self, obj) -> str:
        """Since ENSG has a many to one relationship to the Protein table,
        return a list of all matching ensg names.

        Args:
            obj (Protein): Protein object

        Returns:
            str: list of all matching ENSG numbers
        """
        return [x.name for x in obj.ensg.all()]

    class Meta:
        model = Protein
        fields = ['drugstone_id', 'uniprot', 'symbol', 'protein_name', 'entrez', 'ensg']


class DrugSerializer(serializers.ModelSerializer):
    drugstone_id = serializers.SerializerMethodField()
    trial_links = serializers.SerializerMethodField()
    label = serializers.SerializerMethodField()

    def get_drugstone_id(self, obj):
        return f'dr{obj.id}'

    def get_trial_links(self, obj):
        return [] if obj.links == '' else obj.links.split(';')

    def get_label(self, obj):
        return obj.name

    class Meta:
        model = Drug
        fields = ['drugstone_id', 'drug_id', 'label', 'status', 'trial_links']


class DisorderSerializer(serializers.ModelSerializer):
    drugstone_id = serializers.SerializerMethodField()
    icd_10 = serializers.SerializerMethodField()
    disorder_id = serializers.SerializerMethodField()

    def get_drugstone_id(self, obj):
        return f'di{obj.id}'

    def get_icd_10(self, obj):
        return obj.icd10[1:len(obj.icd10)-1].split(',')

    def get_disorder_id(self, obj):
        return obj.mondo_id

    class Meta:
        model = Disorder
        fields = ['drugstone_id', 'label', 'icd_10', 'disorder_id']


class ProteinProteinInteractionSerializer(serializers.ModelSerializer):
    dataset = serializers.SerializerMethodField()
    protein_a = serializers.SerializerMethodField()
    protein_b = serializers.SerializerMethodField()

    def get_dataset(self, obj):
        return obj.ppi_dataset.name

    def get_protein_a(self, obj):
        return f'p{obj.from_protein.id}'

    def get_protein_b(self, obj):
        return f'p{obj.to_protein.id}'

    class Meta:
        model = ProteinProteinInteraction
        fields = ['dataset', 'protein_a', 'protein_b']


class ProteinDrugInteractionSerializer(serializers.ModelSerializer):
    dataset = serializers.SerializerMethodField()
    protein = serializers.SerializerMethodField()
    drug = serializers.SerializerMethodField()

    def get_dataset(self, obj):
        return obj.pdi_dataset.name

    def get_protein(self, obj):
        return f'p{obj.protein.id}'

    def get_drug(self, obj):
        return f'dr{obj.drug.id}'

    class Meta:
        model = ProteinDrugInteraction
        fields = ['dataset', 'protein', 'drug']


class ProteinDisorderAssociationSerializer(serializers.ModelSerializer):
    dataset = serializers.SerializerMethodField()
    protein = serializers.SerializerMethodField()
    disorder = serializers.SerializerMethodField()
    score = serializers.SerializerMethodField()

    def get_dataset(self, obj):
        return obj.pdis_dataset.name

    def get_protein(self, obj):
        return f'p{obj.protein.id}'

    def get_disorder(self, obj):
        return f'di{obj.disorder.id}'

    def get_score(self, obj):
        return float(obj.score)

    class Meta:
        model = ProteinDisorderAssociation
        fields = ['dataset', 'protein', 'disorder', 'score']


class DrugDisorderIndicationSerializer(serializers.ModelSerializer):
    dataset = serializers.SerializerMethodField()
    drug = serializers.SerializerMethodField()
    disorder = serializers.SerializerMethodField()

    def get_dataset(self, obj):
        return obj.drdi_dataset.name

    def get_drug(self, obj):
        return f'dr{obj.drug.id}'

    def get_disorder(self, obj):
        return f'di{obj.disorder.id}'

    class Meta:
        model = DrugDisorderIndication
        fields = ['dataset', 'drug', 'disorder']


class TaskSerializer(serializers.ModelSerializer):
    parameters = serializers.SerializerMethodField()

    def get_parameters(self, obj):
        return json.loads(obj.parameters)

    class Meta:
        model = Task
        fields = ['algorithm', 'target', 'parameters', 'job_id', 'worker_id', 'progress', 'status', 'created_at',
                  'started_at', 'finished_at', 'done', 'failed']


class NetworkSerializer(serializers.ModelSerializer):
    # nodes = serializers.SerializerMethodField()
    # edges = serializers.SerializerMethodField()
    # config = serializers.SerializerMethodField()

    class Meta:
        model = Network
        fields = '__all__'

#    def get_nodes(self,obj):
#        return json.loads(obj.nodes)
#
#    def get_edges(self,obj):
#        return json.loads(obj.edges)
#
#    def get_config(self,obj):
#        return json.loads(obj.config)


class TaskStatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ['algorithm', 'target', 'progress', 'status', 'created_at', 'started_at', 'finished_at', 'done',
                  'failed']


class TissueSerializer(serializers.ModelSerializer):
    drugstone_id = serializers.SerializerMethodField()

    def get_drugstone_id(self, obj):
        return f'{obj.id}'

    class Meta:
        model = Tissue
        fields = ['drugstone_id', 'name']