Improved error messaging when saving submissions.
This commit is contained in:
10
CHANGELOG.md
10
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.
|
- Improved scraping for gel info of Artic submissions.
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
{% for item in sub['controls'] %}
|
{% for item in sub['controls'] %}
|
||||||
<p> <b>{{ item['name'] }}:</b> {{ item['type'] }} (Targets: {{ item['targets'] }})</p>
|
<p> <b>{{ item['name'] }}:</b> {{ item['type'] }} (Targets: {{ item['targets'] }})</p>
|
||||||
{% if item['kraken'] %}
|
{% if item['kraken'] %}
|
||||||
<p> {{ item['name'] }} Top 5 Kraken Results:</p>
|
<p> {{ item['name'] }} Top 10 Kraken Results:</p>
|
||||||
<p>{% for genera in item['kraken'] %}
|
<p>{% for genera in item['kraken'] %}
|
||||||
{{ genera['name'] }}: {{ genera['kraken_count'] }} ({{ genera['kraken_percent'] }})<br>
|
{{ genera['name'] }}: {{ genera['kraken_count'] }} ({{ genera['kraken_percent'] }})<br>
|
||||||
{% endfor %}</p>
|
{% endfor %}</p>
|
||||||
|
|||||||
Reference in New Issue
Block a user