feat: impression depuis galerie publique (quota session, modal copies)
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user