feat: instrument model

This commit is contained in:
OpenSquared
2026-07-02 23:36:06 +02:00
parent e2144d93e9
commit ff6f0b390d
3 changed files with 585 additions and 5 deletions

View File

@@ -13,6 +13,16 @@ class OverrideBody(BaseModel):
note: Optional[str] = ""
class BulkOverrideItem(BaseModel):
node_id: str
value: float
note: Optional[str] = ""
class BulkOverrideBody(BaseModel):
overrides: List[BulkOverrideItem]
@router.get("", response_model=List[Dict[str, Any]])
def list_instrument_models():
from services.database import get_conn
@@ -44,6 +54,67 @@ def list_instrument_models():
conn.close()
@router.get("/{instrument}/gauge-suggestions")
def get_gauge_suggestions(instrument: str) -> Dict[str, Any]:
"""Suggestions de valeurs depuis les derniers gauges de marché (macro_regime_history)."""
from services.database import get_conn
from services.gauge_sync import suggest_from_gauges, get_latest_gauges
from services.instrument_models import INSTRUMENT_MODELS
conn = get_conn()
try:
inst = instrument.upper()
if inst not in INSTRUMENT_MODELS:
raise HTTPException(status_code=404, detail=f"Instrument {inst} non supporté")
gauges, snap_date = get_latest_gauges(conn)
if not gauges:
raise HTTPException(status_code=404, detail="Aucun snapshot de gauges disponible")
suggestions = suggest_from_gauges(inst, gauges)
# Enrich with node label/unit from graph if missing
return {
"instrument": inst,
"gauge_date": snap_date,
"n_suggestions": len(suggestions),
"suggestions": suggestions,
"gauges_available": list(gauges.keys()),
}
finally:
conn.close()
@router.post("/{instrument}/apply-suggestions")
def apply_gauge_suggestions(
instrument: str,
body: BulkOverrideBody,
) -> Dict[str, Any]:
"""Applique une liste d'overrides en bulk (depuis gauge sync ou saisie rapide)."""
from services.database import get_conn
from services.instrument_models import set_node_override
conn = get_conn()
try:
inst = instrument.upper()
saved = []
for item in body.overrides:
set_node_override(conn, inst, item.node_id, item.value, item.note or "")
saved.append(item.node_id)
return {"ok": True, "instrument": inst, "saved": saved, "count": len(saved)}
finally:
conn.close()
@router.delete("/{instrument}/overrides")
def clear_all_overrides(instrument: str) -> Dict[str, Any]:
"""Supprime TOUTES les overrides d'un instrument (reset à zéro)."""
from services.database import get_conn
conn = get_conn()
try:
inst = instrument.upper()
conn.execute("DELETE FROM instrument_node_overrides WHERE instrument=?", (inst,))
conn.commit()
return {"ok": True, "instrument": inst}
finally:
conn.close()
@router.get("/{instrument}/regime")
def get_instrument_regime(
instrument: str,