- POST /drivers/upload: validates ZIP, parses INF, persists via DriverStore + Peewee - SHA256 dedup: get_or_create prevents duplicate Driver records - GET /drivers route added to pages.py with driver_data context - drivers.router registered in main.py - drivers.html template with HTMX upload form - partials/driver_list.html HTMX target with select dropdown and unused-file notice - Fixed conftest client fixture to use context manager (triggers lifespan/init_db) - [Rule 3] conftest: TestClient context manager required for lifespan trigger - [Rule 1] drivers.py: dynamic DRIVERS_DIR read so monkeypatch works in tests
39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
import json
|
|
|
|
from fastapi import APIRouter, Request
|
|
from fastapi.responses import HTMLResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
from pathlib import Path
|
|
|
|
router = APIRouter()
|
|
|
|
templates = Jinja2Templates(directory=str(Path(__file__).parent.parent / "templates"))
|
|
|
|
|
|
@router.get("/", response_class=HTMLResponse)
|
|
def dashboard(request: Request):
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="dashboard.html",
|
|
context={
|
|
"recent_printers": [],
|
|
"recent_packages": [],
|
|
},
|
|
)
|
|
|
|
|
|
@router.get("/drivers", response_class=HTMLResponse)
|
|
def drivers_page(request: Request):
|
|
from imptune.db.models import Driver
|
|
|
|
drivers = list(Driver.select().order_by(Driver.uploaded_at.desc()))
|
|
driver_data = []
|
|
for d in drivers:
|
|
names = json.loads(d.driver_desc) if d.driver_desc else []
|
|
driver_data.append({"driver": d, "names": names})
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="drivers.html",
|
|
context={"driver_data": driver_data},
|
|
)
|