Created WastewaterArticAssociation, added tip handling.

This commit is contained in:
lwark
2024-06-14 10:38:46 -05:00
parent 4a7d0b0bd4
commit 62b826c2d1
7 changed files with 163 additions and 59 deletions

View File

@@ -55,11 +55,11 @@ def upgrade() -> None:
op.create_table('_submissiontipsassociation', op.create_table('_submissiontipsassociation',
sa.Column('tip_id', sa.INTEGER(), nullable=False), sa.Column('tip_id', sa.INTEGER(), nullable=False),
sa.Column('submission_id', sa.INTEGER(), nullable=False), sa.Column('submission_id', sa.INTEGER(), nullable=False),
sa.Column('role_name', sa.String(), nullable=True), sa.Column('role_name', sa.String(), nullable=False),
sa.ForeignKeyConstraint(['role_name'], ['_tiprole.name'], ), # sa.ForeignKeyConstraint(['role_name'], ['_tiprole.name'], ),
sa.ForeignKeyConstraint(['submission_id'], ['_submissiontype.id'], ), sa.ForeignKeyConstraint(['submission_id'], ['_basicsubmission.id'], ),
sa.ForeignKeyConstraint(['tip_id'], ['_tips.id'], ), sa.ForeignKeyConstraint(['tip_id'], ['_tips.id'], ),
sa.PrimaryKeyConstraint('tip_id', 'submission_id') sa.PrimaryKeyConstraint('tip_id', 'submission_id', 'role_name')
) )
op.create_table('_tiproles_tips', op.create_table('_tiproles_tips',
sa.Column('tiprole_id', sa.INTEGER(), nullable=True), sa.Column('tiprole_id', sa.INTEGER(), nullable=True),

View File

@@ -1601,7 +1601,7 @@ class SubmissionTipsAssociation(BaseClass):
back_populates="submission_tips_associations") #: associated submission back_populates="submission_tips_associations") #: associated submission
tips = relationship(Tips, tips = relationship(Tips,
back_populates="tips_submission_associations") #: associated equipment back_populates="tips_submission_associations") #: associated equipment
role_name = Column(String(32)) #, ForeignKey("_tiprole.name")) role_name = Column(String(32), primary_key=True) #, ForeignKey("_tiprole.name"))
# role = relationship(TipRole) # role = relationship(TipRole)

View File

@@ -2095,7 +2095,7 @@ class BasicSample(BaseClass):
used_class = cls.find_polymorphic_subclass(attrs=sanitized_kwargs, polymorphic_identity=sample_type) used_class = cls.find_polymorphic_subclass(attrs=sanitized_kwargs, polymorphic_identity=sample_type)
instance = used_class(**sanitized_kwargs) instance = used_class(**sanitized_kwargs)
instance.sample_type = sample_type instance.sample_type = sample_type
logger.debug(f"Creating instance: {instance}") # logger.debug(f"Creating instance: {instance}")
return instance return instance
@classmethod @classmethod
@@ -2352,7 +2352,7 @@ class SubmissionSampleAssociation(BaseClass):
self.id = id self.id = id
else: else:
self.id = self.__class__.autoincrement_id() self.id = self.__class__.autoincrement_id()
logger.debug(f"Looking at kwargs: {pformat(kwargs)}") # logger.debug(f"Looking at kwargs: {pformat(kwargs)}")
for k,v in kwargs.items(): for k,v in kwargs.items():
try: try:
self.__setattr__(k, v) self.__setattr__(k, v)
@@ -2538,7 +2538,7 @@ class SubmissionSampleAssociation(BaseClass):
Returns: Returns:
SubmissionSampleAssociation: Queried or new association. SubmissionSampleAssociation: Queried or new association.
""" """
logger.debug(f"Attempting create or query with {kwargs}") # logger.debug(f"Attempting create or query with {kwargs}")
match submission: match submission:
case BasicSubmission(): case BasicSubmission():
pass pass

View File

@@ -613,7 +613,7 @@ class EquipmentParser(object):
previous_asset = asset previous_asset = asset
asset = self.get_asset_number(input=asset) asset = self.get_asset_number(input=asset)
logger.debug(f"asset: {asset}") logger.debug(f"asset: {asset}")
eq = Equipment.query(name=asset) eq = Equipment.query(asset_number=asset)
process = ws.cell(row=v['process']['row'], column=v['process']['column']).value process = ws.cell(row=v['process']['row'], column=v['process']['column']).value
try: try:
output.append( output.append(

View File

@@ -15,7 +15,7 @@ logger = logging.getLogger(f"submissions.{__name__}")
class SheetWriter(object): class SheetWriter(object):
""" """
object to pull and contain data from excel file object to manage data placement into excel file
""" """
def __init__(self, submission: PydSubmission, missing_only: bool = False): def __init__(self, submission: PydSubmission, missing_only: bool = False):
@@ -60,35 +60,52 @@ class SheetWriter(object):
self.write_tips() self.write_tips()
def write_info(self): def write_info(self):
"""
Calls info writer
"""
disallowed = ['filepath', 'reagents', 'samples', 'equipment', 'controls'] disallowed = ['filepath', 'reagents', 'samples', 'equipment', 'controls']
info_dict = {k: v for k, v in self.sub.items() if k not in disallowed} info_dict = {k: v for k, v in self.sub.items() if k not in disallowed}
writer = InfoWriter(xl=self.xl, submission_type=self.submission_type, info_dict=info_dict) writer = InfoWriter(xl=self.xl, submission_type=self.submission_type, info_dict=info_dict)
self.xl = writer.write_info() self.xl = writer.write_info()
def write_reagents(self): def write_reagents(self):
"""
Calls reagent writer
"""
reagent_list = self.sub['reagents'] reagent_list = self.sub['reagents']
writer = ReagentWriter(xl=self.xl, submission_type=self.submission_type, writer = ReagentWriter(xl=self.xl, submission_type=self.submission_type,
extraction_kit=self.sub['extraction_kit'], reagent_list=reagent_list) extraction_kit=self.sub['extraction_kit'], reagent_list=reagent_list)
self.xl = writer.write_reagents() self.xl = writer.write_reagents()
def write_samples(self): def write_samples(self):
"""
Calls sample writer
"""
sample_list = self.sub['samples'] sample_list = self.sub['samples']
writer = SampleWriter(xl=self.xl, submission_type=self.submission_type, sample_list=sample_list) writer = SampleWriter(xl=self.xl, submission_type=self.submission_type, sample_list=sample_list)
self.xl = writer.write_samples() self.xl = writer.write_samples()
def write_equipment(self): def write_equipment(self):
"""
Calls equipment writer
"""
equipment_list = self.sub['equipment'] equipment_list = self.sub['equipment']
writer = EquipmentWriter(xl=self.xl, submission_type=self.submission_type, equipment_list=equipment_list) writer = EquipmentWriter(xl=self.xl, submission_type=self.submission_type, equipment_list=equipment_list)
self.xl = writer.write_equipment() self.xl = writer.write_equipment()
def write_tips(self): def write_tips(self):
"""
Calls tip writer
"""
tips_list = self.sub['tips'] tips_list = self.sub['tips']
writer = TipWriter(xl=self.xl, submission_type=self.submission_type, tips_list=tips_list) writer = TipWriter(xl=self.xl, submission_type=self.submission_type, tips_list=tips_list)
self.xl = writer.write_tips() self.xl = writer.write_tips()
class InfoWriter(object): class InfoWriter(object):
"""
object to write general submission info into excel file
"""
def __init__(self, xl: Workbook, submission_type: SubmissionType | str, info_dict: dict, sub_object:BasicSubmission|None=None): def __init__(self, xl: Workbook, submission_type: SubmissionType | str, info_dict: dict, sub_object:BasicSubmission|None=None):
logger.debug(f"Info_dict coming into InfoWriter: {pformat(info_dict)}") logger.debug(f"Info_dict coming into InfoWriter: {pformat(info_dict)}")
if isinstance(submission_type, str): if isinstance(submission_type, str):
@@ -103,6 +120,16 @@ class InfoWriter(object):
# logger.debug(pformat(self.info)) # logger.debug(pformat(self.info))
def reconcile_map(self, info_dict: dict, info_map: dict) -> dict: def reconcile_map(self, info_dict: dict, info_map: dict) -> dict:
"""
Merge info with its locations
Args:
info_dict (dict): dictionary of info items
info_map (dict): dictionary of info locations
Returns:
dict: merged dictionary
"""
output = {} output = {}
for k, v in info_dict.items(): for k, v in info_dict.items():
if v is None: if v is None:
@@ -119,7 +146,13 @@ class InfoWriter(object):
# logger.debug(f"Reconciled info: {pformat(output)}") # logger.debug(f"Reconciled info: {pformat(output)}")
return output return output
def write_info(self): def write_info(self) -> Workbook:
"""
Performs write operations
Returns:
Workbook: workbook with info written.
"""
for k, v in self.info.items(): for k, v in self.info.items():
# NOTE: merge all comments to fit in single cell. # NOTE: merge all comments to fit in single cell.
if k == "comment" and isinstance(v['value'], list): if k == "comment" and isinstance(v['value'], list):
@@ -138,7 +171,9 @@ class InfoWriter(object):
class ReagentWriter(object): class ReagentWriter(object):
"""
object to write reagent data into excel file
"""
def __init__(self, xl: Workbook, submission_type: SubmissionType | str, extraction_kit: KitType | str, def __init__(self, xl: Workbook, submission_type: SubmissionType | str, extraction_kit: KitType | str,
reagent_list: list): reagent_list: list):
self.xl = xl self.xl = xl
@@ -149,7 +184,17 @@ class ReagentWriter(object):
reagent_map = kit_type.construct_xl_map_for_use(submission_type) reagent_map = kit_type.construct_xl_map_for_use(submission_type)
self.reagents = self.reconcile_map(reagent_list=reagent_list, reagent_map=reagent_map) self.reagents = self.reconcile_map(reagent_list=reagent_list, reagent_map=reagent_map)
def reconcile_map(self, reagent_list, reagent_map) -> List[dict]: def reconcile_map(self, reagent_list:List[dict], reagent_map:dict) -> List[dict]:
"""
Merge reagents with their locations
Args:
reagent_list (List[dict]): List of reagent dictionaries
reagent_map (dict): Reagent locations
Returns:
List[dict]: merged dictionary
"""
output = [] output = []
for reagent in reagent_list: for reagent in reagent_list:
try: try:
@@ -168,7 +213,13 @@ class ReagentWriter(object):
output.append(placeholder) output.append(placeholder)
return output return output
def write_reagents(self): def write_reagents(self) -> Workbook:
"""
Performs write operations
Returns:
Workbook: Workbook with reagents written
"""
for reagent in self.reagents: for reagent in self.reagents:
sheet = self.xl[reagent['sheet']] sheet = self.xl[reagent['sheet']]
for k, v in reagent.items(): for k, v in reagent.items():
@@ -181,7 +232,9 @@ class ReagentWriter(object):
class SampleWriter(object): class SampleWriter(object):
"""
object to write sample data into excel file
"""
def __init__(self, xl: Workbook, submission_type: SubmissionType | str, sample_list: list): def __init__(self, xl: Workbook, submission_type: SubmissionType | str, sample_list: list):
if isinstance(submission_type, str): if isinstance(submission_type, str):
submission_type = SubmissionType.query(name=submission_type) submission_type = SubmissionType.query(name=submission_type)
@@ -190,7 +243,16 @@ class SampleWriter(object):
self.sample_map = submission_type.construct_sample_map()['lookup_table'] self.sample_map = submission_type.construct_sample_map()['lookup_table']
self.samples = self.reconcile_map(sample_list) self.samples = self.reconcile_map(sample_list)
def reconcile_map(self, sample_list: list): def reconcile_map(self, sample_list: list) -> List[dict]:
"""
Merge sample info with locations
Args:
sample_list (list): List of sample information
Returns:
List[dict]: List of merged dictionaries
"""
output = [] output = []
multiples = ['row', 'column', 'assoc_id', 'submission_rank'] multiples = ['row', 'column', 'assoc_id', 'submission_rank']
for sample in sample_list: for sample in sample_list:
@@ -204,10 +266,16 @@ class SampleWriter(object):
output.append(new) output.append(new)
return sorted(output, key=lambda k: k['submission_rank']) return sorted(output, key=lambda k: k['submission_rank'])
def write_samples(self): def write_samples(self) -> Workbook:
"""
Performs writing operations.
Returns:
Workbook: Workbook with samples written
"""
sheet = self.xl[self.sample_map['sheet']] sheet = self.xl[self.sample_map['sheet']]
columns = self.sample_map['sample_columns'] columns = self.sample_map['sample_columns']
for ii, sample in enumerate(self.samples): for sample in self.samples:
row = self.sample_map['start_row'] + (sample['submission_rank'] - 1) row = self.sample_map['start_row'] + (sample['submission_rank'] - 1)
for k, v in sample.items(): for k, v in sample.items():
try: try:
@@ -219,7 +287,9 @@ class SampleWriter(object):
class EquipmentWriter(object): class EquipmentWriter(object):
"""
object to write equipment data into excel file
"""
def __init__(self, xl: Workbook, submission_type: SubmissionType | str, equipment_list: list): def __init__(self, xl: Workbook, submission_type: SubmissionType | str, equipment_list: list):
if isinstance(submission_type, str): if isinstance(submission_type, str):
submission_type = SubmissionType.query(name=submission_type) submission_type = SubmissionType.query(name=submission_type)
@@ -228,7 +298,17 @@ class EquipmentWriter(object):
equipment_map = self.submission_type.construct_equipment_map() equipment_map = self.submission_type.construct_equipment_map()
self.equipment = self.reconcile_map(equipment_list=equipment_list, equipment_map=equipment_map) self.equipment = self.reconcile_map(equipment_list=equipment_list, equipment_map=equipment_map)
def reconcile_map(self, equipment_list: list, equipment_map: list): def reconcile_map(self, equipment_list: list, equipment_map: dict) -> List[dict]:
"""
Merges equipment with location data
Args:
equipment_list (list): List of equipment
equipment_map (dict): Dictionary of equipment locations
Returns:
List[dict]: List of merged dictionaries
"""
output = [] output = []
if equipment_list is None: if equipment_list is None:
return output return output
@@ -248,6 +328,8 @@ class EquipmentWriter(object):
# logger.error(f"Keyerror: {e}") # logger.error(f"Keyerror: {e}")
continue continue
placeholder[k] = dicto placeholder[k] = dicto
if "asset_number" not in mp_info.keys():
placeholder['name']['value'] = f"{equipment['name']} - {equipment['asset_number']}"
try: try:
placeholder['sheet'] = mp_info['sheet'] placeholder['sheet'] = mp_info['sheet']
except KeyError: except KeyError:
@@ -256,7 +338,13 @@ class EquipmentWriter(object):
output.append(placeholder) output.append(placeholder)
return output return output
def write_equipment(self): def write_equipment(self) -> Workbook:
"""
Performs write operations
Returns:
Workbook: Workbook with equipment written
"""
for equipment in self.equipment: for equipment in self.equipment:
try: try:
sheet = self.xl[equipment['sheet']] sheet = self.xl[equipment['sheet']]
@@ -280,7 +368,9 @@ class EquipmentWriter(object):
class TipWriter(object): class TipWriter(object):
"""
object to write tips data into excel file
"""
def __init__(self, xl: Workbook, submission_type: SubmissionType | str, tips_list: list): def __init__(self, xl: Workbook, submission_type: SubmissionType | str, tips_list: list):
if isinstance(submission_type, str): if isinstance(submission_type, str):
submission_type = SubmissionType.query(name=submission_type) submission_type = SubmissionType.query(name=submission_type)
@@ -289,7 +379,17 @@ class TipWriter(object):
tips_map = self.submission_type.construct_tips_map() tips_map = self.submission_type.construct_tips_map()
self.tips = self.reconcile_map(tips_list=tips_list, tips_map=tips_map) self.tips = self.reconcile_map(tips_list=tips_list, tips_map=tips_map)
def reconcile_map(self, tips_list: list, tips_map: list): def reconcile_map(self, tips_list: List[dict], tips_map: dict) -> List[dict]:
"""
Merges tips with location data
Args:
tips_list (List[dict]): List of tips
tips_map (dict): Tips locations
Returns:
List[dict]: List of merged dictionaries
"""
output = [] output = []
if tips_list is None: if tips_list is None:
return output return output
@@ -317,7 +417,13 @@ class TipWriter(object):
output.append(placeholder) output.append(placeholder)
return output return output
def write_tips(self): def write_tips(self) -> Workbook:
"""
Performs write operations
Returns:
Workbook: Workbook with tips written
"""
for tips in self.tips: for tips in self.tips:
try: try:
sheet = self.xl[tips['sheet']] sheet = self.xl[tips['sheet']]

View File

@@ -257,7 +257,7 @@ class PydSample(BaseModel, extra='allow'):
sample=instance, sample=instance,
row=row, column=column, id=aid, row=row, column=column, id=aid,
submission_rank=submission_rank, **self.model_extra) submission_rank=submission_rank, **self.model_extra)
logger.debug(f"Using submission_sample_association: {association}") # logger.debug(f"Using submission_sample_association: {association}")
try: try:
# instance.sample_submission_associations.append(association) # instance.sample_submission_associations.append(association)
out_associations.append(association) out_associations.append(association)
@@ -734,6 +734,7 @@ class PydSubmission(BaseModel, extra='allow'):
for tips in self.tips: for tips in self.tips:
if tips is None: if tips is None:
continue continue
logger.debug(f"Converting tips: {tips} to sql.")
association = tips.to_sql(submission=instance) association = tips.to_sql(submission=instance)
if association is not None: if association is not None:
# association.save() # association.save()

View File

@@ -2,8 +2,7 @@ import sys
from pprint import pformat from pprint import pformat
from PyQt6.QtCore import Qt from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (QDialog, QComboBox, QCheckBox, from PyQt6.QtWidgets import (QDialog, QComboBox, QCheckBox,
QLabel, QWidget, QHBoxLayout, QLabel, QWidget, QVBoxLayout, QDialogButtonBox, QGridLayout)
QVBoxLayout, QDialogButtonBox, QGridLayout)
from backend.db.models import Equipment, BasicSubmission, Process from backend.db.models import Equipment, BasicSubmission, Process
from backend.validators.pydant import PydEquipment, PydEquipmentRole, PydTips from backend.validators.pydant import PydEquipment, PydEquipmentRole, PydTips
import logging import logging
@@ -11,9 +10,10 @@ from typing import List
logger = logging.getLogger(f"submissions.{__name__}") logger = logging.getLogger(f"submissions.{__name__}")
class EquipmentUsage(QDialog): class EquipmentUsage(QDialog):
def __init__(self, parent, submission:BasicSubmission) -> QDialog: def __init__(self, parent, submission: BasicSubmission) -> QDialog:
super().__init__(parent) super().__init__(parent)
self.submission = submission self.submission = submission
self.setWindowTitle("Equipment Checklist") self.setWindowTitle("Equipment Checklist")
@@ -29,7 +29,7 @@ class EquipmentUsage(QDialog):
def populate_form(self): def populate_form(self):
""" """
Create form widgets Create form widgets
""" """
QBtn = QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel QBtn = QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel
self.buttonBox = QDialogButtonBox(QBtn) self.buttonBox = QDialogButtonBox(QBtn)
self.buttonBox.accepted.connect(self.accept) self.buttonBox.accepted.connect(self.accept)
@@ -49,43 +49,44 @@ class EquipmentUsage(QDialog):
Returns: Returns:
List[PydEquipment]: All equipment pulled from widgets List[PydEquipment]: All equipment pulled from widgets
""" """
output = [] output = []
for widget in self.findChildren(QWidget): for widget in self.findChildren(QWidget):
match widget: match widget:
case RoleComboBox() : case RoleComboBox():
if widget.check.isChecked(): if widget.check.isChecked():
output.append(widget.parse_form()) output.append(widget.parse_form())
case _: case _:
pass pass
logger.debug(f"parsed output of Equsage form: {pformat(output)}") logger.debug(f"parsed output of Equsage form: {pformat(output)}")
return [item for item in output if item is not None] return [item for item in output if item is not None]
class LabelRow(QWidget): class LabelRow(QWidget):
def __init__(self, parent) -> None: def __init__(self, parent) -> None:
super().__init__(parent) super().__init__(parent)
self.layout = QHBoxLayout() self.layout = QGridLayout()
self.check = QCheckBox() self.check = QCheckBox()
self.layout.addWidget(self.check) self.layout.addWidget(self.check, 0, 0)
self.check.stateChanged.connect(self.check_all) self.check.stateChanged.connect(self.check_all)
for item in ["Role", "Equipment", "Process", "Tips"]: for iii, item in enumerate(["Role", "Equipment", "Process", "Tips"], start=1):
l = QLabel(item) l = QLabel(item)
l.setMaximumWidth(200) l.setMaximumWidth(200)
l.setMinimumWidth(200) l.setMinimumWidth(200)
self.layout.addWidget(l) self.layout.addWidget(l, 0, iii, alignment=Qt.AlignmentFlag.AlignRight)
self.setLayout(self.layout) self.setLayout(self.layout)
def check_all(self): def check_all(self):
""" """
Toggles all checkboxes in the form Toggles all checkboxes in the form
""" """
for object in self.parent().findChildren(QCheckBox): for object in self.parent().findChildren(QCheckBox):
object.setChecked(self.check.isChecked()) object.setChecked(self.check.isChecked())
class RoleComboBox(QWidget): class RoleComboBox(QWidget):
def __init__(self, parent, role:PydEquipmentRole, used:list) -> None: def __init__(self, parent, role: PydEquipmentRole, used: list) -> None:
super().__init__(parent) super().__init__(parent)
# self.layout = QHBoxLayout() # self.layout = QHBoxLayout()
self.layout = QGridLayout() self.layout = QGridLayout()
@@ -105,27 +106,23 @@ class RoleComboBox(QWidget):
self.process.setMinimumWidth(200) self.process.setMinimumWidth(200)
self.process.setEditable(False) self.process.setEditable(False)
self.process.currentTextChanged.connect(self.update_tips) self.process.currentTextChanged.connect(self.update_tips)
# self.tips = QComboBox() self.layout.addWidget(self.check, 0, 0)
# self.tips.setMaximumWidth(200)
# self.tips.setMinimumWidth(200)
# self.tips.setEditable(True)
self.layout.addWidget(self.check,0,0)
label = QLabel(f"{role.name}:") label = QLabel(f"{role.name}:")
label.setMinimumWidth(200) label.setMinimumWidth(200)
label.setMaximumWidth(200) label.setMaximumWidth(200)
label.setAlignment(Qt.AlignmentFlag.AlignLeft) label.setAlignment(Qt.AlignmentFlag.AlignLeft)
self.layout.addWidget(label,0,1) self.layout.addWidget(label, 0, 1)
self.layout.addWidget(self.box,0,2) self.layout.addWidget(self.box, 0, 2)
self.layout.addWidget(self.process,0,3) self.layout.addWidget(self.process, 0, 3)
self.setLayout(self.layout) self.setLayout(self.layout)
def update_processes(self): def update_processes(self):
""" """
Changes processes when equipment is changed Changes processes when equipment is changed
""" """
equip = self.box.currentText() 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] 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.clear()
self.process.addItems([item for item in equip2.processes if item in self.role.processes]) self.process.addItems([item for item in equip2.processes if item in self.role.processes])
@@ -143,24 +140,25 @@ class RoleComboBox(QWidget):
widget.addItems(tip_choices) widget.addItems(tip_choices)
# logger.debug(f"Tiprole: {tip_role.__dict__}") # logger.debug(f"Tiprole: {tip_role.__dict__}")
widget.setObjectName(f"tips_{tip_role.name}") widget.setObjectName(f"tips_{tip_role.name}")
widget.setMinimumWidth(100) widget.setMinimumWidth(200)
widget.setMaximumWidth(100) widget.setMaximumWidth(200)
self.layout.addWidget(widget, iii, 4) self.layout.addWidget(widget, iii, 4)
else: else:
widget = QLabel("") widget = QLabel("")
widget.setMinimumWidth(100) widget.setMinimumWidth(200)
widget.setMaximumWidth(100) widget.setMaximumWidth(200)
self.layout.addWidget(widget,0,4) self.layout.addWidget(widget, 0, 4)
def parse_form(self) -> PydEquipment|None: def parse_form(self) -> PydEquipment | None:
""" """
Creates PydEquipment for values in form Creates PydEquipment for values in form
Returns: Returns:
PydEquipment|None: PydEquipment matching form PydEquipment|None: PydEquipment matching form
""" """
eq = Equipment.query(name=self.box.currentText()) eq = Equipment.query(name=self.box.currentText())
tips = [PydTips(name=item.currentText(), role=item.objectName().lstrip("tips").lstrip("_")) for item in self.findChildren(QComboBox) if item.objectName().startswith("tips")] tips = [PydTips(name=item.currentText(), role=item.objectName().lstrip("tips").lstrip("_")) for item in
self.findChildren(QComboBox) if item.objectName().startswith("tips")]
logger.debug(tips) logger.debug(tips)
try: try:
return PydEquipment( return PydEquipment(
@@ -173,4 +171,3 @@ class RoleComboBox(QWidget):
) )
except Exception as e: except Exception as e:
logger.error(f"Could create PydEquipment due to: {e}") logger.error(f"Could create PydEquipment due to: {e}")