diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..6721435 Binary files /dev/null and b/.DS_Store differ diff --git a/app/routers/ui.py b/app/routers/ui.py index 52f1985..a170b71 100644 --- a/app/routers/ui.py +++ b/app/routers/ui.py @@ -1,5 +1,6 @@ import math import os +import re import uuid as _uuid from datetime import datetime, timedelta from pathlib import Path @@ -90,10 +91,17 @@ def printer_detail(printer_id: int, request: Request, db: Session = Depends(get_ printer = db.query(Printer).filter(Printer.id == printer_id).first() if not printer: raise HTTPException(status_code=404, detail="Printer not found") + current_job = ( + db.query(PrintJob) + .filter(PrintJob.printer_id == printer_id, PrintJob.status == JobStatus.printing) + .order_by(PrintJob.started_at.desc()) + .first() + ) return templates.TemplateResponse("printer_detail.html", { "request": request, "active": "printers", "printer": printer, + "current_job": current_job, }) @@ -335,6 +343,45 @@ def edit_job( return RedirectResponse(url=f"/jobs/{job_id}", status_code=HTTP_303_SEE_OTHER) +@router.post("/jobs/{job_id}/duplicate") +def duplicate_job(job_id: int, db: Session = Depends(get_db)): + from fastapi import HTTPException + job = db.query(PrintJob).filter(PrintJob.id == job_id).first() + if not job: + raise HTTPException(404, "Job not found") + + copy = PrintJob( + job_uuid=str(_uuid.uuid4()), + name=job.name, + file_name=job.file_name, + printer_id=None, + bracket_id=job.bracket_id, + customer=job.customer, + job_material=job.job_material, + job_color=job.job_color, + priority=job.priority, + status=JobStatus.queued, + notes=job.notes, + ) + db.add(copy) + + # If the original was in a bracket, extend the "×N" count in its name to match. + if job.bracket and job.bracket.name: + job.bracket.name = re.sub( + r"×(\d+)\s*$", + lambda m: f"×{int(m.group(1)) + 1}", + job.bracket.name, + ) + + db.flush() + db.add(JobLog(job_id=copy.id, message=f"Job created (duplicate of #{job.id})")) + db.commit() + + if copy.bracket_id: + return RedirectResponse(url=f"/jobs?bracket_id={copy.bracket_id}", status_code=HTTP_303_SEE_OTHER) + return RedirectResponse(url="/jobs", status_code=HTTP_303_SEE_OTHER) + + @router.get("/files/{filename}") def download_file(filename: str): from fastapi import HTTPException diff --git a/app/templates/jobs.html b/app/templates/jobs.html index c71ef4a..9116369 100644 --- a/app/templates/jobs.html +++ b/app/templates/jobs.html @@ -50,6 +50,7 @@