Code cleanup, dependency update, various bug fixes
This commit is contained in:
@@ -48,7 +48,7 @@ def create_charts(ctx:Settings, df:pd.DataFrame, ytitle:str|None=None) -> Figure
|
||||
# Set descending for any columns that have "{mode}" in the header.
|
||||
ascending = [False if item == "target" else True for item in sorts]
|
||||
df = df.sort_values(by=sorts, ascending=ascending)
|
||||
logger.debug(df[df.isna().any(axis=1)])
|
||||
# logger.debug(df[df.isna().any(axis=1)])
|
||||
# actual chart construction is done by
|
||||
fig = construct_chart(df=df, modes=modes, ytitle=ytitle)
|
||||
return fig
|
||||
|
||||
@@ -25,7 +25,7 @@ logger.info("Hello, I am a logger")
|
||||
class App(QMainWindow):
|
||||
|
||||
def __init__(self, ctx: Settings = None):
|
||||
logger.debug(f"Initializing main window...")
|
||||
# logger.debug(f"Initializing main window...")
|
||||
super().__init__()
|
||||
self.ctx = ctx
|
||||
self.last_dir = ctx.directory_path
|
||||
@@ -58,7 +58,7 @@ class App(QMainWindow):
|
||||
"""
|
||||
adds items to menu bar
|
||||
"""
|
||||
logger.debug(f"Creating menu bar...")
|
||||
# logger.debug(f"Creating menu bar...")
|
||||
menuBar = self.menuBar()
|
||||
fileMenu = menuBar.addMenu("&File")
|
||||
# Creating menus using a title
|
||||
@@ -79,7 +79,7 @@ class App(QMainWindow):
|
||||
"""
|
||||
adds items to toolbar
|
||||
"""
|
||||
logger.debug(f"Creating toolbar...")
|
||||
# logger.debug(f"Creating toolbar...")
|
||||
toolbar = QToolBar("My main toolbar")
|
||||
self.addToolBar(toolbar)
|
||||
toolbar.addAction(self.addReagentAction)
|
||||
@@ -90,7 +90,7 @@ class App(QMainWindow):
|
||||
"""
|
||||
creates actions
|
||||
"""
|
||||
logger.debug(f"Creating actions...")
|
||||
# logger.debug(f"Creating actions...")
|
||||
self.importAction = QAction("&Import Submission", self)
|
||||
# self.importPCRAction = QAction("&Import PCR Results", self)
|
||||
self.addReagentAction = QAction("Add Reagent", self)
|
||||
@@ -107,7 +107,7 @@ class App(QMainWindow):
|
||||
"""
|
||||
connect menu and tool bar item to functions
|
||||
"""
|
||||
logger.debug(f"Connecting actions...")
|
||||
# logger.debug(f"Connecting actions...")
|
||||
self.importAction.triggered.connect(self.table_widget.formwidget.importSubmission)
|
||||
# self.importPCRAction.triggered.connect(self.table_widget.formwidget.import_pcr_results)
|
||||
self.addReagentAction.triggered.connect(self.table_widget.formwidget.add_reagent)
|
||||
@@ -134,7 +134,7 @@ class App(QMainWindow):
|
||||
url = Path(sys._MEIPASS).joinpath("files", "docs", "index.html")
|
||||
else:
|
||||
url = Path("docs\\build\\index.html").absolute()
|
||||
logger.debug(f"Attempting to open {url}")
|
||||
# logger.debug(f"Attempting to open {url}")
|
||||
webbrowser.get('windows-default').open(f"file://{url.__str__()}")
|
||||
|
||||
def result_reporter(self):
|
||||
@@ -144,11 +144,11 @@ class App(QMainWindow):
|
||||
Args:
|
||||
result (dict | None, optional): The result from a function. Defaults to None.
|
||||
"""
|
||||
logger.debug(f"Running results reporter for: {self.report.results}")
|
||||
# logger.debug(f"Running results reporter for: {self.report.results}")
|
||||
if len(self.report.results) > 0:
|
||||
logger.debug(f"We've got some results!")
|
||||
# logger.debug(f"We've got some results!")
|
||||
for result in self.report.results:
|
||||
logger.debug(f"Showing result: {result}")
|
||||
# logger.debug(f"Showing result: {result}")
|
||||
if result != None:
|
||||
alert = result.report()
|
||||
if alert.exec():
|
||||
@@ -164,17 +164,17 @@ class App(QMainWindow):
|
||||
def backup_database(self):
|
||||
month = date.today().strftime("%Y-%m")
|
||||
# day = date.today().strftime("%Y-%m-%d")
|
||||
logger.debug(f"Here is the db directory: {self.ctx.database_path}")
|
||||
logger.debug(f"Here is the backup directory: {self.ctx.backup_path}")
|
||||
# logger.debug(f"Here is the db directory: {self.ctx.database_path}")
|
||||
# logger.debug(f"Here is the backup directory: {self.ctx.backup_path}")
|
||||
current_month_bak = Path(self.ctx.backup_path).joinpath(f"submissions_backup-{month}").resolve().with_suffix(".db")
|
||||
if not current_month_bak.exists() and "demo" not in self.ctx.database_path.__str__():
|
||||
logger.debug("No backup found for this month, backing up database.")
|
||||
logger.info("No backup found for this month, backing up database.")
|
||||
shutil.copyfile(self.ctx.database_path, current_month_bak)
|
||||
|
||||
class AddSubForm(QWidget):
|
||||
|
||||
def __init__(self, parent:QWidget):
|
||||
logger.debug(f"Initializating subform...")
|
||||
# logger.debug(f"Initializating subform...")
|
||||
super(QWidget, self).__init__(parent)
|
||||
self.layout = QVBoxLayout(self)
|
||||
# Initialize tab screen
|
||||
|
||||
@@ -112,13 +112,13 @@ class ControlsViewer(QWidget):
|
||||
Tuple[QMainWindow, dict]: Collection of new main app window and result dict
|
||||
"""
|
||||
report = Report()
|
||||
logger.debug(f"Control getter context: \n\tControl type: {self.con_type}\n\tMode: {self.mode}\n\tStart Date: {self.start_date}\n\tEnd Date: {self.end_date}")
|
||||
# logger.debug(f"Control getter context: \n\tControl type: {self.con_type}\n\tMode: {self.mode}\n\tStart Date: {self.start_date}\n\tEnd Date: {self.end_date}")
|
||||
# set the subtype for kraken
|
||||
if self.sub_typer.currentText() == "":
|
||||
self.subtype = None
|
||||
else:
|
||||
self.subtype = self.sub_typer.currentText()
|
||||
logger.debug(f"Subtype: {self.subtype}")
|
||||
# logger.debug(f"Subtype: {self.subtype}")
|
||||
# query all controls using the type/start and end dates from the gui
|
||||
controls = Control.query(control_type=self.con_type, start_date=self.start_date, end_date=self.end_date)
|
||||
# if no data found from query set fig to none for reporting in webview
|
||||
@@ -129,7 +129,7 @@ class ControlsViewer(QWidget):
|
||||
data = [control.convert_by_mode(mode=self.mode) for control in controls]
|
||||
# flatten data to one dimensional list
|
||||
data = [item for sublist in data for item in sublist]
|
||||
logger.debug(f"Control objects going into df conversion: {type(data)}")
|
||||
# logger.debug(f"Control objects going into df conversion: {type(data)}")
|
||||
if data == []:
|
||||
self.report.add_result(Result(status="Critical", msg="No data found for controls in given date range."))
|
||||
return
|
||||
@@ -141,13 +141,13 @@ class ControlsViewer(QWidget):
|
||||
title = f"{self.mode} - {self.subtype}"
|
||||
# send dataframe to chart maker
|
||||
fig = create_charts(ctx=self.app.ctx, df=df, ytitle=title)
|
||||
logger.debug(f"Updating figure...")
|
||||
# logger.debug(f"Updating figure...")
|
||||
# construct html for webview
|
||||
html = construct_html(figure=fig)
|
||||
logger.debug(f"The length of html code is: {len(html)}")
|
||||
# logger.debug(f"The length of html code is: {len(html)}")
|
||||
self.webengineview.setHtml(html)
|
||||
self.webengineview.update()
|
||||
logger.debug("Figure updated... I hope.")
|
||||
# logger.debug("Figure updated... I hope.")
|
||||
self.report.add_result(report)
|
||||
|
||||
class ControlsDatePicker(QWidget):
|
||||
|
||||
@@ -17,9 +17,9 @@ class EquipmentUsage(QDialog):
|
||||
self.setWindowTitle("Equipment Checklist")
|
||||
self.used_equipment = self.submission.get_used_equipment()
|
||||
self.kit = self.submission.extraction_kit
|
||||
logger.debug(f"Existing equipment: {self.used_equipment}")
|
||||
# logger.debug(f"Existing equipment: {self.used_equipment}")
|
||||
self.opt_equipment = submission.submission_type.get_equipment()
|
||||
logger.debug(f"EquipmentRoles: {self.opt_equipment}")
|
||||
# logger.debug(f"EquipmentRoles: {self.opt_equipment}")
|
||||
self.layout = QVBoxLayout()
|
||||
self.setLayout(self.layout)
|
||||
self.populate_form()
|
||||
@@ -115,9 +115,9 @@ class RoleComboBox(QWidget):
|
||||
Changes processes when equipment is changed
|
||||
"""
|
||||
equip = self.box.currentText()
|
||||
logger.debug(f"Updating equipment: {equip}")
|
||||
# logger.debug(f"Updating equipment: {equip}")
|
||||
equip2 = [item for item in self.role.equipment if item.name==equip][0]
|
||||
logger.debug(f"Using: {equip2}")
|
||||
# logger.debug(f"Using: {equip2}")
|
||||
self.process.clear()
|
||||
self.process.addItems([item for item in equip2.processes if item in self.role.processes])
|
||||
|
||||
|
||||
@@ -145,5 +145,5 @@ class ControlsForm(QWidget):
|
||||
dicto['values'].append(dict(name=label[1], value=le.text()))
|
||||
if label[0] not in [item['name'] for item in output]:
|
||||
output.append(dicto)
|
||||
logger.debug(pformat(output))
|
||||
# logger.debug(pformat(output))
|
||||
return output, self.comment_field.toPlainText()
|
||||
|
||||
@@ -93,10 +93,10 @@ class KitAdder(QWidget):
|
||||
# get form info
|
||||
info, reagents = self.parse_form()
|
||||
info = {k:v for k,v in info.items() if k in [column.name for column in self.columns] + ['kit_name', 'used_for']}
|
||||
logger.debug(f"kit info: {pformat(info)}")
|
||||
logger.debug(f"kit reagents: {pformat(reagents)}")
|
||||
# logger.debug(f"kit info: {pformat(info)}")
|
||||
# logger.debug(f"kit reagents: {pformat(reagents)}")
|
||||
info['reagent_types'] = reagents
|
||||
logger.debug(pformat(info))
|
||||
# logger.debug(pformat(info))
|
||||
# send to kit constructor
|
||||
kit = PydKit(name=info['kit_name'])
|
||||
for reagent in info['reagent_types']:
|
||||
@@ -108,7 +108,7 @@ class KitAdder(QWidget):
|
||||
'expiry':reagent['expiry']
|
||||
}}
|
||||
kit.reagent_types.append(PydReagentType(name=reagent['rtname'], eol_ext=reagent['eol'], uses=uses))
|
||||
logger.debug(f"Output pyd object: {kit.__dict__}")
|
||||
# logger.debug(f"Output pyd object: {kit.__dict__}")
|
||||
sqlobj, result = kit.toSQL(self.ctx)
|
||||
report.add_result(result=result)
|
||||
sqlobj.save()
|
||||
@@ -122,7 +122,7 @@ class KitAdder(QWidget):
|
||||
Returns:
|
||||
Tuple[dict, list]: dict=info, list=reagents
|
||||
"""
|
||||
logger.debug(f"Hello from {self.__class__} parser!")
|
||||
# logger.debug(f"Hello from {self.__class__} parser!")
|
||||
info = {}
|
||||
reagents = []
|
||||
widgets = [widget for widget in self.findChildren(QWidget) if widget.objectName() not in self.ignore and not isinstance(widget.parent(), ReagentTypeForm)]
|
||||
@@ -153,7 +153,7 @@ class ReagentTypeForm(QWidget):
|
||||
self.reagent_getter.setObjectName("rtname")
|
||||
# lookup all reagent type names from db
|
||||
lookup = ReagentType.query()
|
||||
logger.debug(f"Looked up ReagentType names: {lookup}")
|
||||
# logger.debug(f"Looked up ReagentType names: {lookup}")
|
||||
self.reagent_getter.addItems([item.name for item in lookup])
|
||||
self.reagent_getter.setEditable(True)
|
||||
grid.addWidget(self.reagent_getter,0,1)
|
||||
@@ -205,14 +205,14 @@ class ReagentTypeForm(QWidget):
|
||||
Returns:
|
||||
dict: _description_
|
||||
"""
|
||||
logger.debug(f"Hello from {self.__class__} parser!")
|
||||
# logger.debug(f"Hello from {self.__class__} parser!")
|
||||
info = {}
|
||||
info['eol'] = self.eol.value()
|
||||
info['sheet'] = self.location_sheet_name.text()
|
||||
info['rtname'] = self.reagent_getter.currentText()
|
||||
widgets = [widget for widget in self.findChildren(QWidget) if widget.objectName() not in self.ignore]
|
||||
for widget in widgets:
|
||||
logger.debug(f"Parsed widget: {widget.objectName()} of type {type(widget)} with parent {widget.parent()}")
|
||||
# logger.debug(f"Parsed widget: {widget.objectName()} of type {type(widget)} with parent {widget.parent()}")
|
||||
match widget:
|
||||
case QLineEdit():
|
||||
info[widget.objectName()] = widget.text()
|
||||
@@ -225,7 +225,7 @@ class ReagentTypeForm(QWidget):
|
||||
key, sub_key = widget.objectName().split("_")
|
||||
if key not in info.keys():
|
||||
info[key] = {}
|
||||
logger.debug(f"Adding key {key}, {sub_key} and value {widget.value()} to {info}")
|
||||
# logger.debug(f"Adding key {key}, {sub_key} and value {widget.value()} to {info}")
|
||||
info[key][sub_key] = widget.value()
|
||||
return info
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ class AddReagentForm(QDialog):
|
||||
self.type_input = QComboBox()
|
||||
self.type_input.setObjectName('type')
|
||||
self.type_input.addItems([item.name for item in ReagentType.query()])
|
||||
logger.debug(f"Trying to find index of {reagent_type}")
|
||||
# logger.debug(f"Trying to find index of {reagent_type}")
|
||||
# convert input to user friendly string?
|
||||
try:
|
||||
reagent_type = reagent_type.replace("_", " ").title()
|
||||
@@ -97,7 +97,7 @@ class AddReagentForm(QDialog):
|
||||
"""
|
||||
Updates reagent names form field with examples from reagent type
|
||||
"""
|
||||
logger.debug(self.type_input.currentText())
|
||||
# logger.debug(self.type_input.currentText())
|
||||
self.name_input.clear()
|
||||
lookup = Reagent.query(reagent_type=self.type_input.currentText())
|
||||
self.name_input.addItems(list(set([item.name for item in lookup])))
|
||||
@@ -210,7 +210,7 @@ class LogParser(QDialog):
|
||||
"""
|
||||
count: int = 0
|
||||
total: int = 0
|
||||
logger.debug(f"Current search term: {self.phrase_looker.currentText()}")
|
||||
# logger.debug(f"Current search term: {self.phrase_looker.currentText()}")
|
||||
try:
|
||||
with open(self.fname, "r") as f:
|
||||
for chunk in readInChunks(fileObj=f):
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from PyQt6.QtWidgets import (QDialog, QScrollArea, QPushButton, QVBoxLayout, QMessageBox,
|
||||
from PyQt6.QtWidgets import (QDialog, QPushButton, QVBoxLayout, QMessageBox,
|
||||
QDialogButtonBox, QTextEdit)
|
||||
from PyQt6.QtWebEngineWidgets import QWebEngineView
|
||||
from PyQt6.QtWebChannel import QWebChannel
|
||||
@@ -10,7 +10,6 @@ from .functions import select_save_file
|
||||
from io import BytesIO
|
||||
from tempfile import TemporaryFile, TemporaryDirectory
|
||||
from pathlib import Path
|
||||
# from xhtml2pdf import pisa
|
||||
import logging, base64
|
||||
from getpass import getuser
|
||||
from datetime import datetime
|
||||
@@ -33,24 +32,19 @@ class SubmissionDetails(QDialog):
|
||||
self.app = parent.parent().parent().parent().parent().parent().parent()
|
||||
except AttributeError:
|
||||
self.app = None
|
||||
# self.setWindowTitle(f"Submission Details - {sub.rsl_plate_num}")
|
||||
# create scrollable interior
|
||||
interior = QScrollArea()
|
||||
interior.setParent(self)
|
||||
self.webview = QWebEngineView(parent=self)
|
||||
self.webview.setMinimumSize(900, 500)
|
||||
self.webview.setMaximumSize(900, 500)
|
||||
# self.webview.setHtml(self.html)
|
||||
self.layout = QVBoxLayout()
|
||||
interior.resize(900, 500)
|
||||
interior.setWidget(self.webview)
|
||||
self.setFixedSize(900, 500)
|
||||
# button to export a pdf version
|
||||
# NOTE: button to export a pdf version
|
||||
btn = QPushButton("Export PDF")
|
||||
btn.setParent(self)
|
||||
btn.setFixedWidth(900)
|
||||
btn.setFixedWidth(875)
|
||||
btn.clicked.connect(self.export)
|
||||
# setup channel
|
||||
self.layout.addWidget(btn)
|
||||
self.layout.addWidget(self.webview)
|
||||
self.setLayout(self.layout)
|
||||
# NOTE: setup channel
|
||||
self.channel = QWebChannel()
|
||||
self.channel.registerObject('backend', self)
|
||||
self.submission_details(submission=sub)
|
||||
@@ -80,31 +74,25 @@ class SubmissionDetails(QDialog):
|
||||
Args:
|
||||
submission (str | BasicSubmission): Submission of interest.
|
||||
"""
|
||||
logger.debug(f"Details for: {submission}")
|
||||
# logger.debug(f"Details for: {submission}")
|
||||
if isinstance(submission, str):
|
||||
# submission = BasicSubmission.query(rsl_number=submission)
|
||||
submission = BasicSubmission.query(rsl_plate_num=submission)
|
||||
self.base_dict = submission.to_dict(full_data=True)
|
||||
logger.debug(f"Submission details data:\n{pformat({k:v for k,v in self.base_dict.items() if k != 'samples'})}")
|
||||
# don't want id
|
||||
# logger.debug(f"Submission details data:\n{pformat({k:v for k,v in self.base_dict.items() if k != 'samples'})}")
|
||||
# NOTE: don't want id
|
||||
del self.base_dict['id']
|
||||
# logger.debug(f"Creating barcode.")
|
||||
# if not check_if_app():
|
||||
# self.base_dict['barcode'] = base64.b64encode(submission.make_plate_barcode(width=120, height=30)).decode('utf-8')
|
||||
logger.debug(f"Making platemap...")
|
||||
# logger.debug(f"Making platemap...")
|
||||
self.base_dict['platemap'] = submission.make_plate_map()
|
||||
self.base_dict, self.template = submission.get_details_template(base_dict=self.base_dict)
|
||||
self.html = self.template.render(sub=self.base_dict, signing_permission=is_power_user())
|
||||
self.webview.setHtml(self.html)
|
||||
self.setWindowTitle(f"Submission Details - {submission.rsl_plate_num}")
|
||||
# with open("details.html", "w") as f:
|
||||
# f.write(self.html)
|
||||
|
||||
@pyqtSlot(str)
|
||||
def sign_off(self, submission:str|BasicSubmission):
|
||||
logger.debug(f"Signing off on {submission} - ({getuser()})")
|
||||
# logger.debug(f"Signing off on {submission} - ({getuser()})")
|
||||
if isinstance(submission, str):
|
||||
# submission = BasicSubmission.query(rsl_number=submission)
|
||||
submission = BasicSubmission.query(rsl_plate_num=submission)
|
||||
submission.signed_by = getuser()
|
||||
submission.save()
|
||||
@@ -177,6 +165,6 @@ class SubmissionComment(QDialog):
|
||||
comment = self.txt_editor.toPlainText()
|
||||
dt = datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S")
|
||||
full_comment = {"name":commenter, "time": dt, "text": comment}
|
||||
logger.debug(f"Full comment: {full_comment}")
|
||||
# logger.debug(f"Full comment: {full_comment}")
|
||||
return full_comment
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ class SubmissionsSheet(QTableView):
|
||||
self.menu = QMenu(self)
|
||||
self.con_actions = submission.custom_context_events()
|
||||
for k in self.con_actions.keys():
|
||||
logger.debug(f"Adding {k}")
|
||||
# logger.debug(f"Adding {k}")
|
||||
action = QAction(k, self)
|
||||
action.triggered.connect(lambda _, action_name=k: self.triggered_action(action_name=action_name))
|
||||
self.menu.addAction(action)
|
||||
@@ -124,8 +124,8 @@ class SubmissionsSheet(QTableView):
|
||||
Args:
|
||||
action_name (str): name of the action from the menu
|
||||
"""
|
||||
logger.debug(f"Action: {action_name}")
|
||||
logger.debug(f"Responding with {self.con_actions[action_name]}")
|
||||
# logger.debug(f"Action: {action_name}")
|
||||
# logger.debug(f"Responding with {self.con_actions[action_name]}")
|
||||
func = self.con_actions[action_name]
|
||||
func(obj=self)
|
||||
|
||||
@@ -162,50 +162,20 @@ class SubmissionsSheet(QTableView):
|
||||
experiment_name=run[4].strip(),
|
||||
end_time=run[5].strip()
|
||||
)
|
||||
# elution columns are item 6 in the comma split list to the end
|
||||
# NOTE: elution columns are item 6 in the comma split list to the end
|
||||
for ii in range(6, len(run)):
|
||||
new_run[f"column{str(ii-5)}_vol"] = run[ii]
|
||||
# Lookup imported submissions
|
||||
# sub = BasicSubmission.query(rsl_number=new_run['rsl_plate_num'])
|
||||
# NOTE: Lookup imported submissions
|
||||
sub = BasicSubmission.query(rsl_plate_num=new_run['rsl_plate_num'])
|
||||
# If no such submission exists, move onto the next run
|
||||
# NOTE: If no such submission exists, move onto the next run
|
||||
if sub == None:
|
||||
continue
|
||||
try:
|
||||
logger.debug(f"Found submission: {sub.rsl_plate_num}")
|
||||
# logger.debug(f"Found submission: {sub.rsl_plate_num}")
|
||||
count += 1
|
||||
except AttributeError:
|
||||
continue
|
||||
sub.set_attribute('extraction_info', new_run)
|
||||
# if sub.extraction_info != None:
|
||||
# # existing = json.loads(sub.extraction_info)
|
||||
# existing = sub.extraction_info
|
||||
# else:
|
||||
# existing = None
|
||||
# # Check if the new info already exists in the imported submission
|
||||
# try:
|
||||
# # if json.dumps(new_run) in sub.extraction_info:
|
||||
# if new_run in sub.extraction_info:
|
||||
# logger.debug(f"Looks like we already have that info.")
|
||||
# continue
|
||||
# except TypeError:
|
||||
# pass
|
||||
# # Update or create the extraction info
|
||||
# if existing != None:
|
||||
# try:
|
||||
# logger.debug(f"Updating {type(existing)}: {existing} with {type(new_run)}: {new_run}")
|
||||
# existing.append(new_run)
|
||||
# logger.debug(f"Setting: {existing}")
|
||||
# # sub.extraction_info = json.dumps(existing)
|
||||
# sub.extraction_info = existing
|
||||
# except TypeError:
|
||||
# logger.error(f"Error updating!")
|
||||
# # sub.extraction_info = json.dumps([new_run])
|
||||
# sub.extraction_info = [new_run]
|
||||
# logger.debug(f"Final ext info for {sub.rsl_plate_num}: {sub.extraction_info}")
|
||||
# else:
|
||||
# # sub.extraction_info = json.dumps([new_run])
|
||||
# sub.extraction_info = [new_run]
|
||||
sub.save()
|
||||
self.report.add_result(Result(msg=f"We added {count} logs to the database.", status='Information'))
|
||||
|
||||
@@ -230,7 +200,7 @@ class SubmissionsSheet(QTableView):
|
||||
"""
|
||||
fname = select_open_file(self, file_extension="csv")
|
||||
with open(fname.__str__(), 'r') as f:
|
||||
# split csv rows on comma
|
||||
# NOTE: split csv rows on comma
|
||||
runs = [col.strip().split(",") for col in f.readlines()]
|
||||
count = 0
|
||||
for run in runs:
|
||||
@@ -242,49 +212,17 @@ class SubmissionsSheet(QTableView):
|
||||
experiment_name=run[4].strip(),
|
||||
end_time=run[5].strip()
|
||||
)
|
||||
# lookup imported submission
|
||||
# sub = lookup_submission_by_rsl_num(ctx=obj.ctx, rsl_num=new_run['rsl_plate_num'])
|
||||
# sub = lookup_submissions(ctx=obj.ctx, rsl_number=new_run['rsl_plate_num'])
|
||||
# NOTE: lookup imported submission
|
||||
sub = BasicSubmission.query(rsl_number=new_run['rsl_plate_num'])
|
||||
# if imported submission doesn't exist move on to next run
|
||||
# NOTE: if imported submission doesn't exist move on to next run
|
||||
if sub == None:
|
||||
continue
|
||||
try:
|
||||
logger.debug(f"Found submission: {sub.rsl_plate_num}")
|
||||
except AttributeError:
|
||||
continue
|
||||
sub.set_attribute('pcr_info', new_run)
|
||||
# # check if pcr_info already exists
|
||||
# if hasattr(sub, 'pcr_info') and sub.pcr_info != None:
|
||||
# # existing = json.loads(sub.pcr_info)
|
||||
# existing = sub.pcr_info
|
||||
# else:
|
||||
# existing = None
|
||||
# # check if this entry already exists in imported submission
|
||||
# try:
|
||||
# # if json.dumps(new_run) in sub.pcr_info:
|
||||
# if new_run in sub.pcr_info:
|
||||
# logger.debug(f"Looks like we already have that info.")
|
||||
# continue
|
||||
# else:
|
||||
# count += 1
|
||||
# except TypeError:
|
||||
# logger.error(f"No json to dump")
|
||||
# if existing is not None:
|
||||
# try:
|
||||
# logger.debug(f"Updating {type(existing)}: {existing} with {type(new_run)}: {new_run}")
|
||||
# existing.append(new_run)
|
||||
# logger.debug(f"Setting: {existing}")
|
||||
# # sub.pcr_info = json.dumps(existing)
|
||||
# sub.pcr_info = existing
|
||||
# except TypeError:
|
||||
# logger.error(f"Error updating!")
|
||||
# # sub.pcr_info = json.dumps([new_run])
|
||||
# sub.pcr_info = [new_run]
|
||||
# logger.debug(f"Final ext info for {sub.rsl_plate_num}: {sub.pcr_info}")
|
||||
# else:
|
||||
# # sub.pcr_info = json.dumps([new_run])
|
||||
# sub.pcr_info = [new_run]
|
||||
# logger.debug(f"Found submission: {sub.rsl_plate_num}")
|
||||
# except AttributeError:
|
||||
# continue
|
||||
sub.set_attribute('pcr_info', new_run)
|
||||
# NOTE: check if pcr_info already exists
|
||||
sub.save()
|
||||
self.report.add_result(Result(msg=f"We added {count} logs to the database.", status='Information'))
|
||||
|
||||
@@ -308,23 +246,21 @@ class SubmissionsSheet(QTableView):
|
||||
Tuple[QMainWindow, dict]: Collection of new main app window and result dict
|
||||
"""
|
||||
report = Report()
|
||||
# ask for date ranges
|
||||
# NOTE: ask for date ranges
|
||||
dlg = ReportDatePicker()
|
||||
if dlg.exec():
|
||||
info = dlg.parse_form()
|
||||
logger.debug(f"Report info: {info}")
|
||||
# find submissions based on date range
|
||||
# logger.debug(f"Report info: {info}")
|
||||
# NOTE: find submissions based on date range
|
||||
subs = BasicSubmission.query(start_date=info['start_date'], end_date=info['end_date'])
|
||||
# convert each object to dict
|
||||
# NOTE: convert each object to dict
|
||||
records = [item.to_dict(report=True) for item in subs]
|
||||
logger.debug(f"Records: {pformat(records)}")
|
||||
# make dataframe from record dictionaries
|
||||
# NOTE: make dataframe from record dictionaries
|
||||
detailed_df, summary_df = make_report_xlsx(records=records)
|
||||
html = make_report_html(df=summary_df, start_date=info['start_date'], end_date=info['end_date'])
|
||||
# get save location of report
|
||||
# NOTE: get save location of report
|
||||
fname = select_save_file(obj=self, default_name=f"Submissions_Report_{info['start_date']}-{info['end_date']}.pdf", extension="pdf")
|
||||
# with open(fname, "w+b") as f:
|
||||
# pisa.CreatePDF(html, dest=f)
|
||||
html_to_pdf(html=html, output_file=fname)
|
||||
writer = pd.ExcelWriter(fname.with_suffix(".xlsx"), engine='openpyxl')
|
||||
summary_df.to_excel(writer, sheet_name="Report")
|
||||
@@ -337,14 +273,13 @@ class SubmissionsSheet(QTableView):
|
||||
len(str(series.name)) # len of column name/header
|
||||
)) + 20 # adding a little extra space
|
||||
try:
|
||||
# worksheet.column_dimensions[get_column_letter(idx=idx)].width = max_len
|
||||
# Convert idx to letter
|
||||
# NOTE: Convert idx to letter
|
||||
col_letter = chr(ord('@') + idx)
|
||||
worksheet.column_dimensions[col_letter].width = max_len
|
||||
except ValueError:
|
||||
pass
|
||||
blank_row = get_first_blank_df_row(summary_df) + 1
|
||||
logger.debug(f"Blank row index = {blank_row}")
|
||||
# logger.debug(f"Blank row index = {blank_row}")
|
||||
for col in range(3,6):
|
||||
col_letter = row_map[col]
|
||||
worksheet.cell(row=blank_row, column=col, value=f"=SUM({col_letter}2:{col_letter}{str(blank_row-1)})")
|
||||
|
||||
@@ -26,11 +26,11 @@ class SubmissionTypeAdder(QWidget):
|
||||
scrollContent = QWidget(scroll)
|
||||
self.grid = QGridLayout()
|
||||
scrollContent.setLayout(self.grid)
|
||||
# insert submit button at top
|
||||
# NOTE: insert submit button at top
|
||||
self.submit_btn = QPushButton("Submit")
|
||||
self.grid.addWidget(self.submit_btn,0,0,1,1)
|
||||
self.grid.addWidget(QLabel("Submission Type Name:"),2,0)
|
||||
# widget to get kit name
|
||||
# NOTE: widget to get kit name
|
||||
self.st_name = QLineEdit()
|
||||
self.st_name.setObjectName("submission_type_name")
|
||||
self.grid.addWidget(self.st_name,2,1,1,2)
|
||||
@@ -39,7 +39,7 @@ class SubmissionTypeAdder(QWidget):
|
||||
self.grid.addWidget(template_selector,3,1)
|
||||
self.template_label = QLabel("None")
|
||||
self.grid.addWidget(self.template_label,3,2)
|
||||
# widget to get uses of kit
|
||||
# NOTE: widget to get uses of kit
|
||||
exclude = ['id', 'submitting_lab_id', 'extraction_kit_id', 'reagents_id', 'extraction_info', 'pcr_info', 'run_cost']
|
||||
self.columns = {key:value for key, value in BasicSubmission.__dict__.items() if isinstance(value, InstrumentedAttribute)}
|
||||
self.columns = {key:value for key, value in self.columns.items() if hasattr(value, "type") and key not in exclude}
|
||||
|
||||
@@ -30,7 +30,7 @@ class SubmissionFormContainer(QWidget):
|
||||
import_drag = pyqtSignal(Path)
|
||||
|
||||
def __init__(self, parent: QWidget) -> None:
|
||||
logger.debug(f"Setting form widget...")
|
||||
# logger.debug(f"Setting form widget...")
|
||||
super().__init__(parent)
|
||||
self.app = self.parent().parent()
|
||||
self.report = Report()
|
||||
@@ -52,7 +52,7 @@ class SubmissionFormContainer(QWidget):
|
||||
Sets filename when file dropped
|
||||
"""
|
||||
fname = Path([u.toLocalFile() for u in event.mimeData().urls()][0])
|
||||
logger.debug(f"App: {self.app}")
|
||||
# logger.debug(f"App: {self.app}")
|
||||
self.app.last_dir = fname.parent
|
||||
self.import_drag.emit(fname)
|
||||
|
||||
@@ -63,7 +63,7 @@ class SubmissionFormContainer(QWidget):
|
||||
self.app.raise_()
|
||||
self.app.activateWindow()
|
||||
self.import_submission_function(fname)
|
||||
logger.debug(f"Result from result reporter: {self.report.results}")
|
||||
# logger.debug(f"Result from result reporter: {self.report.results}")
|
||||
self.app.report.add_result(self.report)
|
||||
self.report = Report()
|
||||
self.app.result_reporter()
|
||||
@@ -78,7 +78,7 @@ class SubmissionFormContainer(QWidget):
|
||||
Returns:
|
||||
Tuple[QMainWindow, dict|None]: Collection of new main app window and result dict
|
||||
"""
|
||||
logger.debug(f"\n\nStarting Import...\n\n")
|
||||
logger.info(f"\n\nStarting Import...\n\n")
|
||||
report = Report()
|
||||
try:
|
||||
self.form.setParent(None)
|
||||
@@ -90,7 +90,7 @@ class SubmissionFormContainer(QWidget):
|
||||
# set file dialog
|
||||
if isinstance(fname, bool) or fname == None:
|
||||
fname = select_open_file(self, file_extension="xlsx")
|
||||
logger.debug(f"Attempting to parse file: {fname}")
|
||||
# logger.debug(f"Attempting to parse file: {fname}")
|
||||
if not fname.exists():
|
||||
report.add_result(Result(msg=f"File {fname.__str__()} not found.", status="critical"))
|
||||
self.report.add_result(report)
|
||||
@@ -103,16 +103,16 @@ class SubmissionFormContainer(QWidget):
|
||||
return
|
||||
except AttributeError:
|
||||
self.prsr = SheetParser(filepath=fname)
|
||||
logger.debug(f"Submission dictionary:\n{pformat(self.prsr.sub)}")
|
||||
# logger.debug(f"Submission dictionary:\n{pformat(self.prsr.sub)}")
|
||||
self.pyd = self.prsr.to_pydantic()
|
||||
logger.debug(f"Pydantic result: \n\n{pformat(self.pyd)}\n\n")
|
||||
# logger.debug(f"Pydantic result: \n\n{pformat(self.pyd)}\n\n")
|
||||
self.form = self.pyd.to_form(parent=self)
|
||||
self.layout().addWidget(self.form)
|
||||
# if self.prsr.sample_result != None:
|
||||
# report.add_result(msg=self.prsr.sample_result, status="Warning")
|
||||
self.report.add_result(report)
|
||||
logger.debug(f"Outgoing report: {self.report.results}")
|
||||
logger.debug(f"All attributes of submission container:\n{pformat(self.__dict__)}")
|
||||
# logger.debug(f"Outgoing report: {self.report.results}")
|
||||
# logger.debug(f"All attributes of submission container:\n{pformat(self.__dict__)}")
|
||||
|
||||
def add_reagent(self, reagent_lot:str|None=None, reagent_type:str|None=None, expiry:date|None=None, name:str|None=None):
|
||||
"""
|
||||
@@ -135,7 +135,7 @@ class SubmissionFormContainer(QWidget):
|
||||
if dlg.exec():
|
||||
# extract form info
|
||||
info = dlg.parse_form()
|
||||
logger.debug(f"Reagent info: {info}")
|
||||
# logger.debug(f"Reagent info: {info}")
|
||||
# create reagent object
|
||||
reagent = PydReagent(ctx=self.app.ctx, **info, missing=False)
|
||||
# send reagent to db
|
||||
@@ -216,10 +216,10 @@ class SubmissionFormWidget(QWidget):
|
||||
caller = inspect.stack()[1].function.__repr__().replace("'", "")
|
||||
# self.reagents = []
|
||||
# logger.debug(f"Self.reagents: {self.reagents}")
|
||||
logger.debug(f"\n\n{pformat(caller)}\n\n")
|
||||
# logger.debug(f"\n\n{pformat(caller)}\n\n")
|
||||
# logger.debug(f"SubmissionType: {self.submission_type}")
|
||||
report = Report()
|
||||
logger.debug(f"Extraction kit: {extraction_kit}")
|
||||
# logger.debug(f"Extraction kit: {extraction_kit}")
|
||||
# Remove previous reagent widgets
|
||||
try:
|
||||
old_reagents = self.find_widgets()
|
||||
@@ -249,7 +249,7 @@ class SubmissionFormWidget(QWidget):
|
||||
add_widget = self.ReagentFormWidget(parent=self, reagent=reagent, extraction_kit=self.pyd.extraction_kit)
|
||||
self.layout.addWidget(add_widget)
|
||||
report.add_result(integrity_report)
|
||||
logger.debug(f"Outgoing report: {report.results}")
|
||||
# logger.debug(f"Outgoing report: {report.results}")
|
||||
if hasattr(self.pyd, "csv"):
|
||||
export_csv_btn = QPushButton("Export CSV")
|
||||
export_csv_btn.setObjectName("export_csv_btn")
|
||||
@@ -263,46 +263,6 @@ class SubmissionFormWidget(QWidget):
|
||||
self.app.report.add_result(report)
|
||||
self.app.result_reporter()
|
||||
|
||||
# def kit_integrity_completion_function(self, extraction_kit:str|None=None):
|
||||
# """
|
||||
# Compare kit contents to parsed contents and creates widgets.
|
||||
#
|
||||
# Args:
|
||||
# obj (QMainWindow): The original app window
|
||||
#
|
||||
# Returns:
|
||||
# Tuple[QMainWindow, dict]: Collection of new main app window and result dict
|
||||
# """
|
||||
# report = Report()
|
||||
# missing_reagents = []
|
||||
# # logger.debug(inspect.currentframe().f_back.f_code.co_name)
|
||||
# # find the widget that contains kit info
|
||||
# if extraction_kit is None:
|
||||
# kit_widget = self.find_widgets(object_name="extraction_kit")[0].input
|
||||
# logger.debug(f"Kit selector: {kit_widget}")
|
||||
# # get current kit being used
|
||||
# self.ext_kit = kit_widget.currentText()
|
||||
# else:
|
||||
# self.ext_kit = extraction_kit
|
||||
# for reagent in self.reagents:
|
||||
# logger.debug(f"Creating widget for {reagent}")
|
||||
# add_widget = self.ReagentFormWidget(parent=self, reagent=reagent, extraction_kit=self.ext_kit)
|
||||
# # self.form.layout().addWidget(add_widget)
|
||||
# self.layout.addWidget(add_widget)
|
||||
# if reagent.missing:
|
||||
# missing_reagents.append(reagent)
|
||||
# logger.debug(f"Checking integrity of {self.ext_kit}")
|
||||
# # TODO: put check_kit_integrity here instead of what's here?
|
||||
# # see if there are any missing reagents
|
||||
# if len(missing_reagents) > 0:
|
||||
# result = Result(msg=f"""The submission you are importing is missing some reagents expected by the kit.\n\n
|
||||
# It looks like you are missing: {[item.type.upper() for item in missing_reagents]}\n\n
|
||||
# Alternatively, you may have set the wrong extraction kit.\n\nThe program will populate lists using existing reagents.
|
||||
# \n\nPlease make sure you check the lots carefully!""".replace(" ", ""), status="Warning")
|
||||
# report.add_result(result)
|
||||
# self.report.add_result(report)
|
||||
# logger.debug(f"Outgoing report: {self.report.results}")
|
||||
|
||||
def clear_form(self):
|
||||
"""
|
||||
Removes all form widgets
|
||||
@@ -335,24 +295,23 @@ class SubmissionFormWidget(QWidget):
|
||||
Returns:
|
||||
Tuple[QMainWindow, dict]: Collection of new main app window and result dict
|
||||
"""
|
||||
logger.debug(f"\n\nBeginning Submission\n\n")
|
||||
logger.info(f"\n\nBeginning Submission\n\n")
|
||||
report = Report()
|
||||
# self.pyd: PydSubmission = self.parse_form()
|
||||
result = self.parse_form()
|
||||
report.add_result(result)
|
||||
logger.debug(f"Submission: {pformat(self.pyd)}")
|
||||
logger.debug("Checking kit integrity...")
|
||||
# logger.debug(f"Submission: {pformat(self.pyd)}")
|
||||
# logger.debug("Checking kit integrity...")
|
||||
_, result = self.pyd.check_kit_integrity()
|
||||
report.add_result(result)
|
||||
if len(result.results) > 0:
|
||||
self.app.report.add_result(report)
|
||||
self.app.result_reporter()
|
||||
return
|
||||
logger.debug(f"PYD before transformation into SQL:\n\n{self.pyd}\n\n")
|
||||
# logger.debug(f"PYD before transformation into SQL:\n\n{self.pyd}\n\n")
|
||||
base_submission, result = self.pyd.to_sql()
|
||||
logger.debug(f"SQL object: {pformat(base_submission.__dict__)}")
|
||||
# logger.debug(f"SQL object: {pformat(base_submission.__dict__)}")
|
||||
# logger.debug(f"Base submission: {base_submission.to_dict()}")
|
||||
# check output message for issues
|
||||
# NOTE: check output message for issues
|
||||
match result.code:
|
||||
# code 0: everything is fine.
|
||||
case 0:
|
||||
@@ -379,11 +338,10 @@ 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)}")
|
||||
# sys.exit("Programmed stop submission_widget.py, line 381")
|
||||
base_submission.save()
|
||||
# update summary sheet
|
||||
# NOTE: update summary sheet
|
||||
self.app.table_widget.sub_wid.setData()
|
||||
# reset form
|
||||
# NOTE: reset form
|
||||
self.setParent(None)
|
||||
# logger.debug(f"All attributes of obj: {pformat(self.__dict__)}")
|
||||
self.app.report.add_result(report)
|
||||
@@ -396,16 +354,14 @@ class SubmissionFormWidget(QWidget):
|
||||
Args:
|
||||
fname (Path | None, optional): Input filename. Defaults to None.
|
||||
"""
|
||||
# self.parse_form()
|
||||
if isinstance(fname, bool) or fname == None:
|
||||
fname = select_save_file(obj=self, default_name=self.pyd.construct_filename(), extension="csv")
|
||||
try:
|
||||
|
||||
# logger.debug(f'')
|
||||
# self.pyd.csv.to_csv(fname.__str__(), index=False)
|
||||
workbook_2_csv(worksheet=self.pyd.csv, filename=fname)
|
||||
except PermissionError:
|
||||
logger.debug(f"Could not get permissions to {fname}. Possibly the request was cancelled.")
|
||||
logger.warning(f"Could not get permissions to {fname}. Possibly the request was cancelled.")
|
||||
except AttributeError:
|
||||
logger.error(f"No csv file found in the submission at this point.")
|
||||
|
||||
@@ -417,7 +373,7 @@ class SubmissionFormWidget(QWidget):
|
||||
Report: Report on status of parse.
|
||||
"""
|
||||
report = Report()
|
||||
logger.debug(f"Hello from form parser!")
|
||||
logger.info(f"Hello from form parser!")
|
||||
info = {}
|
||||
reagents = []
|
||||
for widget in self.findChildren(QWidget):
|
||||
@@ -431,21 +387,19 @@ class SubmissionFormWidget(QWidget):
|
||||
field, value = widget.parse_form()
|
||||
if field is not None:
|
||||
info[field] = value
|
||||
logger.debug(f"Info: {pformat(info)}")
|
||||
logger.debug(f"Reagents going into pyd: {pformat(reagents)}")
|
||||
# logger.debug(f"Info: {pformat(info)}")
|
||||
# logger.debug(f"Reagents going into pyd: {pformat(reagents)}")
|
||||
self.pyd.reagents = reagents
|
||||
|
||||
# logger.debug(f"Attrs not in info: {[k for k, v in self.__dict__.items() if k not in info.keys()]}")
|
||||
for item in self.recover:
|
||||
logger.debug(f"Attempting to recover: {item}")
|
||||
# logger.debug(f"Attempting to recover: {item}")
|
||||
if hasattr(self, item):
|
||||
value = getattr(self, item)
|
||||
logger.debug(f"Setting {item}")
|
||||
# logger.debug(f"Setting {item}")
|
||||
info[item] = value
|
||||
# submission = PydSubmission(reagents=reagents, **info)
|
||||
for k,v in info.items():
|
||||
self.pyd.set_attribute(key=k, value=v)
|
||||
# return submission
|
||||
# NOTE: return submission
|
||||
report.add_result(report)
|
||||
return report
|
||||
|
||||
@@ -510,7 +464,7 @@ class SubmissionFormWidget(QWidget):
|
||||
except (TypeError, KeyError):
|
||||
pass
|
||||
obj = parent.parent().parent()
|
||||
logger.debug(f"Creating widget for: {key}")
|
||||
# logger.debug(f"Creating widget for: {key}")
|
||||
match key:
|
||||
case 'submitting_lab':
|
||||
add_widget = QComboBox()
|
||||
@@ -531,12 +485,12 @@ class SubmissionFormWidget(QWidget):
|
||||
# create combobox to hold looked up kits
|
||||
add_widget = QComboBox()
|
||||
# lookup existing kits by 'submission_type' decided on by sheetparser
|
||||
logger.debug(f"Looking up kits used for {submission_type}")
|
||||
# logger.debug(f"Looking up kits used for {submission_type}")
|
||||
uses = [item.name for item in KitType.query(used_for=submission_type)]
|
||||
obj.uses = uses
|
||||
logger.debug(f"Kits received for {submission_type}: {uses}")
|
||||
# logger.debug(f"Kits received for {submission_type}: {uses}")
|
||||
if check_not_nan(value):
|
||||
logger.debug(f"The extraction kit in parser was: {value}")
|
||||
# logger.debug(f"The extraction kit in parser was: {value}")
|
||||
uses.insert(0, uses.pop(uses.index(value)))
|
||||
obj.ext_kit = value
|
||||
else:
|
||||
@@ -565,7 +519,7 @@ class SubmissionFormWidget(QWidget):
|
||||
case _:
|
||||
# anything else gets added in as a line edit
|
||||
add_widget = QLineEdit()
|
||||
logger.debug(f"Setting widget text to {str(value).replace('_', ' ')}")
|
||||
# logger.debug(f"Setting widget text to {str(value).replace('_', ' ')}")
|
||||
add_widget.setText(str(value).replace("_", " "))
|
||||
if add_widget != None:
|
||||
add_widget.setObjectName(key)
|
||||
@@ -639,14 +593,6 @@ class SubmissionFormWidget(QWidget):
|
||||
# If changed set self.missing to True and update self.label
|
||||
self.lot.currentTextChanged.connect(self.updated)
|
||||
|
||||
# def check_uncheck(self):
|
||||
# if self.check_box.isChecked():
|
||||
# self.lot.setCurrentIndex(0)
|
||||
# self.lot.setEnabled(True)
|
||||
# else:
|
||||
# self.lot.setCurrentText("Not Applicable")
|
||||
# self.lot.setEnabled(False)
|
||||
|
||||
def parse_form(self) -> Tuple[PydReagent, dict]:
|
||||
"""
|
||||
Pulls form info into PydReagent
|
||||
@@ -657,17 +603,17 @@ class SubmissionFormWidget(QWidget):
|
||||
# if not self.check_box.isChecked():
|
||||
# return None, None
|
||||
lot = self.lot.currentText()
|
||||
logger.debug(f"Using this lot for the reagent {self.reagent}: {lot}")
|
||||
# logger.debug(f"Using this lot for the reagent {self.reagent}: {lot}")
|
||||
wanted_reagent = Reagent.query(lot_number=lot, reagent_type=self.reagent.type)
|
||||
# if reagent doesn't exist in database, offer to add it (uses App.add_reagent)
|
||||
# NOTE: if reagent doesn't exist in database, offer to add it (uses App.add_reagent)
|
||||
if wanted_reagent == None:
|
||||
dlg = QuestionAsker(title=f"Add {lot}?", message=f"Couldn't find reagent type {self.reagent.type}: {lot} in the database.\n\nWould you like to add it?")
|
||||
if dlg.exec():
|
||||
wanted_reagent = self.parent().parent().add_reagent(reagent_lot=lot, reagent_type=self.reagent.type, expiry=self.reagent.expiry, name=self.reagent.name)
|
||||
return wanted_reagent, None
|
||||
else:
|
||||
# In this case we will have an empty reagent and the submission will fail kit integrity check
|
||||
logger.debug("Will not add reagent.")
|
||||
# NOTE: In this case we will have an empty reagent and the submission will fail kit integrity check
|
||||
# logger.debug("Will not add reagent.")
|
||||
return None, Result(msg="Failed integrity check", status="Critical")
|
||||
else:
|
||||
# Since this now gets passed in directly from the parser -> pyd -> form and the parser gets the name
|
||||
@@ -712,8 +658,8 @@ class SubmissionFormWidget(QWidget):
|
||||
def __init__(self, reagent, extraction_kit:str) -> None:
|
||||
super().__init__()
|
||||
self.setEditable(True)
|
||||
logger.debug(f"Attempting lookup of reagents by type: {reagent.type}")
|
||||
# below was lookup_reagent_by_type_name_and_kit_name, but I couldn't get it to work.
|
||||
# logger.debug(f"Attempting lookup of reagents by type: {reagent.type}")
|
||||
# NOTE: below was lookup_reagent_by_type_name_and_kit_name, but I couldn't get it to work.
|
||||
lookup = Reagent.query(reagent_type=reagent.type)
|
||||
relevant_reagents = [str(item.lot) for item in lookup]
|
||||
output_reg = []
|
||||
@@ -725,8 +671,8 @@ class SubmissionFormWidget(QWidget):
|
||||
elif isinstance(rel_reagent, str):
|
||||
output_reg.append(rel_reagent)
|
||||
relevant_reagents = output_reg
|
||||
# if reagent in sheet is not found insert it into the front of relevant reagents so it shows
|
||||
logger.debug(f"Relevant reagents for {reagent.lot}: {relevant_reagents}")
|
||||
# NOTE: if reagent in sheet is not found insert it into the front of relevant reagents so it shows
|
||||
# logger.debug(f"Relevant reagents for {reagent.lot}: {relevant_reagents}")
|
||||
if str(reagent.lot) not in relevant_reagents:
|
||||
if check_not_nan(reagent.lot):
|
||||
relevant_reagents.insert(0, str(reagent.lot))
|
||||
|
||||
Reference in New Issue
Block a user