diff --git a/CHANGELOG.md b/CHANGELOG.md index 2140784..d7f029c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,12 @@ -## 202408-05 +## 202409.03 + +- Improved error messaging when saving submissions. + +## 202409.02 + +- Creation of generic submissions using only database is now supported. + +## 202408.05 - Improved scraping for gel info of Artic submissions. diff --git a/src/submissions/backend/db/models/__init__.py b/src/submissions/backend/db/models/__init__.py index f90b52d..caba244 100644 --- a/src/submissions/backend/db/models/__init__.py +++ b/src/submissions/backend/db/models/__init__.py @@ -6,10 +6,11 @@ import sys, logging from sqlalchemy import Column, INTEGER, String, JSON from sqlalchemy.orm import DeclarativeMeta, declarative_base, Query, Session from sqlalchemy.ext.declarative import declared_attr -from sqlalchemy.exc import ArgumentError +from sqlalchemy.exc import ArgumentError, IntegrityError as sqlalcIntegrityError from typing import Any, List from pathlib import Path from tools import report_result +# from sqlite3 import IntegrityError as sqliteIntegrityError # Load testing environment if 'pytest' in sys.modules: @@ -165,8 +166,21 @@ class BaseClass(Base): self.__database_session__.commit() except Exception as e: logger.critical(f"Problem saving object: {e}") + logger.error(f"Error message: {type(e)}") + match e: + case sqlalcIntegrityError(): + origin = e.orig.__str__().lower() + logger.debug(f"Exception origin: {origin}") + if "unique constraint failed:" in origin: + field = origin.split(".")[1].replace("_", " ").upper() + logger.debug(field) + msg = f"{field} doesn't have a unique value.\nIt must be changed." + else: + msg = f"Got unknown integrity error: {e}" + case _: + msg = f"Got generic error: {e}" self.__database_session__.rollback() - report.add_result(Result(msg=f"Problem saving object {e}", status="Critical")) + report.add_result(Result(msg=msg, status="Critical")) return report diff --git a/src/submissions/backend/db/models/controls.py b/src/submissions/backend/db/models/controls.py index 25711fa..f0bbe5d 100644 --- a/src/submissions/backend/db/models/controls.py +++ b/src/submissions/backend/db/models/controls.py @@ -142,20 +142,22 @@ class Control(BaseClass): kraken_cnt_total = sum([kraken[item]['kraken_count'] for item in kraken]) # logger.debug("Creating new kraken.") new_kraken = [dict(name=item, kraken_count=kraken[item]['kraken_count'], - kraken_percent="{0:.0%}".format(kraken[item]['kraken_count'] / kraken_cnt_total)) for item in - kraken] + kraken_percent="{0:.0%}".format(kraken[item]['kraken_count'] / kraken_cnt_total), + target=item in self.controltype.targets) + for item in kraken] + # logger.debug(f"New kraken before sort: {new_kraken}") new_kraken = sorted(new_kraken, key=itemgetter('kraken_count'), reverse=True) # logger.debug("setting targets") - if not self.controltype.targets: - targets = ["None"] - else: + if self.controltype.targets: targets = self.controltype.targets + else: + targets = ["None"] # logger.debug("constructing output dictionary") output = { "name": self.name, "type": self.controltype.name, "targets": ", ".join(targets), - "kraken": new_kraken[0:5] + "kraken": new_kraken[0:10] } return output diff --git a/src/submissions/backend/db/models/submissions.py b/src/submissions/backend/db/models/submissions.py index 8d02568..6744047 100644 --- a/src/submissions/backend/db/models/submissions.py +++ b/src/submissions/backend/db/models/submissions.py @@ -645,7 +645,7 @@ class BasicSubmission(BaseClass): # logger.debug("Saving submission.") if original: self.uploaded_by = getuser() - super().save() + return super().save() @classmethod def get_regex(cls, submission_type:SubmissionType|str|None=None): diff --git a/src/submissions/frontend/widgets/submission_widget.py b/src/submissions/frontend/widgets/submission_widget.py index 42c099a..f3a813d 100644 --- a/src/submissions/frontend/widgets/submission_widget.py +++ b/src/submissions/frontend/widgets/submission_widget.py @@ -377,11 +377,18 @@ class SubmissionFormWidget(QWidget): # logger.debug(f"Updating: {reagent} with {reagent.lot}") reagent.update_last_used(kit=base_submission.extraction_kit) # logger.debug(f"Final reagents: {pformat(base_submission.reagents)}") - base_submission.save() + save_output = base_submission.save() + # logger.debug(f"Save output: {save_output}") # NOTE: update summary sheet self.app.table_widget.sub_wid.setData() # NOTE: reset form - self.setParent(None) + try: + check = save_output.results == [] + except AttributeError: + logger.error(f"No save output, check passes") + check = True + if check: + self.setParent(None) # logger.debug(f"All attributes of obj: {pformat(self.__dict__)}") return report diff --git a/src/submissions/templates/bacterialculture_details.html b/src/submissions/templates/bacterialculture_details.html index 8d9c4b2..cb0d72d 100644 --- a/src/submissions/templates/bacterialculture_details.html +++ b/src/submissions/templates/bacterialculture_details.html @@ -14,7 +14,7 @@ {% for item in sub['controls'] %}

   {{ item['name'] }}: {{ item['type'] }} (Targets: {{ item['targets'] }})

{% if item['kraken'] %} -

   {{ item['name'] }} Top 5 Kraken Results:

+

   {{ item['name'] }} Top 10 Kraken Results:

{% for genera in item['kraken'] %}         {{ genera['name'] }}: {{ genera['kraken_count'] }} ({{ genera['kraken_percent'] }})
{% endfor %}