Improved javascript error handling

This commit is contained in:
lwark
2025-07-02 14:52:23 -05:00
parent c4c330b90c
commit 8e21c349cb
4 changed files with 40 additions and 7 deletions

View File

@@ -1500,9 +1500,20 @@ class Procedure(BaseClass):
return output return output
def to_pydantic(self, **kwargs): def to_pydantic(self, **kwargs):
from backend.validators.pydant import PydResults from backend.validators.pydant import PydResults, PydReagent
output = super().to_pydantic() output = super().to_pydantic()
output.kittype = dict(value=output.kittype['name'], missing=False) 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 = [] results = []
for result in output.results: for result in output.results:
match result: match result:
@@ -1979,7 +1990,7 @@ class ProcedureReagentAssociation(BaseClass):
misc = output['misc_info'] misc = output['misc_info']
output.update(relevant) output.update(relevant)
output['misc_info'] = misc 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 return output

View File

@@ -232,6 +232,10 @@ class PydReagent(PydBaseClass):
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 = Reagent.query_or_create(lot=self.lot, name=self.name) 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}") # logger.debug(f"Reagent: {reagent}")
# if reagent is None: # if reagent is None:
# reagent = Reagent() # reagent = Reagent()
@@ -1545,7 +1549,11 @@ class PydProcedure(PydBaseClass, arbitrary_types_allowed=True):
# logger.debug(f"Updated samples:\n{pformat(self.sample)}") # logger.debug(f"Updated samples:\n{pformat(self.sample)}")
def update_reagents(self, reagentrole: str, name: str, lot: str, expiry: str): 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: if removable:
idx = self.reagent.index(removable) idx = self.reagent.index(removable)
self.reagent.remove(removable) self.reagent.remove(removable)
@@ -1581,8 +1589,12 @@ class PydProcedure(PydBaseClass, arbitrary_types_allowed=True):
# NOTE: reset reagent associations. # NOTE: reset reagent associations.
sql.procedurereagentassociation = [] sql.procedurereagentassociation = []
for reagent in self.reagent: for reagent in self.reagent:
logger.debug(reagent)
if isinstance(reagent, dict):
reagent = PydReagent(**reagent)
reagent = reagent.to_sql() reagent = reagent.to_sql()
if reagent not in sql.reagent: if reagent not in sql.reagent:
logger.debug(f"Adding {reagent} to {sql}")
reagent_assoc = ProcedureReagentAssociation(reagent=reagent, procedure=sql) reagent_assoc = ProcedureReagentAssociation(reagent=reagent, procedure=sql)
try: try:
start_index = max([item.id for item in ProcedureSampleAssociation.query()]) + 1 start_index = max([item.id for item in ProcedureSampleAssociation.query()]) + 1

View File

@@ -137,7 +137,8 @@ class ProcedureCreation(QDialog):
def update_reagent(self, reagentrole:str, name_lot_expiry:str): def update_reagent(self, reagentrole:str, name_lot_expiry:str):
try: try:
name, lot, expiry = name_lot_expiry.split(" - ") name, lot, expiry = name_lot_expiry.split(" - ")
except ValueError: except ValueError as e:
logger.debug(f"Couldn't perform split due to {e}")
return return
self.procedure.update_reagents(reagentrole=reagentrole, name=name, lot=lot, expiry=expiry) self.procedure.update_reagents(reagentrole=reagentrole, name=name, lot=lot, expiry=expiry)

View File

@@ -28,6 +28,7 @@ var reagentRoles = document.getElementsByClassName("reagentrole");
for(let i = 0; i < reagentRoles.length; i++) { for(let i = 0; i < reagentRoles.length; i++) {
reagentRoles[i].addEventListener("change", function() { reagentRoles[i].addEventListener("change", function() {
if (reagentRoles[i].value.includes("--New--")) { if (reagentRoles[i].value.includes("--New--")) {
alert("Create new reagent.")
var br = document.createElement("br"); var br = document.createElement("br");
var new_reg = document.getElementById("new_" + reagentRoles[i].id); var new_reg = document.getElementById("new_" + reagentRoles[i].id);
var new_form = document.createElement("form"); 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; expiry = document.getElementById("new_" + reagentRoles[i].id + "_expiry").value;
backend.add_new_reagent(reagentRoles[i].id, name, lot, expiry); backend.add_new_reagent(reagentRoles[i].id, name, lot, expiry);
new_form.remove(); new_form.remove();
reagentRoles[i].dispatchEvent(changed_it); // reagentRoles[i].dispatchEvent(changed_it);
} }
new_reg.appendChild(new_form); new_reg.appendChild(new_form);
} else { } else {
newregform = document.getElementById(reagentRoles[i].id + "_addition"); newregform = document.getElementById(reagentRoles[i].id + "_addition");
newregform.remove(); try {
backend.update_reagent(reagentRoles[i].id, reagentRoles[i].value) newregform.remove();
}
catch(err) {
console.log("Missed it.");
}
alert(reagentRoles[i].value);
backend.update_reagent(reagentRoles[i].id, reagentRoles[i].value);
} }
}); });
}; };