diff --git a/client/src/components/Common/SelfReportingError.vue b/client/src/components/Common/SelfReportingError.vue index e1d0a75512fc..55212935b883 100644 --- a/client/src/components/Common/SelfReportingError.vue +++ b/client/src/components/Common/SelfReportingError.vue @@ -4,9 +4,12 @@

Dataset Error Report

- - - +

+ + + + +

Details

@@ -18,6 +21,19 @@
+ +
+

Detected Common Potential Problems

+

+ The tool was started with one or more empty input datasets. This frequently results in tool errors + due to problematic input choices. +

+

+ The tool was started with one or more duplicate input datasets. This frequently results in tool + errors due to problematic input choices. +

+
+

Troubleshooting

There are a number of helpful resources to self diagnose and correct problems. @@ -44,19 +60,6 @@ v-model="message" :area="true" title="Please provide detailed information on the activities leading to this issue:" /> - - ({{ title }}) Error transcript: - - - -
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; -import { BAlert, BButton, BCollapse, BLink } from "bootstrap-vue"; +import { BAlert } from "bootstrap-vue"; import FormElement from "components/Form/FormElement"; import { JobProblemProvider } from "components/providers/JobProvider"; import { mapState } from "pinia"; @@ -81,7 +84,6 @@ import { useMarkdown } from "@/composables/markdown"; import { useUserStore } from "@/stores/userStore"; import { sendErrorReport } from "../DatasetInformation/services"; -import { sendErrorReportTool } from "../ToolInformation/services"; export default { components: { @@ -89,9 +91,6 @@ export default { FormElement, JobProblemProvider, BAlert, - BButton, - BCollapse, - BLink, }, props: { dataset: { @@ -106,10 +105,6 @@ export default { type: Array, default: () => [], }, - transcript: { - type: String, - default: "", - }, }, setup() { const { renderMarkdown } = useMarkdown({ openLinksInNewPage: true }); @@ -120,7 +115,6 @@ export default { message: null, errorMessage: null, resultMessages: [], - isExpanded: false, }; }, computed: { @@ -134,36 +128,20 @@ export default { const isEmailActive = !getGalaxyInstance().config.show_inactivity_warning; return !this.currentUser?.email || !isEmailActive; }, - title() { - return this.isExpanded ? `-` : `+`; - }, }, methods: { onError(err) { this.errorMessage = err; }, - submit(dataset, userEmailJob) { - const email = userEmailJob || this.currentUserEmail; - const message = this.message; - if (this.transcript) { - sendErrorReportTool(dataset, message, email, this.transcript).then( - (resultMessages) => { - this.resultMessages = resultMessages; - }, - (errorMessage) => { - this.errorMessage = errorMessage; - } - ); - } else { - sendErrorReport(dataset, message, email, this.transcript).then( - (resultMessages) => { - this.resultMessages = resultMessages; - }, - (errorMessage) => { - this.errorMessage = errorMessage; - } - ); - } + submit(dataset, email) { + sendErrorReport(dataset, this.message, email).then( + (resultMessages) => { + this.resultMessages = resultMessages; + }, + (errorMessage) => { + this.errorMessage = errorMessage; + } + ); }, hasDetails(outputs) { return ( diff --git a/client/src/components/DatasetInformation/DatasetError.vue b/client/src/components/DatasetInformation/DatasetError.vue index 957b24aa7276..41186a407873 100644 --- a/client/src/components/DatasetInformation/DatasetError.vue +++ b/client/src/components/DatasetInformation/DatasetError.vue @@ -80,7 +80,6 @@ export default { return [ { text: `An error occurred while running the tool ${toolId}.`, - variant: "danger" }, ]; }, @@ -103,7 +102,6 @@ export default { submit(dataset, userEmailJob) { const email = userEmailJob || this.currentUserEmail; const message = this.message; - sendErrorReport(dataset, message, email).then( (resultMessages) => { this.resultMessages = resultMessages; diff --git a/client/src/components/Tool/ToolForm.vue b/client/src/components/Tool/ToolForm.vue index 528c290d4af4..9c524b2c0511 100644 --- a/client/src/components/Tool/ToolForm.vue +++ b/client/src/components/Tool/ToolForm.vue @@ -8,16 +8,16 @@ - + + {{ errorMessage }} + + + The server could not complete this request. Please verify your parameter settings, retry submission and + contact the Galaxy Team if this error persists. A transcript of the submitted data is shown below. + + +

{{ errorContentPretty }}
+ ${toolId}.`, - variant: "danger" - }, - { - text: "The server could not complete this request. Please verify your parameter settings, retry submission and contact the Galaxy Team if this error persists. A transcript of the submitted data is shown below.", - variant: "warning" - }, - ]; - }, - buildCommandOutputs(detail) { - return [ - { - text: "Tool Message (?)", - detail: [detail], - } - ]; - }, }, }; diff --git a/lib/galaxy/schema/jobs.py b/lib/galaxy/schema/jobs.py index fea16f214ef4..fe6316262983 100644 --- a/lib/galaxy/schema/jobs.py +++ b/lib/galaxy/schema/jobs.py @@ -98,11 +98,6 @@ class ReportJobErrorPayload(Model): title="Message", description="The optional message sent with the error report.", ) - toolTranscript: Optional[str] = Field( - default=None, - title="Transcript", - description="The optional Tool Transcript error created by the user and sent with the error report.", - ) class SearchJobsPayload(Model): diff --git a/lib/galaxy/tools/error_reports/__init__.py b/lib/galaxy/tools/error_reports/__init__.py index 8b5c42f682e2..3ac83fbb42a3 100644 --- a/lib/galaxy/tools/error_reports/__init__.py +++ b/lib/galaxy/tools/error_reports/__init__.py @@ -65,7 +65,7 @@ def submit_report(self, dataset, job, tool, user=None, user_submission=False, ** for plugin in self.plugins: if user_submission == plugin.user_submission: try: - response = plugin.submit_report(dataset, job, tool, user, **kwargs) + response = plugin.submit_report(dataset, job, tool, **kwargs) log.debug("Bug report plugin %s generated response %s", plugin, response) if plugin.verbose and response: responses.append(response) diff --git a/lib/galaxy/tools/error_reports/plugins/email.py b/lib/galaxy/tools/error_reports/plugins/email.py index b0aa0ae84183..42446c2ecb3e 100644 --- a/lib/galaxy/tools/error_reports/plugins/email.py +++ b/lib/galaxy/tools/error_reports/plugins/email.py @@ -23,13 +23,12 @@ def __init__(self, **kwargs): self.verbose = string_as_bool(kwargs.get("verbose", True)) self.user_submission = string_as_bool(kwargs.get("user_submission", True)) - def submit_report(self, dataset, job, tool, user, **kwargs): + def submit_report(self, dataset, job, tool, **kwargs): """Send report as an email""" try: error_reporter = EmailErrorReporter(dataset.id, self.app) error_reporter.send_report( - user=user, - tool=tool, + user=job.get_user(), email=kwargs.get("email", None), message=kwargs.get("message", None), redact_user_details_in_bugreport=self.redact_user_details_in_bugreport, diff --git a/lib/galaxy/tools/errors.py b/lib/galaxy/tools/errors.py index 3d59126c781a..e1dc2052bb5f 100644 --- a/lib/galaxy/tools/errors.py +++ b/lib/galaxy/tools/errors.py @@ -156,7 +156,7 @@ def _can_access_dataset(self, user): roles = [] return self.app.security_agent.can_access_dataset(roles, self.hda.dataset) - def create_report(self, user, tool, email="", message="", redact_user_details_in_bugreport=False, **kwd): + def create_report(self, user, email="", message="", redact_user_details_in_bugreport=False, **kwd): hda = self.hda job = self.job host = self.app.url_for("/", qualified=True) @@ -205,8 +205,8 @@ def create_report(self, user, tool, email="", message="", redact_user_details_in hda_show_params_link=hda_show_params_link, job_id_encoded=self.app.security.encode_id(job.id), job_id=job.id, - tool_version=tool.tool_version, - job_tool_id=tool.id, + tool_version=job.tool_version, + job_tool_id=job.tool_id, job_tool_version=hda.tool_version, job_runner_external_id=job.job_runner_external_id, job_command_line=job.command_line, @@ -227,12 +227,12 @@ def create_report(self, user, tool, email="", message="", redact_user_details_in self.html_report = string.Template(error_report_template_html).safe_substitute(report_variables) - def _send_report(self, user, tool, email=None, message=None, **kwd): + def _send_report(self, user, email=None, message=None, **kwd): return self.report - def send_report(self, user, tool, email=None, message=None, **kwd): + def send_report(self, user, email=None, message=None, **kwd): if self.report is None: - self.create_report(user, tool, email=email, message=message, **kwd) + self.create_report(user, email=email, message=message, **kwd) return self._send_report(user, email=email, message=message, **kwd) diff --git a/lib/galaxy/webapps/galaxy/api/jobs.py b/lib/galaxy/webapps/galaxy/api/jobs.py index 2b269561d322..7d0d2757b333 100644 --- a/lib/galaxy/webapps/galaxy/api/jobs.py +++ b/lib/galaxy/webapps/galaxy/api/jobs.py @@ -73,8 +73,6 @@ ) from galaxy.work.context import WorkRequestContext -import json - log = logging.getLogger(__name__) router = Router(tags=["jobs"]) @@ -313,41 +311,15 @@ def error( payload: Annotated[ReportJobErrorPayload, ReportErrorBody], job_id: JobIdPathParam, trans: ProvidesUserContext = DependsOnTrans, - ) -> JobErrorSummary: - myMessages = self.error_all(payload, job_id, trans) - return JobErrorSummary(messages=myMessages) - - @router.post( - "/api/jobs/no-job-id-error", - name="report_error_no_job_id", - summary="Submits a bug report via the API.", - ) - def error_no_job_id( - self, - payload: Annotated[ReportJobErrorPayload, ReportErrorBody], - trans: ProvidesUserContext = DependsOnTrans, - ) -> JobErrorSummary: - myMessages = self.error_all(payload=payload, job_id=None, trans=trans) - return JobErrorSummary(messages=myMessages) - - def error_all( - self, - payload: Annotated[ReportJobErrorPayload, ReportErrorBody], - job_id, - trans: ProvidesUserContext = DependsOnTrans, ) -> JobErrorSummary: # Get dataset on which this error was triggered dataset_id = payload.dataset_id dataset = self.service.hda_manager.get_accessible(id=dataset_id, user=trans.user) + # Get job + job = self.service.get_job(trans, job_id) if not dataset.creating_job or dataset.creating_job.id != job.id: raise exceptions.RequestParameterInvalidException("dataset_id was not created by job_id") - if payload.toolTranscript: - job = {} - transcript = json.loads(payload.toolTranscript) - tool = trans.app.toolbox.get_tool(transcript["tool_id"], tool_version=transcript["tool_version"]) - else: - job = self.service.get_job(trans, job_id) - tool = trans.app.toolbox.get_tool(job.tool_id, tool_version=job.tool_version) or None + tool = trans.app.toolbox.get_tool(job.tool_id, tool_version=job.tool_version) or None email = payload.email if not email and not trans.anonymous: email = trans.user.email @@ -360,7 +332,7 @@ def error_all( email=email, message=payload.message, ) - return messages + return JobErrorSummary(messages=messages) @router.get( "/api/jobs/{job_id}/inputs",