diff --git a/src/submissions/backend/db/models/kits.py b/src/submissions/backend/db/models/kits.py index 50938e3..4b160af 100644 --- a/src/submissions/backend/db/models/kits.py +++ b/src/submissions/backend/db/models/kits.py @@ -1418,6 +1418,16 @@ class Procedure(BaseClass): def delete(self, obj): logger.debug("Delete!") + def details_dict(self): + output = super().details_dict() + output['kittype'] = output['kittype'].details_dict() + output['proceduretype'] = output['proceduretype'].details_dict() + output['results'] = [result.details_dict() for result in output['results']] + output['sample'] = [sample.details_dict() for sample in output['sample']] + output['reagent'] = [reagent.details_dict() for reagent in output['procedurereagentassociation']] + output['equipment'] = [equipment.details_dict() for equipment in output['procedureequipmentassociation']] + output['tips'] = [tips.details_dict() for tips in output['proceduretipsassociation']] + return output class ProcedureTypeKitTypeAssociation(BaseClass): """ @@ -1872,6 +1882,17 @@ class ProcedureReagentAssociation(BaseClass): from backend.validators import PydReagent return PydReagent(**self.to_sub_dict(kittype=kittype)) + def details_dict(self): + output = super().details_dict() + # 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 ['reagent']} + output = output['reagent'].details_dict() + misc = output['_misc_info'] + output.update(relevant) + output['_misc_info'] = misc + output['results'] = [result.details_dict() for result in output['results']] + return output + class Equipment(BaseClass, LogMixin): """ @@ -2316,6 +2337,16 @@ class ProcedureEquipmentAssociation(BaseClass): query = query.filter(cls.equipmentrole == equipmentrole) return cls.execute_query(query=query, limit=limit, **kwargs) + def details_dict(self): + output = super().details_dict() + # 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 ['equipment']} + output = output['equipment'].details_dict() + misc = output['_misc_info'] + output.update(relevant) + output['_misc_info'] = misc + output['process'] = self.process.details_dict() + return output class ProcedureTypeEquipmentRoleAssociation(BaseClass): """ diff --git a/src/submissions/backend/db/models/submissions.py b/src/submissions/backend/db/models/submissions.py index 3ce844a..435e9e1 100644 --- a/src/submissions/backend/db/models/submissions.py +++ b/src/submissions/backend/db/models/submissions.py @@ -70,7 +70,7 @@ class ClientSubmission(BaseClass, LogMixin): cascade="all, delete-orphan", ) #: Relation to ClientSubmissionSampleAssociation - samples = association_proxy("clientsubmissionsampleassociation", + sample = association_proxy("clientsubmissionsampleassociation", "sample") #, creator=lambda sample: ClientSubmissionSampleAssociation( # sample=sample)) #: Association proxy to ClientSubmissionSampleAssociation.sample @@ -332,6 +332,7 @@ class ClientSubmission(BaseClass, LogMixin): output['contact'] = output['contact'].details_dict() output['submissiontype'] = output['submissiontype'].details_dict() output['run'] = [run.details_dict() for run in output['run']] + output['sample'] = [sample.details_dict() for sample in output['clientsubmissionsampleassociation']] return output @@ -589,6 +590,12 @@ class Run(BaseClass, LogMixin): output["completed_date"] = self.completed_date return output + def details_dict(self): + output = super().details_dict() + output['sample'] = [sample.details_dict() for sample in output['runsampleassociation']] + output['procedure'] = [procedure.details_dict() for procedure in output['procedure']] + return output + @classmethod def archive_submissions(cls, start_date: date | datetime | str | int | None = None, end_date: date | datetime | str | int | None = None, @@ -1629,6 +1636,20 @@ class ClientSubmissionSampleAssociation(BaseClass): sample['submission_rank'] = self.submission_rank return sample + def details_dict(self): + output = super().details_dict() + # 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']} + logger.debug(f"Relevant info from assoc output: {pformat(relevant)}") + output = output['sample'].details_dict() + misc = output['_misc_info'] + logger.debug(f"Output from sample: {pformat(output)}") + output.update(relevant) + output['_misc_info'] = misc + # output['sample'] = temp + # output.update(output['sample'].details_dict()) + return output + def to_pydantic(self) -> "PydSample": """ Creates a pydantic model for this sample. @@ -2034,6 +2055,17 @@ class RunSampleAssociation(BaseClass): def delete(self): raise AttributeError(f"Delete not implemented for {self.__class__}") + def details_dict(self): + output = super().details_dict() + # 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']} + logger.debug(f"Relevant info from assoc output: {pformat(relevant)}") + output = output['sample'].details_dict() + misc = output['_misc_info'] + logger.debug(f"Output from sample: {pformat(output)}") + output.update(relevant) + output['_misc_info'] = misc + return output class ProcedureSampleAssociation(BaseClass): @@ -2093,3 +2125,15 @@ class ProcedureSampleAssociation(BaseClass): except ValueError as e: logger.error(f"Problem incrementing id: {e}") return 1 + + def details_dict(self): + output = super().details_dict() + # 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']} + output = output['sample'].details_dict() + misc = output['_misc_info'] + output.update(relevant) + output['_misc_info'] = misc + output['results'] = [result.details_dict() for result in output['results']] + return output +