feat: instrument model
This commit is contained in:
@@ -15,7 +15,6 @@ class OverrideBody(BaseModel):
|
|||||||
|
|
||||||
@router.get("", response_model=List[Dict[str, Any]])
|
@router.get("", response_model=List[Dict[str, Any]])
|
||||||
def list_instrument_models():
|
def list_instrument_models():
|
||||||
"""Liste tous les modèles (métadonnées, sans valeurs calculées)."""
|
|
||||||
from services.database import get_conn
|
from services.database import get_conn
|
||||||
from services.instrument_models import INSTRUMENT_MODELS
|
from services.instrument_models import INSTRUMENT_MODELS
|
||||||
conn = get_conn()
|
conn = get_conn()
|
||||||
@@ -27,15 +26,17 @@ def list_instrument_models():
|
|||||||
for r in rows:
|
for r in rows:
|
||||||
inst = r["instrument"]
|
inst = r["instrument"]
|
||||||
meta = INSTRUMENT_MODELS.get(inst, {})
|
meta = INSTRUMENT_MODELS.get(inst, {})
|
||||||
node_counts = {"structural": 0, "event_driven": 0, "output": 0}
|
counts: dict[str, int] = {}
|
||||||
for n in meta.get("nodes", []):
|
for n in meta.get("nodes", []):
|
||||||
node_counts[n.get("type", "structural")] = node_counts.get(n.get("type", "structural"), 0) + 1
|
t = n.get("node_type", "unknown")
|
||||||
|
counts[t] = counts.get(t, 0) + 1
|
||||||
result.append({
|
result.append({
|
||||||
"instrument": inst,
|
"instrument": inst,
|
||||||
"name": meta.get("name", inst),
|
"name": meta.get("name", inst),
|
||||||
"description": meta.get("description", ""),
|
"description": meta.get("description", ""),
|
||||||
"n_structural": node_counts["structural"],
|
"n_input_event": counts.get("input_event", 0),
|
||||||
"n_event_driven": node_counts["event_driven"],
|
"n_input_manual": counts.get("input_manual", 0),
|
||||||
|
"n_intermediate": counts.get("intermediate", 0),
|
||||||
"updated_at": r["updated_at"],
|
"updated_at": r["updated_at"],
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
@@ -43,12 +44,30 @@ def list_instrument_models():
|
|||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/{instrument}/timeline")
|
||||||
|
def get_instrument_timeline(
|
||||||
|
instrument: str,
|
||||||
|
period: str = Query("1y", description="5d|1mo|3mo|6mo|1y|2y"),
|
||||||
|
) -> List[Dict[str, Any]]:
|
||||||
|
"""Simulation jour par jour de tous les nœuds du modèle sur la période."""
|
||||||
|
from services.database import get_conn
|
||||||
|
from services.instrument_models import simulate_timeline
|
||||||
|
conn = get_conn()
|
||||||
|
try:
|
||||||
|
data = simulate_timeline(conn, instrument.upper(), period)
|
||||||
|
if not data:
|
||||||
|
raise HTTPException(status_code=404, detail=f"Modèle introuvable pour {instrument.upper()}")
|
||||||
|
return data
|
||||||
|
finally:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
@router.get("/{instrument}")
|
@router.get("/{instrument}")
|
||||||
def get_instrument_model(
|
def get_instrument_model(
|
||||||
instrument: str,
|
instrument: str,
|
||||||
at_date: Optional[str] = Query(None, description="YYYY-MM-DD (défaut: aujourd'hui)"),
|
at_date: Optional[str] = Query(None, description="YYYY-MM-DD (défaut: aujourd'hui)"),
|
||||||
) -> Dict[str, Any]:
|
) -> Dict[str, Any]:
|
||||||
"""Graphe complet avec valeurs courantes des nœuds."""
|
"""Graphe complet avec valeurs courantes des nœuds (toutes couches)."""
|
||||||
from services.database import get_conn
|
from services.database import get_conn
|
||||||
from services.instrument_models import get_model_state
|
from services.instrument_models import get_model_state
|
||||||
conn = get_conn()
|
conn = get_conn()
|
||||||
@@ -63,7 +82,7 @@ def get_instrument_model(
|
|||||||
|
|
||||||
@router.put("/{instrument}/nodes/{node_id}/override")
|
@router.put("/{instrument}/nodes/{node_id}/override")
|
||||||
def set_override(instrument: str, node_id: str, body: OverrideBody) -> Dict[str, Any]:
|
def set_override(instrument: str, node_id: str, body: OverrideBody) -> Dict[str, Any]:
|
||||||
"""Définit ou met à jour la valeur manuelle d'un nœud structurel."""
|
"""Définit ou met à jour la valeur manuelle d'un nœud."""
|
||||||
from services.database import get_conn
|
from services.database import get_conn
|
||||||
from services.instrument_models import set_node_override
|
from services.instrument_models import set_node_override
|
||||||
conn = get_conn()
|
conn = get_conn()
|
||||||
@@ -76,7 +95,7 @@ def set_override(instrument: str, node_id: str, body: OverrideBody) -> Dict[str,
|
|||||||
|
|
||||||
@router.delete("/{instrument}/nodes/{node_id}/override")
|
@router.delete("/{instrument}/nodes/{node_id}/override")
|
||||||
def clear_override(instrument: str, node_id: str) -> Dict[str, Any]:
|
def clear_override(instrument: str, node_id: str) -> Dict[str, Any]:
|
||||||
"""Supprime l'override manuel d'un nœud (retour à valeur neutre / events)."""
|
"""Supprime l'override manuel d'un nœud (retour neutre/events)."""
|
||||||
from services.database import get_conn
|
from services.database import get_conn
|
||||||
from services.instrument_models import clear_node_override
|
from services.instrument_models import clear_node_override
|
||||||
conn = get_conn()
|
conn = get_conn()
|
||||||
@@ -87,8 +106,8 @@ def clear_override(instrument: str, node_id: str) -> Dict[str, Any]:
|
|||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
@router.get("/{instrument}/nodes/{node_id}/overrides")
|
@router.get("/{instrument}/nodes/overrides")
|
||||||
def get_node_overrides(instrument: str) -> List[Dict[str, Any]]:
|
def get_all_overrides(instrument: str) -> List[Dict[str, Any]]:
|
||||||
"""Toutes les overrides manuelles pour un instrument."""
|
"""Toutes les overrides manuelles pour un instrument."""
|
||||||
from services.database import get_conn
|
from services.database import get_conn
|
||||||
conn = get_conn()
|
conn = get_conn()
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user