@@ -1641,7 +1641,17 @@ class Job(Base, JobLike, UsesCreateAndUpdateTime, Dictifiable, Serializable):
16411641 back_populates="job"
16421642 )
16431643
1644- dict_collection_visible_keys = ["id", "state", "exit_code", "update_time", "create_time", "galaxy_version"]
1644+ dict_collection_visible_keys = [
1645+ "id",
1646+ "state",
1647+ "exit_code",
1648+ "update_time",
1649+ "create_time",
1650+ "galaxy_version",
1651+ "tool_id",
1652+ "tool_version",
1653+ "history_id",
1654+ ]
16451655 dict_element_visible_keys = [
16461656 "id",
16471657 "state",
@@ -1652,6 +1662,9 @@ class Job(Base, JobLike, UsesCreateAndUpdateTime, Dictifiable, Serializable):
16521662 "command_version",
16531663 "copied_from_job_id",
16541664 "user_id",
1665+ "tool_id",
1666+ "tool_version",
1667+ "history_id",
16551668 ]
16561669
16571670 _numeric_metric = JobMetricNumeric
@@ -2188,9 +2201,6 @@ def to_dict(self, view="collection", system_details=False):
21882201 rval = super().to_dict(view="collection")
21892202 else:
21902203 rval = super().to_dict(view=view)
2191- rval["tool_id"] = self.tool_id
2192- rval["tool_version"] = self.tool_version
2193- rval["history_id"] = self.history_id
21942204 if system_details or view == "admin_job_list":
21952205 # System level details that only admins should have.
21962206 rval["external_id"] = self.job_runner_external_id
@@ -2825,6 +2835,17 @@ def job_list(self):
28252835 .all()
28262836 )
28272837
2838+ def get_job_attributes(self, attributes: list[str]):
2839+ session = required_object_session(self)
2840+ targets = [getattr(Job.table.columns, attr) for attr in attributes]
2841+ stmt = (
2842+ select(*targets)
2843+ .select_from(Job)
2844+ .join(ImplicitCollectionJobsJobAssociation, Job.id == ImplicitCollectionJobsJobAssociation.job_id)
2845+ .where(ImplicitCollectionJobsJobAssociation.implicit_collection_jobs_id == self.id)
2846+ )
2847+ return session.execute(stmt)
2848+
28282849 def _serialize(self, id_encoder, serialization_options):
28292850 rval = dict_for(
28302851 self,
@@ -10143,6 +10164,15 @@ def _serialize(self, id_encoder, serialization_options):
1014310164
1014410165 return step_attrs
1014510166
10167+ def get_jobs_dict(self):
10168+ if self.implicit_collection_jobs:
10169+ result = self.implicit_collection_jobs.get_job_attributes(Job.dict_collection_visible_keys)
10170+ return [{"model_class": "Job", **row._mapping} for row in result]
10171+ elif self.job:
10172+ return [self.job.to_dict()]
10173+ else:
10174+ return []
10175+
1014610176 def to_dict(self, view="collection", value_mapper=None):
1014710177 rval = super().to_dict(view=view, value_mapper=value_mapper)
1014810178 rval["order_index"] = self.workflow_step.order_index
@@ -10151,9 +10181,7 @@ def to_dict(self, view="collection", value_mapper=None):
1015110181 # Following no longer makes sense...
1015210182 # rval['state'] = self.job.state if self.job is not None else None
1015310183 if view == "element":
10154- jobs = []
10155- for job in self.jobs:
10156- jobs.append(job.to_dict())
10184+ jobs = self.get_jobs_dict()
1015710185
1015810186 outputs = {}
1015910187 for output_assoc in self.output_datasets:
0 commit comments