Skip to content

Commit

Permalink
status_details validator with circular import
Browse files Browse the repository at this point in the history
  • Loading branch information
mayabrandi committed Feb 21, 2022
1 parent e1841c0 commit 5ed2b22
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
14 changes: 8 additions & 6 deletions genotype_api/match.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@ def compare_genotypes(genotype_1: Genotype, genotype_2: Genotype) -> str:


def check_sex(
sample: Sample, analysis_1: Analysis, analysis_2: Analysis
sex_1: Optional[str], sex_2: Optional[str], sex_3: Optional[str]
) -> Optional[Literal["fail", "pass"]]:
if sample.sex in ["unknown", None]:
"""Compare three sex strings"""

if sex_1 in ["unknown", None]:
return "fail"
if not sample.sex == analysis_1.sex == analysis_2.sex:
if not sex_1 == sex_2 == sex_3:
return "fail"
return "pass"

Expand Down Expand Up @@ -55,9 +57,9 @@ def check_sample(sample: Sample):
assert len(sample.analyses) == 2, "must load both types of analyses"
return dict(
sex=check_sex(
sample=sample,
analysis_1=sample.genotype_analysis,
analysis_2=sample.sequence_analysis,
sex_1=sample.sex,
sex_2=sample.genotype_analysis.sex,
sex_3=sample.sequence_analysis.sex,
),
compare=check_snps(
analysis_1=sample.genotype_analysis,
Expand Down
25 changes: 22 additions & 3 deletions genotype_api/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
from typing import Optional, List, Dict
from collections import Counter


from pydantic import constr, EmailStr, BaseModel, validator
from pydantic import constr, EmailStr, validator
from sqlmodel import SQLModel, Field, Relationship

from genotype_api.constants import TYPES, SEXES, STATUS
from genotype_api.match import check_sex, check_snps, score_no_calls


class GenotypeBase(SQLModel):
Expand Down Expand Up @@ -177,8 +177,27 @@ class UserReadWithPlates(UserRead):
plates: Optional[List[Plate]] = []


class SampleReadWithStatusDetails(SampleRead):
analyses: Optional[List[AnalysisRead]] = []
status_details: Optional[str]

@validator("status_details", always=True)
def set_status_details(cls, v, values: dict) -> str:
genotype_analysis: Analysis = values["genotype_analysis"]
sequence_analysis: Analysis = values["sequence_analysis"]
sample_sex = values["sex"]

sex_status = check_sex(sample_sex, genotype_analysis.sex, sequence_analysis.sex)
snp_status = check_snps(genotype_analysis, sequence_analysis)
no_calls_status = score_no_calls(genotype_analysis)
print(sex_status)
print(snp_status)
print(no_calls_status)
return snp_status


class AnalysisReadWithSample(AnalysisRead):
sample: Optional[SampleSlim]
sample: Optional[SampleReadWithStatusDetails]


class PlateReadWithAnalyses(PlateRead):
Expand Down

0 comments on commit 5ed2b22

Please sign in to comment.