Improved form regeneration for artic.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user