Loading client/src/components/Tool/ToolForm.vue +5 −2 Original line number Diff line number Diff line Loading @@ -219,6 +219,9 @@ export default { const { id, version } = this.formConfig; return id.endsWith(version) ? id : `${id}/${version}`; }, toolUuid() { return this.uuid || this.formConfig.uuid; }, tooltip() { if (!this.canMutateHistory) { return this.immutableHistoryMessage; Loading Loading @@ -287,7 +290,7 @@ export default { onUpdate() { this.disabled = true; console.debug("ToolForm - Updating input parameters.", this.formData); updateToolFormData(this.formConfig.id, this.uuid, this.currentVersion, this.history_id, this.formData) updateToolFormData(this.formConfig.id, this.toolUuid, this.currentVersion, this.history_id, this.formData) .then((data) => { this.formConfig = data; }) Loading Loading @@ -339,7 +342,7 @@ export default { history_id: historyId, tool_id: this.formConfig.id, tool_version: this.formConfig.version, tool_uuid: this.uuid, tool_uuid: this.toolUuid, inputs: { ...this.formData, }, Loading lib/galaxy/jobs/__init__.py +2 −2 Original line number Diff line number Diff line Loading @@ -2754,7 +2754,7 @@ class MinimalJobWrapper(HasResourceParameters): def _report_error(self): job = self.get_job() tool = self.app.toolbox.tool_for_job(job) tool = self.app.toolbox.tool_for_job(job, check_access=False) for dataset in job.output_datasets: self.app.error_reports.default_error_plugin.submit_report(dataset, job, tool, user_submission=False) Loading @@ -2777,7 +2777,7 @@ class JobWrapper(MinimalJobWrapper): job, app=app, use_persisted_destination=use_persisted_destination, tool=app.toolbox.tool_for_job(job, exact=True), tool=app.toolbox.tool_for_job(job, exact=True, check_access=False), ) self.queue = queue self.job_runner_mapper = JobRunnerMapper(self, queue.dispatcher.url_to_destination, self.app.job_config) Loading lib/galaxy/managers/datasets.py +3 −1 Original line number Diff line number Diff line Loading @@ -758,7 +758,9 @@ class _UnflattenedMetadataDatasetAssociationSerializer(base.ModelSerializer[T], """ dataset = item if dataset.creating_job: tool = self.app.toolbox.get_tool(dataset.creating_job.tool_id, dataset.creating_job.tool_version) tool = self.app.toolbox.tool_for_job( dataset.creating_job, exact=False, check_access=True, user=context.get("user") ) if tool and tool.is_workflow_compatible: return True return False Loading lib/galaxy/tools/__init__.py +17 −2 Original line number Diff line number Diff line Loading @@ -639,8 +639,15 @@ class ToolBox(AbstractToolBox): return tool return None def tool_for_job(self, job: model.Job, exact=True) -> Optional["Tool"]: def tool_for_job( self, job: model.Job, exact=True, check_access=True, user: Optional[model.User] = None ) -> Optional["Tool"]: if job.dynamic_tool: if check_access: if not user: return None if not job.dynamic_tool.public: self.app.dynamic_tool_manager.ensure_can_use_unprivileged_tool(user) return self.dynamic_tool_to_tool(job.dynamic_tool) else: return self.get_tool(job.tool_id, tool_version=job.tool_version, exact=exact) Loading Loading @@ -2794,6 +2801,9 @@ class Tool(UsesDictVisibleKeys): tool_dict["is_workflow_compatible"] = self.is_workflow_compatible tool_dict["xrefs"] = self.xrefs if self.dynamic_tool: tool_dict["uuid"] = str(self.dynamic_tool.uuid) # Fill in ToolShedRepository info if hasattr(self, "tool_shed") and self.tool_shed: tool_dict["tool_shed_repository"] = { Loading Loading @@ -3016,12 +3026,16 @@ class Tool(UsesDictVisibleKeys): visit_input_values(tool_inputs, params, mapping_callback) def _compare_tool_version(self, job): def _compare_tool_version(self, job: Job): """ Compares a tool version with the tool version from a job (from ToolRunner). """ tool_id = job.tool_id tool_version = job.tool_version if job.dynamic_tool_id: # This is the exact tool that was used to run the job. # We don't need to compare the version. return None message = "" try: select_field, tools, tool = self.app.toolbox.get_tool_components( Loading @@ -3031,6 +3045,7 @@ class Tool(UsesDictVisibleKeys): raise exceptions.MessageException( f"This dataset was created by an obsolete tool ({tool_id}). Can't re-run." ) assert tool_id if (self.id != tool_id and self.old_id != tool_id) or self.version != tool_version: if self.id == tool_id: if tool_version: Loading lib/galaxy/webapps/galaxy/api/jobs.py +1 −1 Original line number Diff line number Diff line Loading @@ -639,7 +639,7 @@ class JobController(BaseGalaxyAPIController, UsesVisualizationMixin): job = self.__get_job(trans, id) if not job: raise exceptions.ObjectNotFound("Could not access job with the given id") tool = self.app.toolbox.get_tool(job.tool_id, kwd.get("tool_version") or job.tool_version) tool = self.app.toolbox.tool_for_job(job, exact=False, check_access=True, user=trans.user) if tool is None: raise exceptions.ObjectNotFound("Requested tool not found") if not tool.is_workflow_compatible: Loading Loading
client/src/components/Tool/ToolForm.vue +5 −2 Original line number Diff line number Diff line Loading @@ -219,6 +219,9 @@ export default { const { id, version } = this.formConfig; return id.endsWith(version) ? id : `${id}/${version}`; }, toolUuid() { return this.uuid || this.formConfig.uuid; }, tooltip() { if (!this.canMutateHistory) { return this.immutableHistoryMessage; Loading Loading @@ -287,7 +290,7 @@ export default { onUpdate() { this.disabled = true; console.debug("ToolForm - Updating input parameters.", this.formData); updateToolFormData(this.formConfig.id, this.uuid, this.currentVersion, this.history_id, this.formData) updateToolFormData(this.formConfig.id, this.toolUuid, this.currentVersion, this.history_id, this.formData) .then((data) => { this.formConfig = data; }) Loading Loading @@ -339,7 +342,7 @@ export default { history_id: historyId, tool_id: this.formConfig.id, tool_version: this.formConfig.version, tool_uuid: this.uuid, tool_uuid: this.toolUuid, inputs: { ...this.formData, }, Loading
lib/galaxy/jobs/__init__.py +2 −2 Original line number Diff line number Diff line Loading @@ -2754,7 +2754,7 @@ class MinimalJobWrapper(HasResourceParameters): def _report_error(self): job = self.get_job() tool = self.app.toolbox.tool_for_job(job) tool = self.app.toolbox.tool_for_job(job, check_access=False) for dataset in job.output_datasets: self.app.error_reports.default_error_plugin.submit_report(dataset, job, tool, user_submission=False) Loading @@ -2777,7 +2777,7 @@ class JobWrapper(MinimalJobWrapper): job, app=app, use_persisted_destination=use_persisted_destination, tool=app.toolbox.tool_for_job(job, exact=True), tool=app.toolbox.tool_for_job(job, exact=True, check_access=False), ) self.queue = queue self.job_runner_mapper = JobRunnerMapper(self, queue.dispatcher.url_to_destination, self.app.job_config) Loading
lib/galaxy/managers/datasets.py +3 −1 Original line number Diff line number Diff line Loading @@ -758,7 +758,9 @@ class _UnflattenedMetadataDatasetAssociationSerializer(base.ModelSerializer[T], """ dataset = item if dataset.creating_job: tool = self.app.toolbox.get_tool(dataset.creating_job.tool_id, dataset.creating_job.tool_version) tool = self.app.toolbox.tool_for_job( dataset.creating_job, exact=False, check_access=True, user=context.get("user") ) if tool and tool.is_workflow_compatible: return True return False Loading
lib/galaxy/tools/__init__.py +17 −2 Original line number Diff line number Diff line Loading @@ -639,8 +639,15 @@ class ToolBox(AbstractToolBox): return tool return None def tool_for_job(self, job: model.Job, exact=True) -> Optional["Tool"]: def tool_for_job( self, job: model.Job, exact=True, check_access=True, user: Optional[model.User] = None ) -> Optional["Tool"]: if job.dynamic_tool: if check_access: if not user: return None if not job.dynamic_tool.public: self.app.dynamic_tool_manager.ensure_can_use_unprivileged_tool(user) return self.dynamic_tool_to_tool(job.dynamic_tool) else: return self.get_tool(job.tool_id, tool_version=job.tool_version, exact=exact) Loading Loading @@ -2794,6 +2801,9 @@ class Tool(UsesDictVisibleKeys): tool_dict["is_workflow_compatible"] = self.is_workflow_compatible tool_dict["xrefs"] = self.xrefs if self.dynamic_tool: tool_dict["uuid"] = str(self.dynamic_tool.uuid) # Fill in ToolShedRepository info if hasattr(self, "tool_shed") and self.tool_shed: tool_dict["tool_shed_repository"] = { Loading Loading @@ -3016,12 +3026,16 @@ class Tool(UsesDictVisibleKeys): visit_input_values(tool_inputs, params, mapping_callback) def _compare_tool_version(self, job): def _compare_tool_version(self, job: Job): """ Compares a tool version with the tool version from a job (from ToolRunner). """ tool_id = job.tool_id tool_version = job.tool_version if job.dynamic_tool_id: # This is the exact tool that was used to run the job. # We don't need to compare the version. return None message = "" try: select_field, tools, tool = self.app.toolbox.get_tool_components( Loading @@ -3031,6 +3045,7 @@ class Tool(UsesDictVisibleKeys): raise exceptions.MessageException( f"This dataset was created by an obsolete tool ({tool_id}). Can't re-run." ) assert tool_id if (self.id != tool_id and self.old_id != tool_id) or self.version != tool_version: if self.id == tool_id: if tool_version: Loading
lib/galaxy/webapps/galaxy/api/jobs.py +1 −1 Original line number Diff line number Diff line Loading @@ -639,7 +639,7 @@ class JobController(BaseGalaxyAPIController, UsesVisualizationMixin): job = self.__get_job(trans, id) if not job: raise exceptions.ObjectNotFound("Could not access job with the given id") tool = self.app.toolbox.get_tool(job.tool_id, kwd.get("tool_version") or job.tool_version) tool = self.app.toolbox.tool_for_job(job, exact=False, check_access=True, user=trans.user) if tool is None: raise exceptions.ObjectNotFound("Requested tool not found") if not tool.is_workflow_compatible: Loading