# 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__" class PDisDatasetSerializer(serializers.ModelSerializer): class Meta: model = models.PDisDataset fields = "__all__" class DrDisDatasetSerializer(serializers.ModelSerializer): class Meta: model = models.DrDiDataset fields = "__all__" class ProteinNodeSerializer(serializers.ModelSerializer): drugstone_id = serializers.SerializerMethodField() uniprot = serializers.SerializerMethodField() 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): 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"]