Skip to content

Commit

Permalink
issue #76 seqauto API step 1 - serializers/initial api
Browse files Browse the repository at this point in the history
  • Loading branch information
davmlaw committed Aug 26, 2024
1 parent 49d2b16 commit f5096bb
Show file tree
Hide file tree
Showing 15 changed files with 675 additions and 104 deletions.
31 changes: 26 additions & 5 deletions genes/serializers.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from rest_framework import serializers

from genes.models import GeneInfo, GeneListCategory, GeneList, Gene, Transcript, GeneListGeneSymbol, \
GeneAnnotationRelease, SampleGeneList, ActiveSampleGeneList, GeneSymbol, TranscriptVersion, GeneVersion, HGNC
GeneAnnotationRelease, SampleGeneList, ActiveSampleGeneList, GeneSymbol, TranscriptVersion, GeneVersion, HGNC, \
GeneCoverageCollection, GeneCoverageCanonicalTranscript
from snpdb.models import Company
from snpdb.serializers import UserSerializer, GenomeBuildSerializer
from snpdb.serializers import GenomeBuildSerializer


class GeneSymbolSerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -74,7 +75,7 @@ class Meta:

class GeneListSerializer(serializers.ModelSerializer):
category = GeneListCategorySerializer()
user = UserSerializer()
user = serializers.StringRelatedField()
genelistgenesymbol_set = GeneListGeneSymbolSerializer(many=True)
can_write = serializers.SerializerMethodField()
absolute_url = serializers.URLField(source='get_absolute_url', read_only=True)
Expand Down Expand Up @@ -131,14 +132,34 @@ class Meta:


class SampleGeneListSerializer(serializers.ModelSerializer):
active = serializers.SerializerMethodField()
active = serializers.SerializerMethodField(read_only=True)
gene_list = GeneListSerializer()

class Meta:
model = SampleGeneList
fields = ('pk', 'visible', 'active')
fields = ('pk', 'visible', 'gene_list', 'active')

def get_active(self, obj):
try:
return obj.sample.activesamplegenelist.sample_gene_list == obj
except ActiveSampleGeneList.DoesNotExist:
return False


class GeneCoverageCanonicalTranscriptSerializer(serializers.ModelSerializer):
transcript_version = TranscriptVersionSerializer()

class Meta:
model = GeneCoverageCanonicalTranscript
exclude = ("gene_coverage_collection", )
#fields = "__all__"


class GeneCoverageCollectionSerializer(serializers.ModelSerializer):
genome_build = GenomeBuildSerializer()
genecoveragecanonicaltranscript_set = GeneCoverageCanonicalTranscriptSerializer(many=True)

class Meta:
model = GeneCoverageCollection
# TODO: Check if "__all__" also does related automatically?
fields = ["path", "data_state", "genome_build", "genecoveragecanonicaltranscript_set"]
12 changes: 10 additions & 2 deletions seqauto/models/models_seqauto.py
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,10 @@ def __str__(self):


class SequencingSample(models.Model):
""" Represents a row in a SampleSheet.csv """
""" Represents a row in a SampleSheet.csv
As it's not a file, not a SeqAutoRecord
"""
sample_sheet = models.ForeignKey(SampleSheet, on_delete=CASCADE)
sample_id = models.TextField()
# sample_name is used to name files. In MiSeq/NextSeq samplesheet you can add names.
Expand Down Expand Up @@ -973,7 +976,12 @@ def __str__(self):


class QCGeneList(SeqAutoRecord):
""" This represents a text file containing genes which will be used for initial pass and QC filters """
""" This represents a text file containing genes which will be used for initial pass and QC filters
The reason we have both a sample_gene_list and a custom_text_gene_list is because we wanted to
represent the text from a file on disk. I think we probably could have gotten around that as
SeqAutoRecord contains a hash - could maybe remove that and just use gene list
"""
qc = models.ForeignKey(QC, on_delete=CASCADE)
custom_text_gene_list = models.OneToOneField(CustomTextGeneList, null=True, on_delete=SET_NULL)
sample_gene_list = models.ForeignKey(SampleGeneList, null=True, on_delete=SET_NULL)
Expand Down
69 changes: 0 additions & 69 deletions seqauto/serializers.py

This file was deleted.

3 changes: 3 additions & 0 deletions seqauto/serializers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from .enrichment_kit_serializers import *
from .seqauto_serializers import *
from .seqauto_serializers import *
39 changes: 39 additions & 0 deletions seqauto/serializers/enrichment_kit_serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from rest_framework import serializers

from genes.serializers import GeneListSerializer
from seqauto.models import EnrichmentKit



class EnrichmentKitSerializer(serializers.ModelSerializer):
gene_list = GeneListSerializer()
enrichment_kit_type = serializers.SerializerMethodField()
manufacturer = serializers.StringRelatedField()
__str__ = serializers.SerializerMethodField(read_only=True)

class Meta:
model = EnrichmentKit
fields = ('pk', 'name', 'version', 'enrichment_kit_type', 'manufacturer', 'gene_list', '__str__')

def get_enrichment_kit_type(self, obj):
return obj.get_enrichment_kit_type_display()

def get___str__(self, obj):
return str(obj)


class EnrichmentKitSummarySerializer(serializers.ModelSerializer):
""" Doesn't return genes (much faster) """
enrichment_kit_type = serializers.SerializerMethodField()
manufacturer = serializers.StringRelatedField()
__str__ = serializers.SerializerMethodField(read_only=True)

class Meta:
model = EnrichmentKit
fields = ('pk', 'name', 'version', 'enrichment_kit_type', 'manufacturer', '__str__')

def get_enrichment_kit_type(self, obj):
return obj.get_enrichment_kit_type_display()

def get___str__(self, obj):
return str(obj)
69 changes: 69 additions & 0 deletions seqauto/serializers/seqauto_qc_serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
from rest_framework import serializers

from genes.serializers import SampleGeneListSerializer, GeneCoverageCollectionSerializer
from seqauto.models import IlluminaFlowcellQC, QCGeneList, QC, QCGeneCoverage, QCExecSummary, FastQC, SequencingSample
from seqauto.serializers.sequencing_serializers import SampleSheetLookupSerializer, FastqSerializer, SeqAutoViewMixin, \
BamFilePathSerializer, VCFFilePathSerializer, SequencingSampleLookupSerializer


class FastQCSerializer(SeqAutoViewMixin, serializers.ModelSerializer):
fastq = FastqSerializer()

class Meta:
model = FastQC
fields = "__all__"


class IlluminaFlowcellQCSerializer(SeqAutoViewMixin, serializers.ModelSerializer):
sample_sheet = SampleSheetLookupSerializer()

class Meta:
model = IlluminaFlowcellQC
#fields = "__all__"
exclude = ("sequencing_run", ) # Already part of sample_sheet


class QCSerializer(SeqAutoViewMixin, serializers.ModelSerializer):
# Instead of dealing with all the bam/vcf etc - we'll just deal with sequencing_sample and
# assume we're using the latest ones associated with that
sequencing_sample = serializers.SerializerMethodField(read_only=True)
bam_file = BamFilePathSerializer() # These end up really big, think we just want to pass PKs
vcf_file = VCFFilePathSerializer()

class Meta:
model = QC
fields = ("sequencing_sample", "bam_file", "vcf_file")

def get_sequencing_sample(self, instance):
try:
ss = instance.bam_file.unaligned_reads.sequencing_sample
serializer = SequencingSampleLookupSerializer(ss)
return serializer.data
except SequencingSample.DoesNotExist:
return None


class QCGeneListSerializer(SeqAutoViewMixin, serializers.ModelSerializer):
qc = QCSerializer()
sample_gene_list = SampleGeneListSerializer()

class Meta:
model = QCGeneList
fields = ("path", "qc", "sample_gene_list")


class QCGeneCoverageSerializer(SeqAutoViewMixin, serializers.ModelSerializer):
qc = QCSerializer()
gene_coverage_collection = GeneCoverageCollectionSerializer()

class Meta:
model = QCGeneCoverage
fields = ("path", "qc", "gene_coverage_collection")


class QCExecSummarySerializer(SeqAutoViewMixin, serializers.ModelSerializer):
qc = QCSerializer()

class Meta:
model = QCExecSummary
exclude = ('gene_list', )
34 changes: 34 additions & 0 deletions seqauto/serializers/seqauto_serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import numpy as np
from rest_framework import serializers

from genes.serializers import TranscriptSerializer, GeneSymbolSerializer, \
TranscriptVersionSerializer
from seqauto.models import GoldCoverageSummary, GoldReference
from seqauto.serializers.enrichment_kit_serializers import EnrichmentKitSummarySerializer


class GoldReferenceSerializer(serializers.ModelSerializer):
enrichment_kit = EnrichmentKitSummarySerializer()

class Meta:
model = GoldReference
fields = ('enrichment_kit', 'created')


class GoldCoverageSummarySerializer(serializers.ModelSerializer):
gold_reference = GoldReferenceSerializer()
gene_symbol = GeneSymbolSerializer()
transcript = TranscriptSerializer()
transcript_version = TranscriptVersionSerializer()
standard_error = serializers.SerializerMethodField()

class Meta:
model = GoldCoverageSummary
fields = '__all__'

def get_standard_error(self, obj):
""" This can occasionally be NaN which isn't valid JSON """
standard_error = obj.standard_error
if np.isnan(standard_error):
standard_error = -1
return standard_error
Loading

0 comments on commit f5096bb

Please sign in to comment.