about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--qc_app/templates/rqtl2/no-such-job.html13
-rw-r--r--qc_app/templates/rqtl2/rqtl2-job-error.html33
-rw-r--r--qc_app/templates/rqtl2/rqtl2-job-results.html24
-rw-r--r--qc_app/templates/rqtl2/rqtl2-job-status.html24
-rw-r--r--qc_app/upload/rqtl2.py26
-rw-r--r--scripts/process_rqtl2_bundle.py1
-rw-r--r--scripts/worker.py6
7 files changed, 123 insertions, 4 deletions
diff --git a/qc_app/templates/rqtl2/no-such-job.html b/qc_app/templates/rqtl2/no-such-job.html
new file mode 100644
index 0000000..b56980b
--- /dev/null
+++ b/qc_app/templates/rqtl2/no-such-job.html
@@ -0,0 +1,13 @@
+{%extends "base.html"%}
+{%from "flash_messages.html" import flash_messages%}
+
+{%block title%}Job Status{%endblock%}
+
+{%block contents%}
+<h1 class="heading">R/qtl2 job status</h1>
+
+<h2>R/qtl2 Upload: No Such Job</h2>
+
+<p class="alert-error">No job with ID {{jobid}} was found.</p>
+
+{%endblock%}
diff --git a/qc_app/templates/rqtl2/rqtl2-job-error.html b/qc_app/templates/rqtl2/rqtl2-job-error.html
new file mode 100644
index 0000000..72a334b
--- /dev/null
+++ b/qc_app/templates/rqtl2/rqtl2-job-error.html
@@ -0,0 +1,33 @@
+{%extends "base.html"%}
+{%from "cli-output.html" import cli_output%}
+
+{%block title%}Job Status{%endblock%}
+
+{%block contents%}
+<h1 class="heading">R/qtl2 job status</h1>
+
+<h2>R/qtl2 Upload: Job Status</h2>
+
+<div class="explainer">
+  <p>The processing of the R/qtl2 bundle you uploaded has failed. We have
+    provided some information below to help you figure out what the problem
+    could be.</p>
+  <p>If you find that you cannot figure out what the problem is on your own,
+    please contact the team running the system for assistance, providing the
+    R/qtl2 bundle you uploaded, and a screenshot of this page.</p>
+</div>
+
+<h4>stdout</h4>
+{{cli_output(job, "stdout")}}
+
+<h4>stderr</h4>
+{{cli_output(job, "stderr")}}
+
+<h4>Log</h4>
+<div class="cli-output">
+  {%for msg in messages%}
+  {{msg}}<br />
+  {%endfor%}
+</div>
+
+{%endblock%}
diff --git a/qc_app/templates/rqtl2/rqtl2-job-results.html b/qc_app/templates/rqtl2/rqtl2-job-results.html
new file mode 100644
index 0000000..4ecd415
--- /dev/null
+++ b/qc_app/templates/rqtl2/rqtl2-job-results.html
@@ -0,0 +1,24 @@
+{%extends "base.html"%}
+{%from "cli-output.html" import cli_output%}
+
+{%block title%}Job Status{%endblock%}
+
+{%block contents%}
+<h1 class="heading">R/qtl2 job status</h1>
+
+<h2>R/qtl2 Upload: Job Status</h2>
+
+<div class="explainer">
+  <p>The processing of the R/qtl2 bundle you uploaded has completed
+    successfully.</p>
+  <p>You should now be able to use GeneNetwork to run analyses on your data.</p>
+</div>
+
+<h4>Log</h4>
+<div class="cli-output">
+  {%for msg in messages%}
+  {{msg}}<br />
+  {%endfor%}
+</div>
+
+{%endblock%}
diff --git a/qc_app/templates/rqtl2/rqtl2-job-status.html b/qc_app/templates/rqtl2/rqtl2-job-status.html
new file mode 100644
index 0000000..a8bc640
--- /dev/null
+++ b/qc_app/templates/rqtl2/rqtl2-job-status.html
@@ -0,0 +1,24 @@
+{%extends "base.html"%}
+{%from "flash_messages.html" import flash_messages%}
+
+{%block title%}Job Status{%endblock%}
+
+{%block extrameta%}
+<meta http-equiv="refresh" content="3">
+{%endblock%}
+
+{%block contents%}
+<h1 class="heading">R/qtl2 job status</h1>
+
+<h2>R/qtl2 Upload: Job Status</h2>
+
+{{job}}
+
+<h4>Log</h4>
+<div class="cli-output">
+  {%for msg in messages%}
+  {{msg}}<br />
+  {%endfor%}
+</div>
+
+{%endblock%}
diff --git a/qc_app/upload/rqtl2.py b/qc_app/upload/rqtl2.py
index 7ba90c2..8a0d8b4 100644
--- a/qc_app/upload/rqtl2.py
+++ b/qc_app/upload/rqtl2.py
@@ -1,9 +1,9 @@
 """Module to handle uploading of R/qtl2 bundles."""
 import sys
 import json
-from uuid import uuid4
 from pathlib import Path
 from datetime import date
+from uuid import UUID, uuid4
 from zipfile import ZipFile, is_zipfile
 
 from redis import Redis
@@ -581,4 +581,26 @@ def confirm_bundle_details(species_id: int, population_id: int):
             redisuri,
             f"{app.config['UPLOAD_FOLDER']}/job_errors")
 
-        raise NotImplementedError
+        return redirect(url_for("upload.rqtl2.rqtl2_processing_status",
+                                jobid=jobid))
+
+@rqtl2.route("/status/<uuid:jobid>")
+def rqtl2_processing_status(jobid: UUID):
+    """Retrieve the status of the job processing the uploaded R/qtl2 bundle."""
+    with Redis.from_url(app.config["REDIS_URL"], decode_responses=True) as rconn:
+        thejob = jobs.job(rconn, jobid)
+        if not bool(thejob):
+            return render_template("rqtl2/no-such-job.html", jobid=jobid)
+
+        logmessages = rconn.lrange(thejob.get("log-messagelist"), 0, -1) or []
+
+        if thejob["status"] == "error":
+            return render_template(
+                "rqtl2/rqtl2-job-error.html", job=thejob, messages=logmessages)
+        if thejob["status"] == "success":
+            return render_template("rqtl2/rqtl2-job-results.html",
+                                   job=thejob,
+                                   messages=logmessages)
+
+        return render_template(
+            "rqtl2/rqtl2-job-status.html", job=thejob, messages=logmessages)
diff --git a/scripts/process_rqtl2_bundle.py b/scripts/process_rqtl2_bundle.py
index 105f787..feb5e19 100644
--- a/scripts/process_rqtl2_bundle.py
+++ b/scripts/process_rqtl2_bundle.py
@@ -59,7 +59,6 @@ def process_bundle(dbconn: mdb.Connection, rconn: Redis, jobid: uuid.UUID) -> in
     try:
         thejob = parse_job(rconn, jobid)
         meta = thejob["bundle-metadata"]
-        logger.debug("The metadata: %s", meta)
         rconn.hset(str(jobid), "geno-percent", "0")
         rconn.hset(str(jobid), "pheno-percent", "0")
 
diff --git a/scripts/worker.py b/scripts/worker.py
index 13556df..90d83c4 100644
--- a/scripts/worker.py
+++ b/scripts/worker.py
@@ -54,10 +54,14 @@ def run_job(job, rconn):
                             rconn, job_id, process.stdout.read1(), "stdout")
                         sleep(1)
 
+                    update_status(
+                        rconn,
+                        job_id,
+                        ("error" if process.returncode != 0 else "success"))
+
             with open(stderrpath, "rb") as stderr:
                 stderr_content = stderr.read()
                 update_stdout_stderr(rconn, job_id, stderr_content, "stderr")
-                update_status(rconn, job_id, ("error" if bool(stderr_content) else "success"))
 
             os.remove(stderrpath)
         return process.poll()