105 lines
4.6 KiB
Python
105 lines
4.6 KiB
Python
from . import Base
|
|
from sqlalchemy import Column, String, TIMESTAMP, text, JSON, INTEGER, ForeignKey, UniqueConstraint, Table
|
|
from sqlalchemy.orm import relationship, relationships
|
|
from datetime import datetime as dt
|
|
|
|
reagents_submissions = Table("_reagents_submissions", Base.metadata, Column("reagent_id", INTEGER, ForeignKey("_reagents.id")), Column("submission_id", INTEGER, ForeignKey("_submissions.id")))
|
|
|
|
class BasicSubmission(Base):
|
|
|
|
# TODO: Figure out if I want seperate tables for different sample types.
|
|
__tablename__ = "_submissions"
|
|
|
|
id = Column(INTEGER, primary_key=True) #: primary key
|
|
rsl_plate_num = Column(String(32), unique=True) #: RSL name (e.g. RSL-22-0012)
|
|
submitter_plate_num = Column(String(127), unique=True) #: The number given to the submission by the submitting lab
|
|
submitted_date = Column(TIMESTAMP) #: Date submission received
|
|
submitting_lab = relationship("Organization", back_populates="submissions") #: client
|
|
submitting_lab_id = Column(INTEGER, ForeignKey("_organizations.id", ondelete="SET NULL", name="fk_BS_sublab_id"))
|
|
sample_count = Column(INTEGER) #: Number of samples in the submission
|
|
extraction_kit = relationship("KitType", back_populates="submissions") #: The extraction kit used
|
|
extraction_kit_id = Column(INTEGER, ForeignKey("_kits.id", ondelete="SET NULL", name="fk_BS_extkit_id"))
|
|
submission_type = Column(String(32))
|
|
technician = Column(String(64))
|
|
# Move this into custom types?
|
|
reagents = relationship("Reagent", back_populates="submissions", secondary=reagents_submissions)
|
|
reagents_id = Column(String, ForeignKey("_reagents.id", ondelete="SET NULL", name="fk_BS_reagents_id"))
|
|
|
|
__mapper_args__ = {
|
|
"polymorphic_identity": "basic_submission",
|
|
"polymorphic_on": submission_type,
|
|
"with_polymorphic": "*",
|
|
}
|
|
|
|
def to_dict(self):
|
|
print(self.submitting_lab)
|
|
try:
|
|
sub_lab = self.submitting_lab.name
|
|
except AttributeError:
|
|
sub_lab = None
|
|
try:
|
|
sub_lab = sub_lab.replace("_", " ").title()
|
|
except AttributeError:
|
|
pass
|
|
try:
|
|
ext_kit = self.extraction_kit.name
|
|
except AttributeError:
|
|
ext_kit = None
|
|
output = {
|
|
"id": self.id,
|
|
"Plate Number": self.rsl_plate_num,
|
|
"Submission Type": self.submission_type.replace("_", " ").title(),
|
|
"Submitter Plate Number": self.submitter_plate_num,
|
|
"Submitted Date": self.submitted_date.strftime("%Y-%m-%d"),
|
|
"Submitting Lab": sub_lab,
|
|
"Sample Count": self.sample_count,
|
|
"Extraction Kit": ext_kit,
|
|
"Technician": self.technician,
|
|
}
|
|
return output
|
|
|
|
|
|
def report_dict(self):
|
|
try:
|
|
sub_lab = self.submitting_lab.name
|
|
except AttributeError:
|
|
sub_lab = None
|
|
try:
|
|
sub_lab = sub_lab.replace("_", " ").title()
|
|
except AttributeError:
|
|
pass
|
|
try:
|
|
ext_kit = self.extraction_kit.name
|
|
except AttributeError:
|
|
ext_kit = None
|
|
try:
|
|
cost = self.extraction_kit.cost_per_run
|
|
except AttributeError:
|
|
cost = None
|
|
output = {
|
|
"id": self.id,
|
|
"Plate Number": self.rsl_plate_num,
|
|
"Submission Type": self.submission_type.replace("_", " ").title(),
|
|
"Submitter Plate Number": self.submitter_plate_num,
|
|
"Submitted Date": self.submitted_date.strftime("%Y-%m-%d"),
|
|
"Submitting Lab": sub_lab,
|
|
"Sample Count": self.sample_count,
|
|
"Extraction Kit": ext_kit,
|
|
"Cost": cost
|
|
}
|
|
return output
|
|
|
|
# Below are the custom submission
|
|
|
|
class BacterialCulture(BasicSubmission):
|
|
control = relationship("Control", back_populates="submissions") #: A control sample added to submission
|
|
control_id = Column(INTEGER, ForeignKey("_control_samples.id", ondelete="SET NULL", name="fk_BC_control_id"))
|
|
samples = relationship("BCSample", back_populates="rsl_plate", uselist=True)
|
|
# bc_sample_id = Column(INTEGER, ForeignKey("_bc_samples.id", ondelete="SET NULL", name="fk_BC_sample_id"))
|
|
__mapper_args__ = {"polymorphic_identity": "bacterial_culture", "polymorphic_load": "inline"}
|
|
|
|
|
|
class Wastewater(BasicSubmission):
|
|
samples = relationship("WWSample", back_populates="rsl_plate", uselist=True)
|
|
# ww_sample_id = Column(String, ForeignKey("_ww_samples.id", ondelete="SET NULL", name="fk_WW_sample_id"))
|
|
__mapper_args__ = {"polymorphic_identity": "wastewater", "polymorphic_load": "inline"} |