Fixed bug in adding new reagent during procedure creation.

This commit is contained in:
lwark
2025-09-26 15:09:52 -05:00
parent 7f40e091fa
commit dba4ca0130
8 changed files with 36 additions and 26 deletions

View File

@@ -929,7 +929,7 @@ class Procedure(BaseClass):
logger.info(f"Add Results! {resultstype_name}") logger.info(f"Add Results! {resultstype_name}")
from backend.managers import results from backend.managers import results
results_manager = getattr(results, f"{resultstype_name}Manager") results_manager = getattr(results, f"{resultstype_name}Manager")
rs = results_manager(procedure=self, parent=obj, fname=Path("C:\\Users\lwark\Documents\Submission_Forms\QubitData_18-09-2025_13-43-53.csv")) rs = results_manager(procedure=self, parent=obj)#, fname=Path("C:\\Users\lwark\Documents\Submission_Forms\QubitData_18-09-2025_13-43-53.csv"))
procedure = rs.procedure_to_pydantic() procedure = rs.procedure_to_pydantic()
samples = rs.samples_to_pydantic() samples = rs.samples_to_pydantic()
if procedure: if procedure:

View File

@@ -1926,7 +1926,7 @@ class ProcedureSampleAssociation(BaseClass):
# NOTE: Figure out how to merge the misc_info if doing .update instead. # NOTE: Figure out how to merge the misc_info if doing .update instead.
relevant = {k: v for k, v in output.items() if k not in ['sample']} relevant = {k: v for k, v in output.items() if k not in ['sample']}
output = output['sample'].details_dict() output = output['sample'].details_dict()
logger.debug(output) # logger.debug(output)
misc = output['misc_info'] misc = output['misc_info']
output.update(relevant) output.update(relevant)
output['misc_info'] = misc output['misc_info'] = misc

View File

@@ -62,7 +62,7 @@ class DefaultParser(object):
self.sheet = sheet self.sheet = sheet
if not start_row: if not start_row:
start_row = self.__class__.start_row start_row = self.__class__.start_row
if self.filepath.suffix == ".xslx": if self.filepath.suffix == ".xlsx":
self.workbook = load_workbook(self.filepath, data_only=True) self.workbook = load_workbook(self.filepath, data_only=True)
self.worksheet = self.workbook[self.sheet] self.worksheet = self.workbook[self.sheet]
elif self.filepath.suffix == ".csv": elif self.filepath.suffix == ".csv":

View File

@@ -1,6 +1,8 @@
""" """
""" """
from openpyxl import Workbook
from backend.excel.writers import DefaultKEYVALUEWriter, DefaultTABLEWriter from backend.excel.writers import DefaultKEYVALUEWriter, DefaultTABLEWriter
from backend.db.models import ProcedureType from backend.db.models import ProcedureType
from tools import flatten_list from tools import flatten_list
@@ -16,6 +18,15 @@ class DefaultResultsSampleWriter(DefaultTABLEWriter):
super().__init__(pydant_obj=pydant_obj, proceduretype=proceduretype, *args, **kwargs) super().__init__(pydant_obj=pydant_obj, proceduretype=proceduretype, *args, **kwargs)
self.pydant_obj = flatten_list([sample.results for sample in pydant_obj.sample]) self.pydant_obj = flatten_list([sample.results for sample in pydant_obj.sample])
def write_to_workbook(self, workbook: Workbook, sheet: str | None = None,
start_row: int | None = None, *args, **kwargs) -> Workbook:
try:
self.worksheet = workbook[f"{self.proceduretype.name[:15]} Results"]
except KeyError:
self.worksheet = workbook.create_sheet(f"{self.proceduretype.name[:15]} Results")
# worksheet = workbook[f"{self.proceduretype.name[:15]} Results"]
return workbook
from .qubit_results_writer import QubitInfoWriter, QubitSampleWriter from .qubit_results_writer import QubitInfoWriter, QubitSampleWriter
from .pcr_results_writer import PCRInfoWriter, PCRSampleWriter from .pcr_results_writer import PCRInfoWriter, PCRSampleWriter

View File

@@ -1,16 +1,13 @@
""" """
Writers for PCR results from Design and Analysis Software Writers for PCR results from Qubit device
""" """
from __future__ import annotations from __future__ import annotations
import logging import logging
from pprint import pformat from pprint import pformat
from typing import Generator, TYPE_CHECKING
from openpyxl import Workbook from openpyxl import Workbook
from openpyxl.styles import Alignment from openpyxl.styles import Alignment
from . import DefaultResultsInfoWriter, DefaultResultsSampleWriter from . import DefaultResultsInfoWriter, DefaultResultsSampleWriter
from tools import flatten_list
if TYPE_CHECKING:
from backend.db.models import ProcedureType
logger = logging.getLogger(f"submissions.{__name__}") logger = logging.getLogger(f"submissions.{__name__}")
@@ -24,16 +21,12 @@ class QubitInfoWriter(DefaultResultsInfoWriter):
class QubitSampleWriter(DefaultResultsSampleWriter): class QubitSampleWriter(DefaultResultsSampleWriter):
def write_to_workbook(self, workbook: Workbook, *args, **kwargs) -> Workbook: def write_to_workbook(self, workbook: Workbook, *args, **kwargs) -> Workbook:
try: workbook = super().write_to_workbook(workbook=workbook, *args, **kwargs)
self.worksheet = workbook[f"{self.proceduretype.name[:15]} Results"]
except KeyError:
self.worksheet = workbook.create_sheet(f"{self.proceduretype.name[:15]} Results")
# worksheet = workbook[f"{self.proceduretype.name[:15]} Results"]
header_row = self.proceduretype.allowed_result_methods['Qubit']['sample']['start_row'] header_row = self.proceduretype.allowed_result_methods['Qubit']['sample']['start_row']
for iii, header in enumerate(self.column_headers, start=1): for iii, header in enumerate(self.column_headers, start=1):
logger.debug(f"Row: {header_row}, column: {iii}") # logger.debug(f"Row: {header_row}, column: {iii}")
self.worksheet.cell(row=header_row, column=iii, value=header.replace("_", " ").title()) self.worksheet.cell(row=header_row, column=iii, value=header.replace("_", " ").title())
logger.debug(f"Column headers: {self.column_headers}") # logger.debug(f"Column headers: {self.column_headers}")
for iii, result in enumerate(self.pydant_obj, start = 1): for iii, result in enumerate(self.pydant_obj, start = 1):
row = header_row + iii row = header_row + iii
for k, v in result.result.items(): for k, v in result.result.items():
@@ -42,7 +35,7 @@ class QubitSampleWriter(DefaultResultsSampleWriter):
except StopIteration: except StopIteration:
print(f"fail for {k.replace('_', ' ').title()}") print(f"fail for {k.replace('_', ' ').title()}")
continue continue
logger.debug(f"Writing to row: {row}, column {column}") # logger.debug(f"Writing to row: {row}, column {column}")
cell = self.worksheet.cell(row=row, column=column) cell = self.worksheet.cell(row=row, column=column)
cell.value = v cell.value = v
cell.alignment = Alignment(horizontal='left') cell.alignment = Alignment(horizontal='left')
@@ -56,6 +49,3 @@ class QubitSampleWriter(DefaultResultsSampleWriter):
for k, value in result.result.items(): for k, value in result.result.items():
output.append(k) output.append(k)
return sorted(list(set(output))) return sorted(list(set(output)))

View File

@@ -15,7 +15,7 @@ class DefaultManager(object):
def __init__(self, parent, input_object: Path | str | None = None): def __init__(self, parent, input_object: Path | str | None = None):
self.parent = parent self.parent = parent
logger.debug(f"Input object: {pformat(input_object.__dict__)}")
match input_object: match input_object:
case str(): case str():
self.input_object = Path(input_object) self.input_object = Path(input_object)

View File

@@ -254,12 +254,12 @@ class PydReagent(PydBaseClass):
report = Report() report = Report()
if self.model_extra is not None: if self.model_extra is not None:
self.__dict__.update(self.model_extra) self.__dict__.update(self.model_extra)
reagent, new = ReagentLot.query_or_create(lot=self.lot, name=self.name) reagentlot, new = ReagentLot.query_or_create(lot=self.lot, name=self.name)
if new: if new:
reagentrole = ReagentRole.query(name=self.reagentrole) reagent = Reagent.query(name=self.name)
reagent.reagentrole = reagentrole reagentlot.reagent = reagent
reagent.expiry = self.expiry reagentlot.expiry = self.expiry
return reagent, report return reagentlot, report
class PydSample(PydBaseClass): class PydSample(PydBaseClass):

View File

@@ -56,6 +56,14 @@ class ProcedureCreation(QDialog):
proceduretype_dict = self.proceduretype.details_dict() proceduretype_dict = self.proceduretype.details_dict()
# NOTE: Add --New-- as an option for reagents. # NOTE: Add --New-- as an option for reagents.
for key, value in self.procedure.reagentrole.items(): for key, value in self.procedure.reagentrole.items():
try:
check = "--New--" in [v['name'] for v in value]
except TypeError:
try:
check = "--New--" in [v.name for v in value]
except (TypeError, AttributeError):
check = True
if not check:
value.append(dict(name="--New--")) value.append(dict(name="--New--"))
if self.procedure.equipment: if self.procedure.equipment:
for equipmentrole in proceduretype_dict['equipment']: for equipmentrole in proceduretype_dict['equipment']:
@@ -150,6 +158,7 @@ class ProcedureCreation(QDialog):
def add_new_reagent(self, reagentrole: str, name: str, lot: str, expiry: str): def add_new_reagent(self, reagentrole: str, name: str, lot: str, expiry: str):
from backend.validators.pydant import PydReagent from backend.validators.pydant import PydReagent
expiry = datetime.datetime.strptime(expiry, "%Y-%m-%d") expiry = datetime.datetime.strptime(expiry, "%Y-%m-%d")
logger.debug(f"{reagentrole}, {name}, {lot}, {expiry}")
pyd = PydReagent(reagentrole=reagentrole, name=name, lot=lot, expiry=expiry) pyd = PydReagent(reagentrole=reagentrole, name=name, lot=lot, expiry=expiry)
self.procedure.reagentrole[reagentrole].insert(0, pyd) self.procedure.reagentrole[reagentrole].insert(0, pyd)
self.set_html() self.set_html()