about summary refs log tree commit diff
path: root/uploader
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2026-01-07 15:02:11 -0600
committerFrederick Muriuki Muriithi2026-01-07 15:02:11 -0600
commitd7214ad257dc0d0bc08175809b41f8dbd0b1f566 (patch)
treedfbff5317d95d934da34482ce0886015521eefb8 /uploader
parentba5f5b710e2ac562822febdec38161328c37f657 (diff)
downloadgn-uploader-main.tar.gz
Provide basic UI to list out user's background jobs. HEAD main
Diffstat (limited to 'uploader')
-rw-r--r--uploader/background_jobs.py28
-rw-r--r--uploader/templates/base.html2
2 files changed, 26 insertions, 4 deletions
diff --git a/uploader/background_jobs.py b/uploader/background_jobs.py
index 2c55272..da3c8ed 100644
--- a/uploader/background_jobs.py
+++ b/uploader/background_jobs.py
@@ -1,22 +1,24 @@
 """Generic views and utilities to handle background jobs."""
 import uuid
+import datetime
 import importlib
-from typing import Callable
 from functools import partial
+from typing import Union, Callable, Optional
 
 from werkzeug.wrappers.response import Response
 from flask import (
     redirect,
     Blueprint,
-    render_template,
     current_app as app)
 
 from gn_libs import jobs
 from gn_libs import sqlite3
 from gn_libs.jobs.jobs import JobNotFound
 
-from uploader.flask_extensions import url_for
+from uploader import session
 from uploader.authorisation import require_login
+from uploader.oauth2.client import user_logged_in
+from uploader.flask_extensions import url_for, render_template
 
 background_jobs_bp = Blueprint("background-jobs", __name__)
 HandlerType = Callable[[dict], Response]
@@ -88,6 +90,13 @@ error_handler = partial(handler, handler_type="error")
 success_handler = partial(handler, handler_type="success")
 
 
+def logged_in_user_id() -> Optional[Union[uuid.UUID, str]]:
+    """Get user id for logged in user."""
+    if user_logged_in():
+        return session.user_details()["user_id"]
+    return None
+
+
 @background_jobs_bp.route("/status/<uuid:job_id>")
 @require_login
 def job_status(job_id: uuid.UUID):
@@ -119,3 +128,16 @@ def job_error(job_id: uuid.UUID):
             return render_template("jobs/job-error.html", job=job)
         except JobNotFound as _jnf:
             return render_template("jobs/job-not-found.html", job_id=job_id)
+
+
+@background_jobs_bp.route("/list")
+@require_login
+def list_jobs():
+    """List background jobs."""
+    with sqlite3.connection(app.config["ASYNCHRONOUS_JOBS_SQLITE_DB"]) as conn:
+        return render_template(
+            "background-jobs/list-jobs.html",
+            jobs=jobs.jobs_by_external_id(
+                conn, session.user_details()["user_id"]),
+            display_datetime=lambda val: datetime.datetime.fromisoformat(
+                val).strftime("%A, %d %B %Y at %H:%M %Z"))
diff --git a/uploader/templates/base.html b/uploader/templates/base.html
index fd345b9..dd097de 100644
--- a/uploader/templates/base.html
+++ b/uploader/templates/base.html
@@ -34,7 +34,7 @@
           {%if user_logged_in()%}
           {%if view_under_construction%}
           <li>
-            <a href="#"
+            <a href="{{url_for('background-jobs.list_jobs')}}"
                title="User's background jobs.">
               <!-- https://icons.getbootstrap.com/icons/back/ -->
               <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-back" viewBox="0 0 16 16">