Post code-cleanup

This commit is contained in:
lwark
2025-01-21 15:18:37 -06:00
parent bf711369c6
commit bc4af61f5f
26 changed files with 546 additions and 377 deletions

View File

@@ -9,16 +9,15 @@ from PyQt6.QtCore import pyqtSignal, Qt, QSignalBlocker
from .functions import select_open_file, select_save_file
import logging
from pathlib import Path
from tools import Report, Result, check_not_nan, main_form_style, report_result
from tools import Report, Result, check_not_nan, main_form_style, report_result, get_application_from_parent
from backend.excel.parser import SheetParser
from backend.validators import PydSubmission, PydReagent
from backend.db import (
KitType, Organization, SubmissionType, Reagent,
Organization, SubmissionType, Reagent,
ReagentRole, KitTypeReagentRoleAssociation, BasicSubmission
)
from pprint import pformat
from .pop_ups import QuestionAsker, AlertPop
from .misc import AddReagentForm
from .omni_add_edit import AddEdit
from typing import List, Tuple
from datetime import date
@@ -67,7 +66,6 @@ class SubmissionFormContainer(QWidget):
def __init__(self, parent: QWidget) -> None:
super().__init__(parent)
self.app = self.parent().parent()
self.report = Report()
self.setStyleSheet('background-color: light grey;')
self.setAcceptDrops(True)
# NOTE: if import_drag is emitted, importSubmission will fire
@@ -97,12 +95,12 @@ class SubmissionFormContainer(QWidget):
"""
self.app.raise_()
self.app.activateWindow()
self.report = Report()
report = Report()
self.import_submission_function(fname)
return self.report
return report
@report_result
def import_submission_function(self, fname: Path | None = None):
def import_submission_function(self, fname: Path | None = None) -> Report:
"""
Import a new submission to the app window
@@ -110,10 +108,11 @@ class SubmissionFormContainer(QWidget):
obj (QMainWindow): original app window
Returns:
Tuple[QMainWindow, dict|None]: Collection of new main app window and result dict
Report: Object to give results of import.
"""
logger.info(f"\n\nStarting Import...\n\n")
report = Report()
# NOTE: Clear any previous forms.
try:
self.form.setParent(None)
except AttributeError:
@@ -141,7 +140,16 @@ class SubmissionFormContainer(QWidget):
return report
@report_result
def new_add_reagent(self, instance: Reagent | None = None):
def add_reagent(self, instance: Reagent | None = None):
"""
Action to create new reagent in DB.
Args:
instance (Reagent | None): Blank reagent instance to be edited and then added.
Returns:
models.Reagent: the constructed reagent object to add to submission
"""
report = Report()
if not instance:
instance = Reagent()
@@ -149,48 +157,12 @@ class SubmissionFormContainer(QWidget):
if dlg.exec():
reagent = dlg.parse_form()
reagent.missing = False
# logger.debug(f"Reagent: {reagent}, result: {result}")
# report.add_result(result)
# NOTE: send reagent to db
sqlobj = reagent.to_sql()
sqlobj.save()
logger.debug(f"Reagent added!")
report.add_result(Result(owner=__name__, code=0, msg="New reagent created.", status="Information"))
# report.add_result(result)
return reagent, report
@report_result
def add_reagent(self, reagent_lot: str | None = None, reagent_role: str | None = None, expiry: date | None = None,
name: str | None = None, kit: str | KitType | None = None) -> Tuple[PydReagent, Report]:
"""
Action to create new reagent in DB.
Args:
reagent_lot (str | None, optional): Parsed reagent from import form. Defaults to None.
reagent_role (str | None, optional): Parsed reagent type from import form. Defaults to None.
expiry (date | None, optional): Parsed reagent expiry data. Defaults to None.
name (str | None, optional): Parsed reagent name. Defaults to None.
Returns:
models.Reagent: the constructed reagent object to add to submission
"""
report = Report()
if isinstance(reagent_lot, bool):
reagent_lot = ""
# NOTE: create form
dlg = AddReagentForm(reagent_lot=reagent_lot, reagent_role=reagent_role, expiry=expiry, reagent_name=name,
kit=kit)
if dlg.exec():
# NOTE: extract form info
info = dlg.parse_form()
# NOTE: create reagent object
reagent = PydReagent(ctx=self.app.ctx, **info, missing=False)
# NOTE: send reagent to db
sqlobj = reagent.to_sql()
sqlobj.save()
# report.add_result(result)
return reagent
class SubmissionFormWidget(QWidget):
update_reagent_fields = ['extraction_kit']
@@ -199,12 +171,12 @@ class SubmissionFormWidget(QWidget):
super().__init__(parent)
if disable is None:
disable = []
self.app = parent.app
self.app = get_application_from_parent(parent)
self.pyd = submission
self.missing_info = []
self.submission_type = SubmissionType.query(name=self.pyd.submission_type['value'])
st = self.submission_type.submission_class
defaults = st.get_default_info("form_recover", "form_ignore", submission_type=self.pyd.submission_type['value'])
basic_submission_class = self.submission_type.submission_class
defaults = basic_submission_class.get_default_info("form_recover", "form_ignore", submission_type=self.pyd.submission_type['value'])
self.recover = defaults['form_recover']
self.ignore = defaults['form_ignore']
self.layout = QVBoxLayout()
@@ -225,7 +197,7 @@ class SubmissionFormWidget(QWidget):
except KeyError:
value = dict(value=None, missing=True)
add_widget = self.create_widget(key=k, value=value, submission_type=self.submission_type,
sub_obj=st, disable=check)
sub_obj=basic_submission_class, disable=check)
if add_widget is not None:
self.layout.addWidget(add_widget)
if k in self.__class__.update_reagent_fields:
@@ -302,10 +274,9 @@ class SubmissionFormWidget(QWidget):
if isinstance(reagent, self.ReagentFormWidget) or isinstance(reagent, QPushButton):
reagent.setParent(None)
reagents, integrity_report, missing_reagents = self.pyd.check_kit_integrity(extraction_kit=self.extraction_kit)
logger.debug(f"Reagents: {reagents}")
# logger.debug(f"Reagents: {reagents}")
expiry_report = self.pyd.check_reagent_expiries(exempt=missing_reagents)
for reagent in reagents:
add_widget = self.ReagentFormWidget(parent=self, reagent=reagent, extraction_kit=self.extraction_kit)
self.layout.addWidget(add_widget)
report.add_result(integrity_report)
@@ -340,9 +311,12 @@ class SubmissionFormWidget(QWidget):
Returns:
List[QWidget]: Widgets matching filter
"""
query = self.findChildren(QWidget)
if object_name is not None:
query = [widget for widget in query if widget.objectName() == object_name]
if object_name:
query = self.findChildren(QWidget, name=object_name)
else:
query = self.findChildren(QWidget)
# if object_name is not None:
# query = [widget for widget in query if widget.objectName() == object_name]
return query
@report_result
@@ -581,13 +555,13 @@ class SubmissionFormWidget(QWidget):
parent.extraction_kit = add_widget.currentText()
case 'submission_category':
add_widget = MyQComboBox(scrollWidget=parent)
cats = ['Diagnostic', "Surveillance", "Research"]
cats += [item.name for item in SubmissionType.query()]
categories = ['Diagnostic', "Surveillance", "Research"]
categories += [item.name for item in SubmissionType.query()]
try:
cats.insert(0, cats.pop(cats.index(value)))
categories.insert(0, categories.pop(categories.index(value)))
except ValueError:
cats.insert(0, cats.pop(cats.index(submission_type)))
add_widget.addItems(cats)
categories.insert(0, categories.pop(categories.index(submission_type)))
add_widget.addItems(categories)
add_widget.setToolTip("Enter submission category or select from list.")
case _:
if key in sub_obj.timestamps:
@@ -655,7 +629,8 @@ class SubmissionFormWidget(QWidget):
def __init__(self, parent: QWidget, reagent: PydReagent, extraction_kit: str):
super().__init__(parent)
self.app = self.parent().parent().parent().parent().parent().parent().parent().parent()
self.parent = parent
self.app = get_application_from_parent(parent)
self.reagent = reagent
self.extraction_kit = extraction_kit
layout = QGridLayout()
@@ -684,10 +659,11 @@ class SubmissionFormWidget(QWidget):
def disable(self):
self.lot.setEnabled(self.check.isChecked())
self.label.setEnabled(self.check.isChecked())
if not any([item.lot.isEnabled() for item in self.parent().findChildren(self.__class__)]):
self.parent().disabler.checkbox.setChecked(False)
else:
self.parent().disabler.checkbox.setChecked(True)
with QSignalBlocker(self.parent.disabler.checkbox) as blocker:
if any([item.lot.isEnabled() for item in self.parent.findChildren(self.__class__)]):
self.parent.disabler.checkbox.setChecked(True)
else:
self.parent.disabler.checkbox.setChecked(False)
@report_result
def parse_form(self) -> Tuple[PydReagent | None, Report]:
@@ -703,31 +679,23 @@ class SubmissionFormWidget(QWidget):
lot = self.lot.currentText()
wanted_reagent, new = Reagent.query_or_create(lot=lot, role=self.reagent.role, expiry=self.reagent.expiry)
# NOTE: if reagent doesn't exist in database, offer to add it (uses App.add_reagent)
logger.debug(f"Wanted reagent: {wanted_reagent}, New: {new}")
# if wanted_reagent is None:
if new:
dlg = QuestionAsker(title=f"Add {lot}?",
message=f"Couldn't find reagent type {self.reagent.role}: {lot} in the database.\n\nWould you like to add it?")
if dlg.exec():
wanted_reagent = self.parent().parent().new_add_reagent(instance=wanted_reagent)
logger.debug(f"Reagent added!")
report.add_result(Result(owner=__name__, code=0, msg="New reagent created.", status="Information"))
return wanted_reagent, report
else:
# NOTE: In this case we will have an empty reagent and the submission will fail kit integrity check
return None, report
else:
# NOTE: Since this now gets passed in directly from the parser -> pyd -> form and the parser gets the name
# from the db, it should no longer be necessary to query the db with reagent/kit, but with rt name directly.
# NOTE: Since this now gets passed in directly from the parser -> pyd -> form and the parser gets the name from the db, it should no longer be necessary to query the db with reagent/kit, but with rt name directly.
rt = ReagentRole.query(name=self.reagent.role)
logger.debug(f"Reagent role: {rt}")
if rt is None:
rt = ReagentRole.query(kit_type=self.extraction_kit, reagent=wanted_reagent)
final = PydReagent(name=wanted_reagent.name, lot=wanted_reagent.lot, role=rt.name,
expiry=wanted_reagent.expiry.date(), missing=False)
logger.debug(f"Final Reagent: {final}")
return final, report
def updated(self):
@@ -781,10 +749,11 @@ class SubmissionFormWidget(QWidget):
looked_up_reg = None
if looked_up_reg:
try:
relevant_reagents.remove(str(looked_up_reg.lot))
# relevant_reagents.remove(str(looked_up_reg.lot))
relevant_reagents.insert(0, relevant_reagents.pop(relevant_reagents.index(looked_up_reg.lot)))
except ValueError as e:
logger.error(f"Error reordering relevant reagents: {e}")
relevant_reagents.insert(0, str(looked_up_reg.lot))
# relevant_reagents.insert(0, str(looked_up_reg.lot))
else:
if len(relevant_reagents) > 1:
idx = relevant_reagents.index(str(reagent.lot))