Improved error messaging when saving submissions.

This commit is contained in:
lwark
2024-09-11 12:00:43 -05:00
parent 220c74a06d
commit d52fa36150
6 changed files with 44 additions and 13 deletions

View File

@@ -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. - Improved scraping for gel info of Artic submissions.

View File

@@ -6,10 +6,11 @@ import sys, logging
from sqlalchemy import Column, INTEGER, String, JSON from sqlalchemy import Column, INTEGER, String, JSON
from sqlalchemy.orm import DeclarativeMeta, declarative_base, Query, Session from sqlalchemy.orm import DeclarativeMeta, declarative_base, Query, Session
from sqlalchemy.ext.declarative import declared_attr 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 typing import Any, List
from pathlib import Path from pathlib import Path
from tools import report_result from tools import report_result
# from sqlite3 import IntegrityError as sqliteIntegrityError
# Load testing environment # Load testing environment
if 'pytest' in sys.modules: if 'pytest' in sys.modules:
@@ -165,8 +166,21 @@ class BaseClass(Base):
self.__database_session__.commit() self.__database_session__.commit()
except Exception as e: except Exception as e:
logger.critical(f"Problem saving object: {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() 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 return report

View File

@@ -142,20 +142,22 @@ class Control(BaseClass):
kraken_cnt_total = sum([kraken[item]['kraken_count'] for item in kraken]) kraken_cnt_total = sum([kraken[item]['kraken_count'] for item in kraken])
# logger.debug("Creating new kraken.") # logger.debug("Creating new kraken.")
new_kraken = [dict(name=item, kraken_count=kraken[item]['kraken_count'], 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_percent="{0:.0%}".format(kraken[item]['kraken_count'] / kraken_cnt_total),
kraken] 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) new_kraken = sorted(new_kraken, key=itemgetter('kraken_count'), reverse=True)
# logger.debug("setting targets") # logger.debug("setting targets")
if not self.controltype.targets: if self.controltype.targets:
targets = ["None"]
else:
targets = self.controltype.targets targets = self.controltype.targets
else:
targets = ["None"]
# logger.debug("constructing output dictionary") # logger.debug("constructing output dictionary")
output = { output = {
"name": self.name, "name": self.name,
"type": self.controltype.name, "type": self.controltype.name,
"targets": ", ".join(targets), "targets": ", ".join(targets),
"kraken": new_kraken[0:5] "kraken": new_kraken[0:10]
} }
return output return output

View File

@@ -645,7 +645,7 @@ class BasicSubmission(BaseClass):
# logger.debug("Saving submission.") # logger.debug("Saving submission.")
if original: if original:
self.uploaded_by = getuser() self.uploaded_by = getuser()
super().save() return super().save()
@classmethod @classmethod
def get_regex(cls, submission_type:SubmissionType|str|None=None): def get_regex(cls, submission_type:SubmissionType|str|None=None):

View File

@@ -377,11 +377,18 @@ class SubmissionFormWidget(QWidget):
# logger.debug(f"Updating: {reagent} with {reagent.lot}") # logger.debug(f"Updating: {reagent} with {reagent.lot}")
reagent.update_last_used(kit=base_submission.extraction_kit) reagent.update_last_used(kit=base_submission.extraction_kit)
# logger.debug(f"Final reagents: {pformat(base_submission.reagents)}") # 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 # NOTE: update summary sheet
self.app.table_widget.sub_wid.setData() self.app.table_widget.sub_wid.setData()
# NOTE: reset form # 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__)}") # logger.debug(f"All attributes of obj: {pformat(self.__dict__)}")
return report return report

View File

@@ -14,7 +14,7 @@
{% for item in sub['controls'] %} {% for item in sub['controls'] %}
<p>&nbsp;&nbsp;&nbsp;<b>{{ item['name'] }}:</b> {{ item['type'] }} (Targets: {{ item['targets'] }})</p> <p>&nbsp;&nbsp;&nbsp;<b>{{ item['name'] }}:</b> {{ item['type'] }} (Targets: {{ item['targets'] }})</p>
{% if item['kraken'] %} {% if item['kraken'] %}
<p>&nbsp;&nbsp;&nbsp;{{ item['name'] }} Top 5 Kraken Results:</p> <p>&nbsp;&nbsp;&nbsp;{{ item['name'] }} Top 10 Kraken Results:</p>
<p>{% for genera in item['kraken'] %} <p>{% for genera in item['kraken'] %}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ genera['name'] }}: {{ genera['kraken_count'] }} ({{ genera['kraken_percent'] }})<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ genera['name'] }}: {{ genera['kraken_count'] }} ({{ genera['kraken_percent'] }})<br>
{% endfor %}</p> {% endfor %}</p>