Skip to content

Commit

Permalink
Merge b6a4370 into b1fbcd9
Browse files Browse the repository at this point in the history
  • Loading branch information
mayabrandi committed Apr 1, 2021
2 parents b1fbcd9 + b6a4370 commit f24427d
Show file tree
Hide file tree
Showing 9 changed files with 130 additions and 92 deletions.
1 change: 0 additions & 1 deletion NIPTool/API/external/api/api_v1/endpoints/login.py
Expand Up @@ -42,7 +42,6 @@ def login(token: Token = Depends(login_for_access_token)):
"Authorization": f"{token.get('token_type')} {token.get('access_token')}",
"accept": "application/json",
}
print(headers)
return RedirectResponse("../batches", headers=headers)


Expand Down
24 changes: 23 additions & 1 deletion NIPTool/API/external/api/api_v1/endpoints/sample.py
Expand Up @@ -14,8 +14,30 @@
@router.get("/samples/{sample_id}/")
def sample(request: Request, sample_id: str, adapter: NiptAdapter = Depends(get_nipt_adapter)):
"""Sample view with sample information."""

sample: dict = find.sample(sample_id=sample_id, adapter=adapter).dict()
batch = find.batch(batch_id=sample.get("batch_id"), adapter=adapter)
batch: Batch = find.batch(batch_id=sample.get("batch_id"), adapter=adapter)

return templates.TemplateResponse(
"sample/sample.html",
context=dict(
request=request,
current_user=User(username="mayapapaya", email="mayabrandi@123.com", role="RW"),
chrom_abnorm=CHROM_ABNORM,
sample=sample,
status_classes=STATUS_CLASSES,
batch=batch,
page_id="sample",
),
)


@router.post("/samples/{sample_id}/")
def sample(request: Request, sample_id: str, adapter: NiptAdapter = Depends(get_nipt_adapter)):
"""Sample view with sample information."""

sample: dict = find.sample(sample_id=sample_id, adapter=adapter).dict()
batch: Batch = find.batch(batch_id=sample.get("batch_id"), adapter=adapter)

return templates.TemplateResponse(
"sample/sample.html",
Expand Down
167 changes: 92 additions & 75 deletions NIPTool/API/external/api/api_v1/endpoints/update.py
@@ -1,11 +1,12 @@
import logging
from typing import Iterable
from typing import Optional

from fastapi import APIRouter, Depends, Request
from fastapi.responses import RedirectResponse
from starlette.datastructures import FormData

from NIPTool.adapter.plugin import NiptAdapter
from NIPTool.crud import find, update
from NIPTool.crud import update

from NIPTool.models.database import User
from NIPTool.API.external.utils import *
Expand All @@ -16,89 +17,105 @@

LOG = logging.getLogger(__name__)

from pydantic import BaseModel
USER = User(username="mayapapaya", email="mayapapaya@mail.com", role="RW")


@router.post("/set_sample_status")
async def set_sample_status(request: Request, adapter: NiptAdapter = Depends(get_nipt_adapter)):
"""Update the manualy interpreted chromosome abnormality status for a sample."""

form = await request.form()

if USER.role != "RW":
return RedirectResponse(request.headers.get("referer"))

sample_id: str = form["sample_id"]
sample: dict = find.sample(sample_id=sample_id, adapter=adapter).dict()

for abnormality in CHROM_ABNORM:
new_abnormality_status: str = form[abnormality]
abnormality_key: str = f"status_{abnormality}"
if sample.get(abnormality_key) == new_abnormality_status:
continue

LOG.debug(
"Updating %s to %s for sample %s",
abnormality_key,
new_abnormality_status,
sample_id,
)
time_stamp: str = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
sample[abnormality_key] = new_abnormality_status
sample[f"status_change_{abnormality}"] = f"{USER.username} {time_stamp}"

update.sample(adapter=adapter, sample=Sample(**sample))
return RedirectResponse(request.headers.get("referer"))


@router.post("/sample_comment")
async def sample_comment(request: Request, adapter: NiptAdapter = Depends(get_nipt_adapter)):
"""Update sample comment"""

class Item(BaseModel):
form_id: str
sample_id: Optional[str]
form = await request.form()

if USER.role != "RW":
return RedirectResponse(request.headers.get("referer"))

@router.post("/update_debugging")
def update_debugging(
request: Request, item: Item, adapter: NiptAdapter = Depends(get_nipt_adapter)
):
"""Update the database"""
print(item)
print("hej")
time_stamp = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
user = User(username="mayapapaya", email="mayabrandi@123.com", role="RW")
if user.role != "RW":
return "", 201
sample_id: str = form["sample_id"]
sample: Sample = find.sample(sample_id=sample_id, adapter=adapter)
comment: str = form.get("comment")
if comment != sample.comment:
sample.comment = comment
update.sample(adapter=adapter, sample=sample)

return RedirectResponse("batches/342712/")
return RedirectResponse(request.headers.get("referer"))


@router.post("/update")
def update(request: Request, adapter: NiptAdapter = Depends(get_nipt_adapter)):
"""Update the database"""
@router.post("/include_samples")
async def include_samples(request: Request, adapter: NiptAdapter = Depends(get_nipt_adapter)):
"""Update include status and comment for samples in batch"""

form = await request.form()

if USER.role != "RW":
return RedirectResponse(request.headers.get("referer"))

button_id = form.get("button_id")
samples: Iterable[str] = form.getlist("samples")
if button_id == "include all samples":
include_all_samples(samples=samples, adapter=adapter)
elif button_id == "Save":
save_samples(samples=samples, form=form, adapter=adapter)

return RedirectResponse(request.headers.get("referer"))


def save_samples(samples: Iterable[str], form: FormData, adapter: NiptAdapter):
"""Function to update sample.comment and sample.include."""

time_stamp: str = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
user = User(username="mayapapaya", email="mayapapaya@mail.com", role="RW")

if user.role != "RW":
return "", 201

if request.form.get("form_id") == "set_sample_status":
sample_id: str = request.form["sample_id"]
sample: Sample = find.sample(sample_id=sample_id)
# Convert to dict to fetch statuses
sample_dict: dict = sample.dict()
for abnormality in CHROM_ABNORM:
new_abnormality_status: str = request.form[abnormality]
abnormality_key: str = "_".join(["status", abnormality])
if sample_dict.get(abnormality_key) != new_abnormality_status:
LOG.debug(
"Updating %s to %s for sample %s",
abnormality_key,
new_abnormality_status,
sample_id,
)
sample[abnormality_key] = new_abnormality_status
sample["status_change_abnormality"] = " ".join([user.name, time_stamp])
update.sample(adapter=adapter, sample_object=Sample(**sample_dict))

if request.form.get("form_id") == "set_sample_comment" and request.form.get("comment"):
sample_id: str = request.form["sample_id"]
sample: Sample = find.sample(sample_id=sample_id)
comment: str = request.form.get("comment")
for sample_id in samples:
sample: Sample = find.sample(sample_id=sample_id, adapter=adapter)
comment: str = form.get(f"comment_{sample_id}")
include: bool = form.get(f"include_{sample_id}")
if comment != sample.comment:
sample.comment = comment
update.sample(adapter=adapter, sample_object=sample)

if request.form.get("button_id") == "Save":
samples: Iterable[str] = request.form.getlist("samples")
for sample_id in samples:
sample: Sample = find.sample(sample_id=sample_id)
comment: str = request.form.get(f"comment_{sample_id}")
include: bool = request.form.get(f"include_{sample_id}")
if comment != sample.comment:
sample.comment = comment
if include and not sample.include:
sample.include = True
sample.change_include_date = " ".join([user.name, time_stamp])
elif not include and sample.include:
sample.include = False
update.sample(adapter=adapter, sample_object=sample)

if request.form.get("button_id") == "include all samples":
samples: Iterable[str] = request.form.getlist("samples")
for sample_id in samples:
sample: Sample = find.sample(sample_id=sample_id)
if sample.include:
continue
if include and not sample.include:
sample.include = True
sample.change_include_date = " ".join([user.name, time_stamp])
update.sample(adapter=adapter, sample_object=sample)
sample.change_include_date = f"{USER.username} {time_stamp}"
elif not include and sample.include:
sample.include = False
update.sample(adapter=adapter, sample=sample)


return RedirectResponse(request.url)
def include_all_samples(samples: Iterable[str], adapter: NiptAdapter):
"""Function to set sample.include=True for all samples."""

time_stamp: str = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
for sample_id in samples:
sample: Sample = find.sample(sample_id=sample_id, adapter=adapter)
if sample.include:
continue
sample.include = True
sample.change_include_date = f"{USER.username} {time_stamp}"
update.sample(adapter=adapter, sample=sample)
Expand Up @@ -11,7 +11,7 @@
<div class="col-lg-16">
<div class="panel panel-default">
<div class="panel-body">
<form action="{{ url_for('update') }}" method="post">
<form action="{{ url_for('include_samples') }}" method="post">
<input type=text name="form_id" value="include_samples" hidden>
<table>
<tbody>
Expand Down
@@ -1,6 +1,6 @@
{% block content %}

<form action="{{ url_for('update') }}" method="post">
<form action="{{ url_for('sample_comment') }}" method="post">
<div class="vertical-center">
<div class="row">
<div class="col-lg-12">
Expand Down
Expand Up @@ -16,7 +16,7 @@
<!-- /.panel-heading -->
<div class="panel-body">
<div class="table-responsive">
<form action="{{ url_for('update') }}" method="post">
<form action="{{ url_for('set_sample_status') }}" method="post">
<input type=text name="form_id" value="set_sample_status" hidden>
<input type=text name="sample_id" value="{{sample.sample_id}}" hidden>
<table class="table table-bordered table-hover" >
Expand Down
4 changes: 2 additions & 2 deletions NIPTool/API/external/constants.py
Expand Up @@ -7,8 +7,8 @@
"Other": "warning",
"Failed": "danger",
}
CHROM_ABNORM = ["T13", "T18", "T21", "X0", "XXX", "XXY", "XYY"]
TRIS_CHROM_ABNORM = ["T13", "T18", "T21"]
CHROM_ABNORM = ["13", "18", "21", "X0", "XXX", "XXY", "XYY"]
TRIS_CHROM_ABNORM = ["13", "18", "21"]
SEX_CHROM_ABNORM = ["X0", "XXX", "XXY", "XYY"]
STATUS_COLORS = {
"Suspected": "#DBA901",
Expand Down
2 changes: 1 addition & 1 deletion NIPTool/crud/update.py
Expand Up @@ -12,5 +12,5 @@ def sample(adapter: NiptAdapter, sample: Sample) -> dict:
sample_dict: dict = sample.dict(exclude_none=True)
sample_id = sample.sample_id
LOG.info("Updating sample %s", sample_id)
adapter.sample_collection.update_one({"sample_id": sample_id}, sample_dict)
adapter.sample_collection.update_one({"sample_id": sample_id}, {"$set": sample_dict})
return sample_dict
18 changes: 9 additions & 9 deletions NIPTool/models/database/sample.py
Expand Up @@ -77,22 +77,22 @@ class Sample(BaseModel):
CNVSegment: Optional[str]
segmental_calls: Optional[str]
include: Optional[bool]
change_include_date: Optional[str]
comment: Optional[str]
change_include_date: Optional[str] = ""
comment: Optional[str] = ""
status_13: Optional[str]
status_18: Optional[str]
status_21: Optional[str]
status_X0: Optional[str]
status_XXX: Optional[str]
status_XXY: Optional[str]
status_XYY: Optional[str]
status_change_T13: Optional[str]
status_change_T18: Optional[str]
status_change_T21: Optional[str]
status_change_TX0: Optional[str]
status_change_TXXX: Optional[str]
status_change_TXXY: Optional[str]
status_change_TXYY: Optional[str]
status_change_13: Optional[str] = ""
status_change_18: Optional[str] = ""
status_change_21: Optional[str] = ""
status_change_X0: Optional[str] = ""
status_change_XXX: Optional[str] = ""
status_change_XXY: Optional[str] = ""
status_change_XYY: Optional[str] = ""

class Config:
allow_population_by_field_name = True

0 comments on commit f24427d

Please sign in to comment.