diff --git a/app/routers/ui.py b/app/routers/ui.py index 1dc1f05..891ba38 100644 --- a/app/routers/ui.py +++ b/app/routers/ui.py @@ -1,11 +1,12 @@ import os import uuid as _uuid +from datetime import datetime, timedelta from pathlib import Path from fastapi import APIRouter, Depends, File, Form, Request, UploadFile from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates -from sqlalchemy import or_ +from sqlalchemy import case, or_ from sqlalchemy.orm import Session from starlette.status import HTTP_303_SEE_OTHER @@ -127,7 +128,7 @@ def create_printer_type( # ── Jobs ─────────────────────────────────────────────────────────────────────── @router.get("/jobs", response_class=HTMLResponse) -def jobs_page(request: Request, q: str = "", bracket_id: str = "", db: Session = Depends(get_db)): +def jobs_page(request: Request, q: str = "", bracket_id: str = "", show_all: str = "", db: Session = Depends(get_db)): query = db.query(PrintJob) if q: like = f"%{q}%" @@ -138,11 +139,35 @@ def jobs_page(request: Request, q: str = "", bracket_id: str = "", db: Session = if bracket_id: query = query.filter(PrintJob.bracket_id == int(bracket_id)) active_bracket = db.query(JobBracket).filter(JobBracket.id == int(bracket_id)).first() + + # Hide finished jobs older than 24h unless show_all + finished = [JobStatus.done, JobStatus.failed, JobStatus.cancelled] + cutoff = datetime.now() - timedelta(hours=24) + hidden_count = 0 + if not show_all: + hidden_count = query.filter( + PrintJob.status.in_(finished), PrintJob.created_at < cutoff + ).count() + query = query.filter( + or_(~PrintJob.status.in_(finished), PrintJob.created_at >= cutoff) + ) + + # Sort: printing → queued → rest, then priority, then oldest first + status_order = case( + (PrintJob.status == JobStatus.printing, 0), + (PrintJob.status == JobStatus.queued, 1), + else_=2, + ) + jobs = query.order_by(status_order, PrintJob.priority.desc(), PrintJob.created_at.asc()).all() + return templates.TemplateResponse("jobs.html", { "request": request, "active": "jobs", - "jobs": query.order_by(PrintJob.priority.desc(), PrintJob.created_at.desc()).all(), + "jobs": jobs, "q": q, + "bracket_id": bracket_id, + "show_all": bool(show_all), + "hidden_count": hidden_count, "active_bracket": active_bracket, "printers": db.query(Printer).order_by(Printer.name).all(), "brackets": db.query(JobBracket).order_by(JobBracket.name).all(), diff --git a/app/templates/jobs.html b/app/templates/jobs.html index e17820f..7148700 100644 --- a/app/templates/jobs.html +++ b/app/templates/jobs.html @@ -93,6 +93,16 @@ {% endif %} +{% if hidden_count %} +{% set sep = '&' if (q or bracket_id) else '?' %} +{% set show_all_url = '/jobs?show_all=1' ~ ('&bracket_id=' ~ bracket_id if bracket_id else '') ~ ('&q=' ~ q if q else '') %} +

+ + {{ hidden_count }} finished job{{ 's' if hidden_count != 1 else '' }} older than 24 h hidden. + Show all +

+{% endif %} + {# ── Add Job Modal ── #}