about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2026-01-08 12:14:40 -0600
committerFrederick Muriuki Muriithi2026-01-08 14:07:18 -0600
commitf9adb98a78effa73e2b13aaaa59d58dc12fee324 (patch)
treed1d3cc0d8ad583ec7c8703cf8c3b4978bc364077
parent61cfdf00ba55e3589ad542fce215ce9c1b32f1d8 (diff)
downloadgn-uploader-f9adb98a78effa73e2b13aaaa59d58dc12fee324.tar.gz
Delete a job.
Activate the UI element allowing the user to delete a chosen job.
-rw-r--r--uploader/background_jobs.py32
-rw-r--r--uploader/templates/background-jobs/delete-job.html86
-rw-r--r--uploader/templates/background-jobs/job-summary.html4
3 files changed, 120 insertions, 2 deletions
diff --git a/uploader/background_jobs.py b/uploader/background_jobs.py
index ad321f3..7206694 100644
--- a/uploader/background_jobs.py
+++ b/uploader/background_jobs.py
@@ -7,6 +7,8 @@ from typing import Union, Callable, Optional
 
 from werkzeug.wrappers.response import Response
 from flask import (
+    flash,
+    request,
     redirect,
     Blueprint,
     current_app as app)
@@ -160,3 +162,33 @@ def job_summary(job_id: uuid.UUID):
             return redirect(url_for("background-jobs.job_status", job["job_id"]))
         except JobNotFound as _jnf:
             return render_template("jobs/job-not-found.html", job_id=job_id)
+
+
+@background_jobs_bp.route("/delete/<uuid:job_id>", methods=["GET", "POST"])
+@require_login
+def delete_single(job_id: uuid.UUID):
+    """Delete a single job."""
+    with sqlite3.connection(app.config["ASYNCHRONOUS_JOBS_SQLITE_DB"]) as conn:
+        try:
+            job = jobs.job(conn, job_id, fulldetails=True)
+            status = job["metadata"]["status"]
+            if status not in ("completed", "error"):
+                flash("We cannot delete a running job.", "alert alert-error")
+                # redirect below might be wrong in some cases. Redirect
+                # appropriately.
+                return redirect(url_for("background-jobs.list_jobs"))
+
+            if request.method == "GET":
+                return render_template("background-jobs/delete-job.html",
+                                       job=job,
+                                       display_datetime=make_datetime_formatter())
+
+            if request.form["btn-confirm-delete"] == "delete":
+                jobs.delete_job(conn, job_id)
+                flash("Job was deleted successfully.", "alert alert-success")
+                return redirect(url_for("background-jobs.list_jobs"))
+            flash("Delete cancelled.", "alert alert-info")
+            return redirect(url_for(
+                "background-jobs.job_summary", job_id=job_id))
+        except JobNotFound as _jnf:
+            return render_template("jobs/job-not-found.html", job_id=job_id)
diff --git a/uploader/templates/background-jobs/delete-job.html b/uploader/templates/background-jobs/delete-job.html
new file mode 100644
index 0000000..6dc2144
--- /dev/null
+++ b/uploader/templates/background-jobs/delete-job.html
@@ -0,0 +1,86 @@
+{%extends "background-jobs/base.html"%}
+{%from "flash_messages.html" import flash_all_messages%}
+
+{%block title%}Background Jobs{%endblock%}
+
+{%block pagetitle%}Background Jobs{%endblock%}
+
+{%block breadcrumbs%}
+{{super()}}
+<li class="breadcrumb-item">
+  <a href="{{url_for('background-jobs.job_summary', job_id=job.job_id)}}">
+    summary
+  </a>
+</li>
+{%endblock%}
+
+{%block contents%}
+{{flash_all_messages()}}
+
+<div class="row">
+  <h2 class="heading">background jobs: delete?</h2>
+
+  <p class="text-danger">Are you sure you want to delete the job below?</p>
+
+  <table class="table">
+    <thead>
+    </thead>
+
+    <tbody>
+      <tr>
+        <th class="table-primary">Job ID</th>
+        <td>{{job.job_id}}</td>
+      </tr>
+      <tr>
+        <th class="table-primary">Type</th>
+        <td>{{job.metadata["job-type"]}}</td>
+      </tr>
+      <tr>
+        <th class="table-primary">Created</th>
+        <td>{{display_datetime(job.created)}}</td>
+      </tr>
+      <tr>
+        <th class="table-primary">Expires</th>
+        <td>{{display_datetime(job.expires)}}</td>
+      </tr>
+      <tr>
+        <th class="table-primary">Status</th>
+        <td>{{job.metadata.status}}</td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+<div class="row">
+  <form id="frm-delete-job"
+        method="POST"
+        action="{{url_for('background-jobs.delete_single', job_id=job.job_id)}}">
+    <div class="row">
+      <div class="col">
+        <input type="submit"
+               class="btn btn-info"
+               value="cancel"
+               name="btn-confirm-delete" />
+      </div>
+      <div class="col">
+        <input type="submit"
+               class="btn btn-danger"
+               value="delete"
+               name="btn-confirm-delete" />
+      </div>
+    </div>
+  </form>
+</div>
+{%endblock%}
+
+
+{%block sidebarcontents%}
+<div class="row">
+  <h6 class="subheading">What is this?</h6>
+</div>
+<div class="row">
+  <p>Confirm whether or not you want to delete job
+    <strong>{{job.job_id}}</strong>.</p>
+</div>
+{{super()}}
+{%endblock%}
diff --git a/uploader/templates/background-jobs/job-summary.html b/uploader/templates/background-jobs/job-summary.html
index 3020b30..cffa785 100644
--- a/uploader/templates/background-jobs/job-summary.html
+++ b/uploader/templates/background-jobs/job-summary.html
@@ -57,8 +57,8 @@
   </div>
 
   <div class="col">
-    <a href="#"
-       class="btn btn-danger not-implemented"
+    <a href="{{url_for('background-jobs.delete_single', job_id=job.job_id)}}"
+       class="btn btn-danger"
        title="Delete this job.">delete</a>
   </div>
 </div>