diff --git a/packetserver/http/routers/jobs.py b/packetserver/http/routers/jobs.py index dd1220b..507d716 100644 --- a/packetserver/http/routers/jobs.py +++ b/packetserver/http/routers/jobs.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter, Depends, HTTPException, Request, Form, UploadFile, File +from fastapi import APIRouter, Depends, HTTPException, Request, Form, UploadFile, File, status from fastapi.responses import HTMLResponse, RedirectResponse from typing import List, Optional, Union, Tuple, Dict, Any from pydantic import BaseModel @@ -136,6 +136,39 @@ async def get_job_detail( return summaries +@router.delete("/jobs/{job_id}", status_code=status.HTTP_204_NO_CONTENT) +async def delete_job( + job_id: int, + db: DbDependency, + current_user: HttpUser = Depends(get_current_http_user), +): + username = current_user.username.upper().strip() + + with db.transaction() as conn: + root = conn.root + + # 1. Check if job exists + if job_id not in root.jobs: + raise HTTPException(status_code=404, detail="Job not found") + + job = root.jobs[job_id] + + # 2. Ownership check + if job.owner.upper() != username: + raise HTTPException(status_code=403, detail="You do not own this job") + + # 3. Remove from user's job list + if username in root.user_jobs: + user_job_list = root.user_jobs[username] + if job_id in user_job_list: + user_job_list.remove(job_id) + + # 4. Delete the job itself + del root.jobs[job_id] + + # No content to return on successful delete + return None + @dashboard_router.get("/jobs", response_class=HTMLResponse) async def jobs_list_page( request: Request, diff --git a/packetserver/http/templates/job_detail.html b/packetserver/http/templates/job_detail.html index 017c225..6b03d6e 100644 --- a/packetserver/http/templates/job_detail.html +++ b/packetserver/http/templates/job_detail.html @@ -5,6 +5,55 @@ {% block content %}

Job #{{ job.id }}

+ +
+ ← Back to Jobs + + +
+ + + +
@@ -131,7 +180,4 @@
-

- ← Back to Jobs -

{% endblock %} \ No newline at end of file diff --git a/packetserver/server/jobs.py b/packetserver/server/jobs.py index 96af19b..0d22d6b 100644 --- a/packetserver/server/jobs.py +++ b/packetserver/server/jobs.py @@ -413,7 +413,7 @@ def handle_job_delete(req: Request, conn: PacketServerConnection, db: ZODB.DB): del storage.jobs[jid] storage.user_jobs[username].remove(jid) logging.debug(f"Deleted job {jid}") - send_blank_response(conn, req, status_code=200, payload=f"Deleted job {jid}") + send_blank_response(conn, req, status_code=204, payload=f"Deleted job {jid}") else: if jid in storage.jobs: logging.error(f"Job with no owner detected: {jid}")