diff --git a/src/submissions/backend/db/models/procedures.py b/src/submissions/backend/db/models/procedures.py index a28ed44..e52827f 100644 --- a/src/submissions/backend/db/models/procedures.py +++ b/src/submissions/backend/db/models/procedures.py @@ -995,6 +995,7 @@ class Procedure(BaseClass): def to_pydantic(self, **kwargs): from backend.validators.pydant import PydReagent output = super().to_pydantic() + print(f"Super to_pydantic: {output.equipment}") output.sample = [item.to_pydantic() for item in output.proceduresampleassociation] reagents = [] for reagent in output.reagent: @@ -1009,7 +1010,6 @@ class Procedure(BaseClass): output.result = [item.to_pydantic() for item in self.results] output.sample_results = flatten_list( [[result.to_pydantic() for result in item.results] for item in self.proceduresampleassociation]) - return output def create_proceduresampleassociations(self, sample): @@ -2148,7 +2148,7 @@ class ProcedureEquipmentAssociation(BaseClass): @property def tips(self): try: - return Tips.query(id=self.tips_id, limit=1) + return TipsLot.query(id=self.tipslot_id, limit=1) except AttributeError: return None @@ -2175,7 +2175,9 @@ class ProcedureEquipmentAssociation(BaseClass): PydEquipment: pydantic equipment model """ 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 @setup_lookup @@ -2232,7 +2234,7 @@ class ProcedureEquipmentAssociation(BaseClass): output['processversion'] = None try: output['tips'] = self.tipslot.details_dict() - except AttributeError: + except AttributeError as e: output['tips'] = None return output diff --git a/src/submissions/backend/excel/writers/procedure_writers/__init__.py b/src/submissions/backend/excel/writers/procedure_writers/__init__.py index 2187c15..436299c 100644 --- a/src/submissions/backend/excel/writers/procedure_writers/__init__.py +++ b/src/submissions/backend/excel/writers/procedure_writers/__init__.py @@ -15,7 +15,7 @@ class ProcedureInfoWriter(DefaultKEYVALUEWriter): header_order = [] exclude = ['control', 'equipment', 'excluded', 'id', 'misc_info', 'plate_map', 'possible_kits', 'procedureequipmentassociation', 'procedurereagentassociation', 'proceduresampleassociation', 'proceduretipsassociation', 'reagent', - 'reagentrole', 'results', 'sample', 'tips', 'reagentlot'] + 'reagentrole', 'results', 'sample', 'tips', 'reagentlot', 'platemap'] def __init__(self, pydant_obj, *args, **kwargs): super().__init__(pydant_obj=pydant_obj, *args, **kwargs) @@ -45,7 +45,7 @@ class ProcedureReagentWriter(DefaultTABLEWriter): class ProcedureEquipmentWriter(DefaultTABLEWriter): - exclude = ['id'] + exclude = ['id', "equipment_role"] header_order = ['equipmentrole', 'name', 'asset_number', 'process', 'tips'] def __init__(self, pydant_obj, range_dict: dict | None = None, *args, **kwargs): diff --git a/src/submissions/backend/managers/runs.py b/src/submissions/backend/managers/runs.py index 2bb1de1..1039b72 100644 --- a/src/submissions/backend/managers/runs.py +++ b/src/submissions/backend/managers/runs.py @@ -14,10 +14,12 @@ class DefaultRunManager(DefaultManager): def write(self) -> Workbook: from backend.managers import DefaultClientSubmissionManager, DefaultProcedureManager 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 = clientsubmission.write(workbook=workbook) + workbook = self.clientsubmission.write(workbook=workbook) + self.procedures = [] for procedure in self.pyd.procedure: procedure = DefaultProcedureManager(proceduretype=procedure.proceduretype, parent=self.parent, input_object=procedure) workbook: Workbook = procedure.write(workbook=workbook) + self.procedures.append(procedure) return workbook diff --git a/src/submissions/backend/validators/pydant.py b/src/submissions/backend/validators/pydant.py index 5473add..41cd157 100644 --- a/src/submissions/backend/validators/pydant.py +++ b/src/submissions/backend/validators/pydant.py @@ -143,6 +143,7 @@ class PydReagentLot(PydBaseClass): missing: bool = Field(default=True) comment: str | None = Field(default="", validate_default=True) + class PydReagent(PydBaseClass): lot: str | None reagentrole: str | None @@ -388,23 +389,29 @@ class PydEquipment(PydBaseClass): @field_validator('tips', mode='before') @classmethod def tips_to_pydantic(cls, value, values): + print(f"Value coming into tips: {value}") if isinstance(value, GeneratorType): value = [item for item in value] value = convert_nans_to_nones(value) if not value: value = [] - if isinstance(value, TipsLot): - value = value.to_pydantic(pyd_model_name="PydTips") - else: - try: - d: Tips = next( - (tips for tips in value if values.data['name'] in [item.name for item in tips.equipment]), - None) - if d: - value = d.to_pydantic() - except AttributeError as e: - logger.error(f"Process Validation error due to {e}") - value = [] + match value: + case TipsLot(): + value = value.to_pydantic(pyd_model_name="PydTips") + case dict(): + value = PydTips(**value) + case _: + pass + # else: + # try: + # d: Tips = next( + # (tips for tips in value if values.data['name'] in [item.name for item in tips.equipment]), + # None) + # if d: + # value = d.to_pydantic() + # except AttributeError as e: + # logger.error(f"Process Validation error due to {e}") + # value = [] return value @report_result @@ -471,7 +478,6 @@ class PydEquipment(PydBaseClass): return {k: getattr(self, k) for k in fields} - class PydContact(BaseModel): name: str phone: str | None