Fixed Tips not being written during export.

This commit is contained in:
lwark
2025-09-23 10:52:46 -05:00
parent 4522f5909e
commit e9ff0a2774
4 changed files with 31 additions and 21 deletions

View File

@@ -995,6 +995,7 @@ class Procedure(BaseClass):
def to_pydantic(self, **kwargs): def to_pydantic(self, **kwargs):
from backend.validators.pydant import PydReagent from backend.validators.pydant import PydReagent
output = super().to_pydantic() output = super().to_pydantic()
print(f"Super to_pydantic: {output.equipment}")
output.sample = [item.to_pydantic() for item in output.proceduresampleassociation] output.sample = [item.to_pydantic() for item in output.proceduresampleassociation]
reagents = [] reagents = []
for reagent in output.reagent: for reagent in output.reagent:
@@ -1009,7 +1010,6 @@ class Procedure(BaseClass):
output.result = [item.to_pydantic() for item in self.results] output.result = [item.to_pydantic() for item in self.results]
output.sample_results = flatten_list( output.sample_results = flatten_list(
[[result.to_pydantic() for result in item.results] for item in self.proceduresampleassociation]) [[result.to_pydantic() for result in item.results] for item in self.proceduresampleassociation])
return output return output
def create_proceduresampleassociations(self, sample): def create_proceduresampleassociations(self, sample):
@@ -2148,7 +2148,7 @@ class ProcedureEquipmentAssociation(BaseClass):
@property @property
def tips(self): def tips(self):
try: try:
return Tips.query(id=self.tips_id, limit=1) return TipsLot.query(id=self.tipslot_id, limit=1)
except AttributeError: except AttributeError:
return None return None
@@ -2175,7 +2175,9 @@ class ProcedureEquipmentAssociation(BaseClass):
PydEquipment: pydantic equipment model PydEquipment: pydantic equipment model
""" """
from backend.validators import PydEquipment from backend.validators import PydEquipment
return PydEquipment(**self.details_dict()) output = PydEquipment(**self.details_dict())
output.tips = self.tips.to_pydantic(pyd_model_name="PydTips")
return output
@classmethod @classmethod
@setup_lookup @setup_lookup
@@ -2232,7 +2234,7 @@ class ProcedureEquipmentAssociation(BaseClass):
output['processversion'] = None output['processversion'] = None
try: try:
output['tips'] = self.tipslot.details_dict() output['tips'] = self.tipslot.details_dict()
except AttributeError: except AttributeError as e:
output['tips'] = None output['tips'] = None
return output return output

View File

@@ -15,7 +15,7 @@ class ProcedureInfoWriter(DefaultKEYVALUEWriter):
header_order = [] header_order = []
exclude = ['control', 'equipment', 'excluded', 'id', 'misc_info', 'plate_map', 'possible_kits', exclude = ['control', 'equipment', 'excluded', 'id', 'misc_info', 'plate_map', 'possible_kits',
'procedureequipmentassociation', 'procedurereagentassociation', 'proceduresampleassociation', 'proceduretipsassociation', 'reagent', 'procedureequipmentassociation', 'procedurereagentassociation', 'proceduresampleassociation', 'proceduretipsassociation', 'reagent',
'reagentrole', 'results', 'sample', 'tips', 'reagentlot'] 'reagentrole', 'results', 'sample', 'tips', 'reagentlot', 'platemap']
def __init__(self, pydant_obj, *args, **kwargs): def __init__(self, pydant_obj, *args, **kwargs):
super().__init__(pydant_obj=pydant_obj, *args, **kwargs) super().__init__(pydant_obj=pydant_obj, *args, **kwargs)
@@ -45,7 +45,7 @@ class ProcedureReagentWriter(DefaultTABLEWriter):
class ProcedureEquipmentWriter(DefaultTABLEWriter): class ProcedureEquipmentWriter(DefaultTABLEWriter):
exclude = ['id'] exclude = ['id', "equipment_role"]
header_order = ['equipmentrole', 'name', 'asset_number', 'process', 'tips'] header_order = ['equipmentrole', 'name', 'asset_number', 'process', 'tips']
def __init__(self, pydant_obj, range_dict: dict | None = None, *args, **kwargs): def __init__(self, pydant_obj, range_dict: dict | None = None, *args, **kwargs):

View File

@@ -14,10 +14,12 @@ class DefaultRunManager(DefaultManager):
def write(self) -> Workbook: def write(self) -> Workbook:
from backend.managers import DefaultClientSubmissionManager, DefaultProcedureManager from backend.managers import DefaultClientSubmissionManager, DefaultProcedureManager
logger.info(f"Initializing write") logger.info(f"Initializing write")
clientsubmission = DefaultClientSubmissionManager(parent=self.parent, input_object=self.pyd.clientsubmission, submissiontype=self.pyd.clientsubmission.submissiontype) self.clientsubmission = DefaultClientSubmissionManager(parent=self.parent, input_object=self.pyd.clientsubmission, submissiontype=self.pyd.clientsubmission.submissiontype)
workbook = Workbook() workbook = Workbook()
workbook = clientsubmission.write(workbook=workbook) workbook = self.clientsubmission.write(workbook=workbook)
self.procedures = []
for procedure in self.pyd.procedure: for procedure in self.pyd.procedure:
procedure = DefaultProcedureManager(proceduretype=procedure.proceduretype, parent=self.parent, input_object=procedure) procedure = DefaultProcedureManager(proceduretype=procedure.proceduretype, parent=self.parent, input_object=procedure)
workbook: Workbook = procedure.write(workbook=workbook) workbook: Workbook = procedure.write(workbook=workbook)
self.procedures.append(procedure)
return workbook return workbook

View File

@@ -143,6 +143,7 @@ class PydReagentLot(PydBaseClass):
missing: bool = Field(default=True) missing: bool = Field(default=True)
comment: str | None = Field(default="", validate_default=True) comment: str | None = Field(default="", validate_default=True)
class PydReagent(PydBaseClass): class PydReagent(PydBaseClass):
lot: str | None lot: str | None
reagentrole: str | None reagentrole: str | None
@@ -388,23 +389,29 @@ class PydEquipment(PydBaseClass):
@field_validator('tips', mode='before') @field_validator('tips', mode='before')
@classmethod @classmethod
def tips_to_pydantic(cls, value, values): def tips_to_pydantic(cls, value, values):
print(f"Value coming into tips: {value}")
if isinstance(value, GeneratorType): if isinstance(value, GeneratorType):
value = [item for item in value] value = [item for item in value]
value = convert_nans_to_nones(value) value = convert_nans_to_nones(value)
if not value: if not value:
value = [] value = []
if isinstance(value, TipsLot): match value:
case TipsLot():
value = value.to_pydantic(pyd_model_name="PydTips") value = value.to_pydantic(pyd_model_name="PydTips")
else: case dict():
try: value = PydTips(**value)
d: Tips = next( case _:
(tips for tips in value if values.data['name'] in [item.name for item in tips.equipment]), pass
None) # else:
if d: # try:
value = d.to_pydantic() # d: Tips = next(
except AttributeError as e: # (tips for tips in value if values.data['name'] in [item.name for item in tips.equipment]),
logger.error(f"Process Validation error due to {e}") # None)
value = [] # if d:
# value = d.to_pydantic()
# except AttributeError as e:
# logger.error(f"Process Validation error due to {e}")
# value = []
return value return value
@report_result @report_result
@@ -471,7 +478,6 @@ class PydEquipment(PydBaseClass):
return {k: getattr(self, k) for k in fields} return {k: getattr(self, k) for k in fields}
class PydContact(BaseModel): class PydContact(BaseModel):
name: str name: str
phone: str | None phone: str | None