Improved form regeneration for artic.

This commit is contained in:
Landon Wark
2024-01-04 13:29:18 -06:00
parent c688aa160c
commit 19448cc8f3
18 changed files with 519 additions and 123 deletions

View File

@@ -2,18 +2,26 @@ from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (QDialog, QComboBox, QCheckBox,
QLabel, QWidget, QHBoxLayout,
QVBoxLayout, QDialogButtonBox)
from backend.db.models import SubmissionType
from backend.validators.pydant import PydEquipment, PydEquipmentPool
from backend.db.models import SubmissionType, Equipment, BasicSubmission
from backend.validators.pydant import PydEquipment, PydEquipmentRole
import logging
logger = logging.getLogger(f"submissions.{__name__}")
class EquipmentUsage(QDialog):
def __init__(self, parent, submission_type:SubmissionType|str) -> QDialog:
def __init__(self, parent, submission_type:SubmissionType|str, submission:BasicSubmission) -> QDialog:
super().__init__(parent)
self.setWindowTitle("Equipment Checklist")
self.used_equipment = submission.get_used_equipment()
logger.debug(f"Existing equipment: {self.used_equipment}")
if isinstance(submission_type, str):
submission_type = SubmissionType.query(name=submission_type)
self.submission_type = SubmissionType.query(name=submission_type)
else:
self.submission_type = submission_type
# self.static_equipment = submission_type.get_equipment()
self.opt_equipment = submission_type.get_equipment()
self.opt_equipment = self.submission_type.get_equipment()
logger.debug(f"EquipmentRoles: {self.opt_equipment}")
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.populate_form()
@@ -24,14 +32,14 @@ class EquipmentUsage(QDialog):
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
for eq in self.opt_equipment:
self.layout.addWidget(eq.toForm(parent=self))
self.layout.addWidget(eq.toForm(parent=self, submission_type=self.submission_type, used=self.used_equipment))
self.layout.addWidget(self.buttonBox)
def parse_form(self):
output = []
for widget in self.findChildren(QWidget):
match widget:
case (EquipmentCheckBox()|PoolComboBox()) :
case (EquipmentCheckBox()|RoleComboBox()) :
output.append(widget.parse_form())
case _:
pass
@@ -65,25 +73,41 @@ class EquipmentCheckBox(QWidget):
else:
return None
class PoolComboBox(QWidget):
class RoleComboBox(QWidget):
def __init__(self, parent, pool:PydEquipmentPool) -> None:
def __init__(self, parent, role:PydEquipmentRole, submission_type:SubmissionType, used:list) -> None:
super().__init__(parent)
self.layout = QHBoxLayout()
# label = QLabel()
# label.setText(pool.name)
self.role = role
self.check = QCheckBox()
if role.name in used:
self.check.setChecked(False)
else:
self.check.setChecked(True)
self.box = QComboBox()
self.box.setMaximumWidth(125)
self.box.setMinimumWidth(125)
self.box.addItems([item.name for item in pool.equipment])
self.check = QCheckBox()
self.box.addItems([item.name for item in role.equipment])
# self.check = QCheckBox()
# self.layout.addWidget(label)
self.layout.addWidget(self.box)
self.process = QComboBox()
self.process.setMaximumWidth(125)
self.process.setMinimumWidth(125)
self.process.setEditable(True)
self.process.addItems(submission_type.get_processes_for_role(equipment_role=role.name))
self.layout.addWidget(self.check)
self.layout.addWidget(QLabel(f"{role.name}:"))
self.layout.addWidget(self.box)
self.layout.addWidget(self.process)
# self.layout.addWidget(self.check)
self.setLayout(self.layout)
def parse_form(self) -> str:
if self.check.isChecked():
return self.box.currentText()
def parse_form(self) -> str|None:
eq = Equipment.query(name=self.box.currentText())
if self.check:
return PydEquipment(name=eq.name, processes=[self.process.currentText()], role=self.role.name, asset_number=eq.asset_number, nickname=eq.nickname)
else:
return None

View File

@@ -187,16 +187,19 @@ class SubmissionsSheet(QTableView):
def add_equipment_function(self, rsl_plate_id):
submission = BasicSubmission.query(id=rsl_plate_id)
submission_type = submission.submission_type_name
dlg = EquipmentUsage(parent=self, submission_type=submission_type)
dlg = EquipmentUsage(parent=self, submission_type=submission_type, submission=submission)
if dlg.exec():
equipment = dlg.parse_form()
logger.debug(f"We've got equipment: {equipment}")
for equip in equipment:
e = Equipment.query(name=equip)
e = Equipment.query(name=equip.name)
assoc = SubmissionEquipmentAssociation(submission=submission, equipment=e)
assoc.process = equip.processes[0]
assoc.role = equip.role
# submission.submission_equipment_associations.append(assoc)
logger.debug(f"Appending SubmissionEquipmentAssociation: {assoc}")
# submission.save()
assoc.save()
# assoc.save()
def delete_item(self, event):
"""
@@ -429,7 +432,7 @@ class SubmissionsSheet(QTableView):
# delete_submission(id=value)
sub = BasicSubmission.query(id=value)
fname = select_save_file(self, default_name=sub.to_pydantic().construct_filename(), extension="xlsx")
sub.backup(fname=fname)
sub.backup(fname=fname, full_backup=False)
class SubmissionDetails(QDialog):
"""

View File

@@ -7,7 +7,7 @@ from PyQt6.QtWidgets import (
)
from sqlalchemy import FLOAT, INTEGER
from sqlalchemy.orm.attributes import InstrumentedAttribute
from backend.db import SubmissionType, Equipment, SubmissionTypeEquipmentAssociation, BasicSubmission
from backend.db import SubmissionType, Equipment, SubmissionTypeEquipmentRoleAssociation, BasicSubmission
from backend.validators import PydReagentType, PydKit
import logging
from pprint import pformat

View File

@@ -315,6 +315,8 @@ class SubmissionFormContainer(QWidget):
logger.debug(f"Here is the final submission: {pformat(base_submission.__dict__)}")
logger.debug(f"Parsed reagents: {pformat(base_submission.reagents)}")
logger.debug(f"Sending submission: {base_submission.rsl_plate_num} to database.")
logger.debug(f"Samples from pyd: {pformat(self.pyd.samples)}")
logger.debug(f"Samples SQL: {pformat([item.__dict__ for item in base_submission.samples])}")
base_submission.save()
# update summary sheet
self.app.table_widget.sub_wid.setData()
@@ -428,8 +430,8 @@ class SubmissionFormWidget(QWidget):
# self.ignore = [None, "", "qt_spinbox_lineedit", "qt_scrollarea_viewport", "qt_scrollarea_hcontainer",
# "qt_scrollarea_vcontainer", "submit_btn"
# ]
self.ignore = ['filepath', 'samples', 'reagents', 'csv', 'ctx', 'comment']
self.recover = ['filepath', 'samples', 'csv', 'comment']
self.ignore = ['filepath', 'samples', 'reagents', 'csv', 'ctx', 'comment', 'equipment']
self.recover = ['filepath', 'samples', 'csv', 'comment', 'equipment']
layout = QVBoxLayout()
for k, v in kwargs.items():
if k not in self.ignore:
@@ -475,8 +477,11 @@ class SubmissionFormWidget(QWidget):
logger.debug(f"Reagents: {pformat(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}")
if hasattr(self, item):
info[item] = getattr(self, item)
value = getattr(self, item)
logger.debug(f"Setting {item}")
info[item] = value
# app = self.parent().parent().parent().parent().parent().parent().parent().parent
# submission = PydSubmission(filepath=self.filepath, reagents=reagents, samples=self.samples, **info)
submission = PydSubmission(reagents=reagents, **info)
@@ -728,6 +733,8 @@ class ReagentFormWidget(QWidget):
looked_up_reg = Reagent.query(lot_number=looked_up_rt.last_used)
except AttributeError:
looked_up_reg = None
if isinstance(looked_up_reg, list):
looked_up_reg = None
logger.debug(f"Because there was no reagent listed for {reagent.lot}, we will insert the last lot used: {looked_up_reg}")
if looked_up_reg != None:
relevant_reagents.remove(str(looked_up_reg.lot))