diff options
| author | Frederick Muriuki Muriithi | 2026-01-08 12:14:40 -0600 |
|---|---|---|
| committer | Frederick Muriuki Muriithi | 2026-01-08 14:07:18 -0600 |
| commit | f9adb98a78effa73e2b13aaaa59d58dc12fee324 (patch) | |
| tree | d1d3cc0d8ad583ec7c8703cf8c3b4978bc364077 | |
| parent | 61cfdf00ba55e3589ad542fce215ce9c1b32f1d8 (diff) | |
| download | gn-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.py | 32 | ||||
| -rw-r--r-- | uploader/templates/background-jobs/delete-job.html | 86 | ||||
| -rw-r--r-- | uploader/templates/background-jobs/job-summary.html | 4 |
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> |
