feat: impression depuis galerie publique (quota session, modal copies)
🚀 Deploy — JH Photomaton / 🔍 Vérification (push) Has been cancelled
🚀 Deploy — JH Photomaton / 🍓 Deploy sur le Pi (push) Has been cancelled

This commit is contained in:
2026-07-17 17:52:52 +02:00
parent d6642c2519
commit 0b612e1302
2 changed files with 326 additions and 10 deletions
+86 -2
View File
@@ -142,12 +142,96 @@ async def get_user_print_config(request: Request):
"""Retourne la config impression galerie utilisateur."""
cfg = request.app.state.config.print
return {
"user_print_enabled": cfg.user_print_enabled,
"user_print_quota": cfg.user_print_quota,
"user_print_enabled": cfg.user_print_enabled,
"user_print_quota": cfg.user_print_quota,
"user_print_max_copies": cfg.user_print_max_copies,
}
@router.get("/print/user-print-status")
async def get_user_print_status(request: Request):
"""Statut d'impression de la session courante (quota restant, config active)."""
cfg = request.app.state.config.print
count = request.session.get("gallery_print_count", 0)
remaining = (cfg.user_print_quota - count) if cfg.user_print_quota > 0 else -1
return {
"user_print_enabled": cfg.user_print_enabled,
"user_print_quota": cfg.user_print_quota,
"user_print_max_copies": cfg.user_print_max_copies,
"session_print_count": count,
"remaining_quota": remaining, # -1 = illimité
}
@router.post("/print/request-gallery")
async def gallery_print_request(request: Request, body: dict = Body(...)):
"""Demande d'impression depuis la galerie publique.
Vérifie que l'impression est activée et que le quota session n'est pas dépassé.
"""
from pathlib import Path as _Path
cfg_print = request.app.state.config.print
# ── Activation ────────────────────────────────────────────────────────────
if not cfg_print.user_print_enabled:
return JSONResponse({"error": "L'impression est désactivée"}, status_code=403)
photo_id = str(body.get("photo_id", "")).strip()
if not photo_id:
return JSONResponse({"error": "photo_id requis"}, status_code=400)
copies = max(1, min(cfg_print.user_print_max_copies, int(body.get("copies", 1))))
# ── Quota session ─────────────────────────────────────────────────────────
if cfg_print.user_print_quota > 0:
count = request.session.get("gallery_print_count", 0)
if count >= cfg_print.user_print_quota:
return JSONResponse({
"error": f"Quota atteint ({cfg_print.user_print_quota} impression(s) maximum par session)",
"quota_exceeded": True,
}, status_code=429)
# ── Résolution du fichier ─────────────────────────────────────────────────
media_dir = _Path(request.app.state.config.photobooth.media_dir)
candidates = sorted(media_dir.glob(f"{photo_id}*"))
if not candidates:
return JSONResponse({"error": "Photo introuvable"}, status_code=404)
filepath = str(candidates[0])
# ── Enqueue ───────────────────────────────────────────────────────────────
pb = request.app.state.photobooth_service
printer_svc = request.app.state.printer_service
ws = request.app.state.ws_manager
led = request.app.state.led_service
thumb_url = pb.thumbnail_url(photo_id)
entry = await printer_svc.add_request(filepath, thumb_url, copies)
await ws.broadcast({"type": "print_request", "entry": entry})
# ── Incrémenter compteur session ──────────────────────────────────────────
new_count = request.session.get("gallery_print_count", 0) + 1
request.session["gallery_print_count"] = new_count
remaining = (cfg_print.user_print_quota - new_count) if cfg_print.user_print_quota > 0 else -1
# ── Stats événement ───────────────────────────────────────────────────────
event_svc = getattr(request.app.state, "event_service", None)
if event_svc:
slug = request.app.state.config.event.slug
asyncio.create_task(event_svc.increment(slug, "print_requests"))
# ── LED si mode direct ────────────────────────────────────────────────────
if request.app.state.config.print.mode == "direct":
led.play("printing")
logger.info("Impression galerie: photo_id=%s copies=%d session_count=%d", photo_id, copies, new_count)
return {
"ok": True,
"id": entry["id"],
"mode": request.app.state.config.print.mode,
"remaining_quota": remaining,
}
# ── Gestion avancée des imprimantes CUPS ──────────────────────────────────────
@router.post("/print/printers/{printer_name}/enable")