diff --git a/src/submissions/backend/db/models/kits.py b/src/submissions/backend/db/models/kits.py index 5f7cb54..d05f68b 100644 --- a/src/submissions/backend/db/models/kits.py +++ b/src/submissions/backend/db/models/kits.py @@ -1500,9 +1500,20 @@ class Procedure(BaseClass): return output def to_pydantic(self, **kwargs): - from backend.validators.pydant import PydResults + from backend.validators.pydant import PydResults, PydReagent output = super().to_pydantic() output.kittype = dict(value=output.kittype['name'], missing=False) + reagents = [] + for reagent in output.reagent: + match reagent: + case dict(): + reagent['reagentrole'] = next((reagentrole.name for reagentrole in self.kittype.reagentrole if reagentrole in reagent['reagentrole']), None) + reagents.append(PydResults(**reagent)) + case PydReagent(): + reagents.append(reagent) + case _: + pass + output.reagent = [PydReagent(**item) for item in output.reagent] results = [] for result in output.results: match result: @@ -1979,7 +1990,7 @@ class ProcedureReagentAssociation(BaseClass): misc = output['misc_info'] output.update(relevant) output['misc_info'] = misc - output['results'] = [result.details_dict() for result in output['results']] + # output['results'] = [result.details_dict() for result in output['results']] return output diff --git a/src/submissions/backend/validators/pydant.py b/src/submissions/backend/validators/pydant.py index 9cdaaa1..26db451 100644 --- a/src/submissions/backend/validators/pydant.py +++ b/src/submissions/backend/validators/pydant.py @@ -232,6 +232,10 @@ class PydReagent(PydBaseClass): if self.model_extra is not None: self.__dict__.update(self.model_extra) reagent, new = Reagent.query_or_create(lot=self.lot, name=self.name) + if new: + reagentrole = ReagentRole.query(name=self.reagentrole) + reagent.reagentrole = reagentrole + reagent.expiry = self.expiry # logger.debug(f"Reagent: {reagent}") # if reagent is None: # reagent = Reagent() @@ -1545,7 +1549,11 @@ class PydProcedure(PydBaseClass, arbitrary_types_allowed=True): # logger.debug(f"Updated samples:\n{pformat(self.sample)}") def update_reagents(self, reagentrole: str, name: str, lot: str, expiry: str): - removable = next((item for item in self.reagent if item.reagentrole == reagentrole), None) + try: + removable = next((item for item in self.reagent if item.reagentrole == reagentrole), None) + except AttributeError as e: + logger.error(self.reagent) + raise e if removable: idx = self.reagent.index(removable) self.reagent.remove(removable) @@ -1581,8 +1589,12 @@ class PydProcedure(PydBaseClass, arbitrary_types_allowed=True): # NOTE: reset reagent associations. sql.procedurereagentassociation = [] for reagent in self.reagent: + logger.debug(reagent) + if isinstance(reagent, dict): + reagent = PydReagent(**reagent) reagent = reagent.to_sql() if reagent not in sql.reagent: + logger.debug(f"Adding {reagent} to {sql}") reagent_assoc = ProcedureReagentAssociation(reagent=reagent, procedure=sql) try: start_index = max([item.id for item in ProcedureSampleAssociation.query()]) + 1 diff --git a/src/submissions/frontend/widgets/procedure_creation.py b/src/submissions/frontend/widgets/procedure_creation.py index 37c06cf..2172ffb 100644 --- a/src/submissions/frontend/widgets/procedure_creation.py +++ b/src/submissions/frontend/widgets/procedure_creation.py @@ -137,7 +137,8 @@ class ProcedureCreation(QDialog): def update_reagent(self, reagentrole:str, name_lot_expiry:str): try: name, lot, expiry = name_lot_expiry.split(" - ") - except ValueError: + except ValueError as e: + logger.debug(f"Couldn't perform split due to {e}") return self.procedure.update_reagents(reagentrole=reagentrole, name=name, lot=lot, expiry=expiry) diff --git a/src/submissions/templates/js/procedure_form.js b/src/submissions/templates/js/procedure_form.js index 15aa5e9..07ab8bf 100644 --- a/src/submissions/templates/js/procedure_form.js +++ b/src/submissions/templates/js/procedure_form.js @@ -28,6 +28,7 @@ var reagentRoles = document.getElementsByClassName("reagentrole"); for(let i = 0; i < reagentRoles.length; i++) { reagentRoles[i].addEventListener("change", function() { if (reagentRoles[i].value.includes("--New--")) { + alert("Create new reagent.") var br = document.createElement("br"); var new_reg = document.getElementById("new_" + reagentRoles[i].id); var new_form = document.createElement("form"); @@ -73,13 +74,21 @@ for(let i = 0; i < reagentRoles.length; i++) { expiry = document.getElementById("new_" + reagentRoles[i].id + "_expiry").value; backend.add_new_reagent(reagentRoles[i].id, name, lot, expiry); new_form.remove(); - reagentRoles[i].dispatchEvent(changed_it); +// reagentRoles[i].dispatchEvent(changed_it); } new_reg.appendChild(new_form); } else { newregform = document.getElementById(reagentRoles[i].id + "_addition"); - newregform.remove(); - backend.update_reagent(reagentRoles[i].id, reagentRoles[i].value) + try { + newregform.remove(); + } + catch(err) { + console.log("Missed it."); + } + alert(reagentRoles[i].value); + backend.update_reagent(reagentRoles[i].id, reagentRoles[i].value); + + } }); };