From 3c948fe68dc4f40f158da92a150a300bd9ca2efb Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Mon, 21 Apr 2025 13:49:07 -0500 Subject: Implement rudimentary status update page for background jobs. --- uploader/__init__.py | 2 ++ uploader/background_jobs.py | 35 ++++++++++++++++++++++++++++++ uploader/templates/jobs/job-not-found.html | 11 ++++++++++ uploader/templates/jobs/job-status.html | 26 ++++++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 uploader/background_jobs.py create mode 100644 uploader/templates/jobs/job-not-found.html create mode 100644 uploader/templates/jobs/job-status.html (limited to 'uploader') diff --git a/uploader/__init__.py b/uploader/__init__.py index 23e66c1..24c45a5 100644 --- a/uploader/__init__.py +++ b/uploader/__init__.py @@ -19,6 +19,7 @@ from .species import speciesbp from .oauth2.views import oauth2 from .expression_data import exprdatabp from .errors import register_error_handlers +from .background_jobs import background_jobs_bp def override_settings_with_envvars( app: Flask, ignore: tuple[str, ...]=tuple()) -> None: @@ -102,6 +103,7 @@ def create_app(config: dict = {}): app.register_blueprint(files, url_prefix="/files") app.register_blueprint(oauth2, url_prefix="/oauth2") app.register_blueprint(speciesbp, url_prefix="/species") + app.register_blueprint(background_jobs_bp, url_prefix="/background-jobs/") register_error_handlers(app) gnlibs_jobs.init_app(app) diff --git a/uploader/background_jobs.py b/uploader/background_jobs.py new file mode 100644 index 0000000..ac47ff2 --- /dev/null +++ b/uploader/background_jobs.py @@ -0,0 +1,35 @@ +import uuid + +from flask import request, Blueprint, render_template, current_app as app + +from gn_libs import jobs +from gn_libs.jobs.jobs import JobNotFound +from gn_libs import sqlite3 + +from uploader.authorisation import require_login + +background_jobs_bp = Blueprint("background-jobs", __name__) + +@background_jobs_bp.route("/status/") +@require_login +def job_status(job_id: uuid.UUID): + """View the job status.""" + with sqlite3.connection(app.config["ASYNCHRONOUS_JOBS_SQLITE_DB"]) as conn: + try: + job = jobs.job(conn, job_id, fulldetails=True) + stdout = "" + stderr = "" + # with (open(job["metadata"]["stdout-file"], encoding="utf-8") as stdout_file, + # open(job["metadata"]["stderr-file"], encoding="utf-8") as stderr_file): + # stdout = stdout_file.read() + # stderr = stderr_file.read() + + return render_template( + f"jobs/job-status.html", + job=job, + stdout=stdout, + stderr=stderr) + except JobNotFound as jnf: + return render_template( + "jobs/job-not-found.html", + job_id=job_id) diff --git a/uploader/templates/jobs/job-not-found.html b/uploader/templates/jobs/job-not-found.html new file mode 100644 index 0000000..a71e66f --- /dev/null +++ b/uploader/templates/jobs/job-not-found.html @@ -0,0 +1,11 @@ +{%extends "base.html"%} + +{%from "flash_messages.html" import flash_all_messages%} + +{%block title%}Background Jobs{%endblock%} + +{%block pagetitle%}Background Jobs{%endblock%} + +{%block contents%} +

Could not find job with ID: {{job_id}}

+{%endblock%} diff --git a/uploader/templates/jobs/job-status.html b/uploader/templates/jobs/job-status.html new file mode 100644 index 0000000..2750fcd --- /dev/null +++ b/uploader/templates/jobs/job-status.html @@ -0,0 +1,26 @@ +{%extends "base.html"%} + +{%from "flash_messages.html" import flash_all_messages%} + +{%block extrameta%} + +{%endblock%} + +{%block title%}Background Jobs{%endblock%} + +{%block pagetitle%}Background Jobs{%endblock%} + +{%block contents%} + +

Status: {{job["metadata"]["status"]}}

+

Status: {{job_type}}

+ +

STDOUT

+
{{job["stdout"]}}
+ +

STDERR

+
{{job["stderr"]}}
+ +
+

The Job: {{job["metadata"]}}

+{%endblock%} -- cgit v1.2.3