from typing import Any import db def data_definition_options(slug: str | None, definition_id: int | None) -> dict[str, list[dict[str, Any]]]: """Lignes et champs d'un objet de données, prêts à peupler un menu déroulant — utilisé à la fois pour DEFINITIONS_DATA (tous les objets du jeu, consommé côté client par les formulaires de la Logique de la scène) et pour pré-remplir côté serveur les réglages qui dépendent d'un objet déjà choisi sur un élément (ex: la Jauge — voir controls_with_values.py). Chaque ligne est étiquetée avec la valeur de son PREMIER champ (convention "premier champ = nom lisible", comme pour un Répéteur), pour distinguer "Confiance" de "Trésorerie" plutôt que de n'avoir que des numéros de ligne.""" if not definition_id or not slug: return {"rows": [], "fields": []} full = db.get_definition(slug, int(definition_id)) if not full: return {"rows": [], "fields": []} rows = db.list_rows(slug, full) display_field = full["fields"][0]["name"] if full["fields"] else None display_col = db.slugify(display_field).replace("-", "_") if display_field else None row_options = [ {"id": r["id"], "label": f"{r.get(display_col)} (#{r['id']})" if display_col else f"Ligne #{r['id']}"} for r in rows ] # Les champs "relation" sont INCLUS (contrairement à avant) : un filtre # de Répéteur/Donnée liée doit pouvoir comparer, par exemple, "le # parcours lié" d'un niveau — ils restent identifiables via leur "type" # pour les endroits qui n'en veulent pas (ex: le champ numérique suivi # par une Jauge, voir controls_with_values.py). relation_definition_name # (le nom de l'objet visé) sert uniquement à afficher un libellé clair # dans la liste déroulante, ex. "parcour (→ parcours)". definitions_by_id = {d["id"]: d["name"] for d in db.list_definitions(slug)} field_options = [] for f in full["fields"]: entry = {"name": f["name"], "type": f["type"]} if f["type"] == "relation": entry["relation_definition_name"] = definitions_by_id.get(f.get("relation_definition_id")) field_options.append(entry) return {"rows": row_options, "fields": field_options}