Skip to content

Commit 8dcda7c

Browse files
authored
Merge pull request #242 from Clinical-Genomics/crud-separation
Crud separation
2 parents c7955f3 + bf169a4 commit 8dcda7c

File tree

14 files changed

+819
-776
lines changed

14 files changed

+819
-776
lines changed

microSALT/exc/exceptions.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,11 @@ def __init__(self, message: str = ""):
77

88
class RefUpdateLockError(MicroSALTError):
99
"""Raised when an operation is attempted while a reference update is in progress."""
10+
11+
pass
12+
13+
14+
class JobCreationError(MicroSALTError):
15+
"""Raised when there is an error creating a job."""
16+
1017
pass

microSALT/store/db_manipulator.py

Lines changed: 371 additions & 390 deletions
Large diffs are not rendered by default.

microSALT/store/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class ProfileTable:
2828
"""
2929

3030
def __init__(self, prefix: str, metadata, profiles_path: str, log):
31-
self.tables: dict[str, Table] = dict()
31+
self.tables: dict[str, Table] = {}
3232
self.prefix = prefix
3333
self.metadata = metadata
3434
self.profiles_path = profiles_path

microSALT/store/orm_models.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ class Projects(Base):
127127

128128
CG_ID_project = Column(String(32), primary_key=True, nullable=False)
129129
Customer_ID_project = Column(String(32))
130-
date_ordered = Column(DateTime)
131130
Customer_ID = Column(String(32))
132131

133132

microSALT/utils/job_creator.py

Lines changed: 55 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
By: Isak Sylvin, @sylvinite"""
33

44
#!/usr/bin/env python
5-
65
import glob
76
import gzip
87
import json
@@ -29,7 +28,9 @@
2928
SlurmHeader,
3029
Threshold,
3130
)
31+
from microSALT.exc.exceptions import JobCreationError
3232
from microSALT.store.db_manipulator import DB_Manipulator
33+
from microSALT.store.orm_models import Projects
3334
from microSALT.utils.referencer import Referencer
3435

3536

@@ -525,57 +526,68 @@ def create_snpsection(self):
525526

526527
def create_collection(self):
527528
"""Creates collection entry in database"""
528-
if self.db_pusher.exists("Collections", {"ID_collection": self.name}):
529-
self.db_pusher.purge_rec(name=self.name, type="Collections")
529+
if self.db_pusher.read_exists("Collections", {"ID_collection": self.name}):
530+
self.db_pusher.delete_collection(self.name)
530531
for sample in self.pool:
531532
self.db_pusher.add_rec(
532533
{"ID_collection": self.name, "CG_ID_sample": sample}, "Collections"
533534
)
534535

535-
addedprojs = list()
536+
addedprojs = []
536537
for sample in self.pool:
537-
proj = re.search(r"(\w+)A(?:\w+)", sample).group(1)
538-
if proj not in addedprojs:
539-
self.create_project(proj)
540-
addedprojs.append(proj)
538+
lims_project = re.search(r"(\w+)A(?:\w+)", sample).group(1)
539+
projects: Projects | None = self.db_pusher.read_report(lims_project)
540+
if not projects and lims_project not in addedprojs:
541+
self.create_project(lims_project)
542+
addedprojs.append(lims_project)
541543

542-
def create_project(self, name):
544+
def create_project(self, name: str):
543545
"""Creates project in database"""
544-
proj_col = dict()
545-
proj_col["CG_ID_project"] = name
546-
proj_col["Customer_ID_project"] = self.sample.get("Customer_ID_project")
547-
proj_col["Customer_ID"] = self.sample.get("Customer_ID")
548-
self.db_pusher.add_rec(proj_col, "Projects")
549-
self.db_pusher.upd_rec({"CG_ID_project": name}, "Projects", proj_col)
550-
551-
def create_sample(self, name):
546+
if not self.sample:
547+
raise JobCreationError(
548+
"No sample information provided. Cannot create project in database."
549+
)
550+
project_data: dict[str, str] = {
551+
"CG_ID_project": name,
552+
"Customer_ID_project": self.sample["Customer_ID_project"],
553+
"Customer_ID": self.sample["Customer_ID"],
554+
}
555+
self.db_pusher.add_to_session(self.db_pusher.add_project(**project_data))
556+
self.db_pusher.commit_session()
557+
558+
def create_sample(self):
552559
"""Creates sample in database"""
560+
553561
try:
554-
sample_col = self.db_pusher.get_columns("Samples")
555-
sample_col["CG_ID_sample"] = self.sample.get("CG_ID_sample")
556-
sample_col["CG_ID_project"] = self.sample.get("CG_ID_project")
557-
sample_col["Customer_ID_sample"] = self.sample.get("Customer_ID_sample")
558-
sample_col["reference_genome"] = self.sample.get("reference")
559-
sample_col["reference_length"] = self.sample.get("reference_length")
560-
sample_col["date_analysis"] = self.dt
561-
sample_col["organism"] = self.sample.get("organism")
562-
sample_col["application_tag"] = self.sample.get("application_tag")
563-
sample_col["priority"] = self.sample.get("priority")
564-
sample_col["date_arrival"] = datetime.strptime(
565-
self.sample.get("date_arrival"), "%Y-%m-%d %H:%M:%S"
566-
)
567-
sample_col["date_sequencing"] = datetime.strptime(
568-
self.sample.get("date_sequencing"), "%Y-%m-%d %H:%M:%S"
569-
)
570-
sample_col["date_libprep"] = datetime.strptime(
571-
self.sample.get("date_libprep"), "%Y-%m-%d %H:%M:%S"
572-
)
573-
sample_col["method_libprep"] = self.sample.get("method_libprep")
574-
sample_col["method_sequencing"] = self.sample.get("method_sequencing")
575-
# self.db_pusher.purge_rec(sample_col['CG_ID_sample'], 'sample')
576-
self.db_pusher.add_rec(sample_col, "Samples")
577-
except Exception:
578-
self.logger.error(f"Unable to add sample {self.name} to database")
562+
if not self.sample:
563+
raise JobCreationError(
564+
"No sample information provided. Cannot create sample in database."
565+
)
566+
sample_data: dict[str, str | datetime] = {
567+
"CG_ID_sample": self.sample["CG_ID_sample"],
568+
"CG_ID_project": self.sample["CG_ID_project"],
569+
"Customer_ID_sample": self.sample["Customer_ID_sample"],
570+
"reference_genome": self.sample["reference"],
571+
"reference_length": self.sample["reference_length"],
572+
"date_analysis": self.dt,
573+
"organism": self.sample["organism"],
574+
"application_tag": self.sample["application_tag"],
575+
"priority": self.sample["priority"],
576+
"date_arrival": datetime.strptime(self.sample["date_arrival"], "%Y-%m-%d %H:%M:%S"),
577+
"date_sequencing": datetime.strptime(
578+
self.sample["date_sequencing"], "%Y-%m-%d %H:%M:%S"
579+
),
580+
"date_libprep": datetime.strptime(self.sample["date_libprep"], "%Y-%m-%d %H:%M:%S"),
581+
"method_libprep": self.sample["method_libprep"],
582+
"method_sequencing": self.sample["method_sequencing"],
583+
}
584+
self.db_pusher.add_to_session(self.db_pusher.add_sample(**sample_data))
585+
self.db_pusher.commit_session()
586+
except JobCreationError as e:
587+
self.logger.error(f"Unable to add sample {self.name} to database: {e}")
588+
except KeyError as e:
589+
self.logger.error(f"Missing key {e} in sample information for sample {self.name}")
590+
raise JobCreationError(f"Missing key {e} in sample information for sample {self.name}")
579591

580592
def project_job(self, single_sample=False):
581593
if self.dry:
@@ -800,7 +812,7 @@ def sample_job(self):
800812
except Exception:
801813
raise
802814
try:
803-
self.create_sample(self.name)
815+
self.create_sample()
804816
except Exception:
805817
self.logger.error(f"Unable to access LIMS info for sample {self.name}")
806818
except Exception as e:

microSALT/utils/referencer.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ def _find_entry_for_organism(
179179

180180
def _should_update_external(self, organ: str, entry: ET.Element) -> dict | bool:
181181
"""Determine if the external data for an organism should be updated."""
182-
currver = self.db_access.get_version(f"profile_{organ}")
182+
currver = self.db_access.read_version(f"profile_{organ}")
183183
st_link = entry.find("./mlst/database/profiles/url").text
184184
service = get_service_by_url(st_link)
185185
if service == "pasteur":
@@ -320,14 +320,14 @@ def resync(self, type="", sample="", ignore=False):
320320
"""Manipulates samples that have an internal ST that differs from pubMLST ST"""
321321
if type == "list":
322322
# Add single sample support later
323-
self.db_access.list_unresolved()
323+
self.db_access.read_unresolved()
324324
elif type == "overwrite":
325325
if ignore:
326-
self.db_access.rm_novel(sample=sample)
326+
self.db_access.set_novel_ignored(sample=sample)
327327
else:
328-
self.db_access.sync_novel(overwrite=True, sample=sample)
328+
self.db_access.set_novel_st(overwrite=True, sample=sample)
329329
else:
330-
self.db_access.sync_novel(overwrite=False, sample=sample)
330+
self.db_access.set_novel_st(overwrite=False, sample=sample)
331331

332332
def fetch_resistances(self, force=False):
333333
cwd = os.getcwd()
@@ -571,7 +571,7 @@ def download_pubmlst(self, organism, subtype_href, force=False):
571571
try:
572572
# Pull version
573573
extver = self.external_version(organism, subtype_href)
574-
currver = self.db_access.get_version(f"profile_{organism}")
574+
currver = self.db_access.read_version(f"profile_{organism}")
575575
if int(extver.replace("-", "")) <= int(currver.replace("-", "")) and not force:
576576
self.logger.info(
577577
f"Profile for {organism.replace('_', ' ').capitalize()} already at the latest version."
@@ -649,7 +649,7 @@ def fetch_pubmlst(self, force=False):
649649
seqdef_url[name] = subtype["href"]
650650

651651
for key, val in seqdef_url.items():
652-
internal_ver = self.db_access.get_version(f"profile_{key}")
652+
internal_ver = self.db_access.read_version(f"profile_{key}")
653653
external_ver = self.external_version(key, val)
654654

655655
if (internal_ver < external_ver) or force:

microSALT/utils/reporter.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def report(self, type="default", customer="all"):
104104
copyfile(k, v)
105105

106106
def gen_version(self, name):
107-
self.db_pusher.get_report(name)
107+
self.db_pusher.read_report(name)
108108
self.db_pusher.set_report(name)
109109

110110
def gen_STtracker(self, customer="all", silent=False):
@@ -124,7 +124,7 @@ def gen_STtracker(self, customer="all", silent=False):
124124

125125
def gen_qc(self, silent=False):
126126
try:
127-
last_version = self.db_pusher.get_report(self.name).version
127+
last_version = self.db_pusher.read_report(self.name).version
128128
except Exception:
129129
self.logger.error(f"Project {self.name} does not exist")
130130
sys.exit(-1)
@@ -147,7 +147,7 @@ def gen_qc(self, silent=False):
147147

148148
def gen_typing(self, silent=False):
149149
try:
150-
last_version = self.db_pusher.get_report(self.name).version
150+
last_version = self.db_pusher.read_report(self.name).version
151151
except Exception:
152152
self.logger.error(f"Project {self.name} does not exist")
153153
sys.exit(-1)
@@ -269,7 +269,7 @@ def gen_motif(self, motif="resistance", silent=False):
269269
def gen_delivery(self):
270270
deliv = dict()
271271
deliv["files"] = list()
272-
last_version = self.db_pusher.get_report(self.name).version
272+
last_version = self.db_pusher.read_report(self.name).version
273273
output = f"{self.folders.reports}/deliverables/{self.sample.get('Customer_ID_project')}_deliverables.yaml"
274274
local = f"{self.output}/{self.sample.get('Customer_ID_project')}_deliverables.yaml"
275275

0 commit comments

Comments
 (0)