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

@@ -3,12 +3,10 @@ Contains miscellaneous widgets for frontend functions
"""
import math
from datetime import date
from PyQt6.QtGui import QPageLayout, QPageSize, QStandardItem, QIcon
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtGui import QStandardItem, QIcon
from PyQt6.QtWidgets import (
QLabel, QVBoxLayout,
QLineEdit, QComboBox, QDialog,
QDialogButtonBox, QDateEdit, QPushButton, QWidget, QHBoxLayout, QSizePolicy
QLabel, QLineEdit, QComboBox, QDateEdit, QPushButton, QWidget,
QHBoxLayout, QSizePolicy
)
from PyQt6.QtCore import Qt, QDate, QSize, QMarginsF
from tools import jinja_template_loading
@@ -20,96 +18,98 @@ logger = logging.getLogger(f"submissions.{__name__}")
env = jinja_template_loading()
class AddReagentForm(QDialog):
"""
dialog to add gather info about new reagent
"""
def __init__(self, reagent_lot: str | None = None, reagent_role: str | None = None, expiry: date | None = None,
reagent_name: str | None = None, kit: str | KitType | None = None) -> None:
super().__init__()
if reagent_name is None:
reagent_name = reagent_role
self.setWindowTitle("Add Reagent")
QBtn = QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel
self.buttonBox = QDialogButtonBox(QBtn)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
# NOTE: widget to get lot info
self.name_input = QComboBox()
self.name_input.setObjectName("name")
self.name_input.setEditable(True)
self.name_input.setCurrentText(reagent_name)
self.lot_input = QLineEdit()
self.lot_input.setObjectName("lot")
self.lot_input.setText(reagent_lot)
# NOTE: widget to get expiry info
self.exp_input = QDateEdit(calendarPopup=True)
self.exp_input.setObjectName('expiry')
# NOTE: if expiry is not passed in from gui, use today
if expiry is None:
self.exp_input.setDate(QDate(1970, 1, 1))
else:
try:
self.exp_input.setDate(expiry)
except TypeError:
self.exp_input.setDate(QDate(1970, 1, 1))
# NOTE: widget to get reagent type info
self.type_input = QComboBox()
self.type_input.setObjectName('role')
if kit:
match kit:
case str():
kit = KitType.query(name=kit)
case _:
pass
self.type_input.addItems([item.name for item in ReagentRole.query() if kit in item.kit_types])
else:
self.type_input.addItems([item.name for item in ReagentRole.query()])
# NOTE: convert input to user-friendly string?
try:
reagent_role = reagent_role.replace("_", " ").title()
except AttributeError:
reagent_role = None
# NOTE: set parsed reagent type to top of list
index = self.type_input.findText(reagent_role, Qt.MatchFlag.MatchEndsWith)
if index >= 0:
self.type_input.setCurrentIndex(index)
self.layout = QVBoxLayout()
self.layout.addWidget(QLabel("Name:"))
self.layout.addWidget(self.name_input)
self.layout.addWidget(QLabel("Lot:"))
self.layout.addWidget(self.lot_input)
self.layout.addWidget(
QLabel("Expiry:\n(use exact date on reagent.\nEOL will be calculated from kit automatically)"))
self.layout.addWidget(self.exp_input)
self.layout.addWidget(QLabel("Type:"))
self.layout.addWidget(self.type_input)
self.layout.addWidget(self.buttonBox)
self.setLayout(self.layout)
self.type_input.currentTextChanged.connect(self.update_names)
def parse_form(self) -> dict:
"""
Converts information in form to dict.
Returns:
dict: Output info
"""
return dict(name=self.name_input.currentText().strip(),
lot=self.lot_input.text().strip(),
expiry=self.exp_input.date().toPyDate(),
role=self.type_input.currentText().strip())
def update_names(self):
"""
Updates reagent names form field with examples from reagent type
"""
self.name_input.clear()
lookup = Reagent.query(role=self.type_input.currentText())
self.name_input.addItems(list(set([item.name for item in lookup])))
# class AddReagentForm(QDialog):
# """
# dialog to add gather info about new reagent (Defunct)
# """
#
# def __init__(self, reagent_lot: str | None = None, reagent_role: str | None = None, expiry: date | None = None,
# reagent_name: str | None = None, kit: str | KitType | None = None) -> None:
# super().__init__()
# if reagent_name is None:
# reagent_name = reagent_role
# self.setWindowTitle("Add Reagent")
# QBtn = QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel
# self.buttonBox = QDialogButtonBox(QBtn)
# self.buttonBox.accepted.connect(self.accept)
# self.buttonBox.rejected.connect(self.reject)
# # NOTE: widget to get lot info
# self.name_input = QComboBox()
# self.name_input.setObjectName("name")
# self.name_input.setEditable(True)
# self.name_input.setCurrentText(reagent_name)
# self.lot_input = QLineEdit()
# self.lot_input.setObjectName("lot")
# self.lot_input.setText(reagent_lot)
# # NOTE: widget to get expiry info
# self.expiry_input = QDateEdit(calendarPopup=True)
# self.expiry_input.setObjectName('expiry')
# # NOTE: if expiry is not passed in from gui, use today
# if expiry is None:
# logger.warning(f"Did not receive expiry, setting to 1970, 1, 1")
# self.expiry_input.setDate(QDate(1970, 1, 1))
# else:
# try:
# self.expiry_input.setDate(expiry)
# except TypeError:
# self.expiry_input.setDate(QDate(1970, 1, 1))
# # NOTE: widget to get reagent type info
# self.role_input = QComboBox()
# self.role_input.setObjectName('role')
# if kit:
# match kit:
# case str():
# kit = KitType.query(name=kit)
# case _:
# pass
# self.role_input.addItems([item.name for item in ReagentRole.query() if kit in item.kit_types])
# else:
# self.role_input.addItems([item.name for item in ReagentRole.query()])
# # NOTE: convert input to user-friendly string?
# try:
# reagent_role = reagent_role.replace("_", " ").title()
# except AttributeError:
# reagent_role = None
# # NOTE: set parsed reagent type to top of list
# index = self.role_input.findText(reagent_role, Qt.MatchFlag.MatchEndsWith)
# if index >= 0:
# self.role_input.setCurrentIndex(index)
# self.layout = QVBoxLayout()
# self.layout.addWidget(QLabel("Name:"))
# self.layout.addWidget(self.name_input)
# self.layout.addWidget(QLabel("Lot:"))
# self.layout.addWidget(self.lot_input)
# self.layout.addWidget(
# QLabel("Expiry:\n(use exact date on reagent.\nEOL will be calculated from kit automatically)")
# )
# self.layout.addWidget(self.expiry_input)
# self.layout.addWidget(QLabel("Type:"))
# self.layout.addWidget(self.role_input)
# self.layout.addWidget(self.buttonBox)
# self.setLayout(self.layout)
# self.role_input.currentTextChanged.connect(self.update_names)
#
# def parse_form(self) -> dict:
# """
# Converts information in form to dict.
#
# Returns:
# dict: Output info
# """
# return dict(name=self.name_input.currentText().strip(),
# lot=self.lot_input.text().strip(),
# expiry=self.expiry_input.date().toPyDate(),
# role=self.role_input.currentText().strip())
#
# def update_names(self):
# """
# Updates reagent names form field with examples from reagent type
# """
# self.name_input.clear()
# lookup = Reagent.query(role=self.role_input.currentText())
# self.name_input.addItems(list(set([item.name for item in lookup])))
#
#
class StartEndDatePicker(QWidget):
"""
custom widget to pick start and end dates for controls graphs
@@ -135,12 +135,12 @@ class StartEndDatePicker(QWidget):
return QSize(80, 20)
def save_pdf(obj: QWebEngineView, filename: Path):
page_layout = QPageLayout()
page_layout.setPageSize(QPageSize(QPageSize.PageSizeId.A4))
page_layout.setOrientation(QPageLayout.Orientation.Portrait)
page_layout.setMargins(QMarginsF(25, 25, 25, 25))
obj.page().printToPdf(filename.absolute().__str__(), page_layout)
# def save_pdf(obj: QWebEngineView, filename: Path):
# page_layout = QPageLayout()
# page_layout.setPageSize(QPageSize(QPageSize.PageSizeId.A4))
# page_layout.setOrientation(QPageLayout.Orientation.Portrait)
# page_layout.setMargins(QMarginsF(25, 25, 25, 25))
# obj.page().printToPdf(filename.absolute().__str__(), page_layout)
# NOTE: subclass