def element_descendant_ids(conn, screen_id, root_id): """Id de cet élément et de TOUS ses descendants — ceux qu'une suppression en cascade (parent_id ON DELETE CASCADE, voir ensure_schema.py) supprime automatiquement en même temps que lui. Partagé entre delete_element.py (nettoyage des références de la Logique de la scène avant suppression) et flow_nodes_referencing_ element.py (pour prévenir l'utilisateur AVANT qu'il confirme la suppression, voir routes/elements/element_delete_impact.py).""" rows = conn.execute( "SELECT id, parent_id FROM _screen_elements WHERE screen_id = ?", (screen_id,) ).fetchall() children_of = {} for r in rows: if r["parent_id"]: children_of.setdefault(r["parent_id"], []).append(r["id"]) ids = [root_id] stack = [root_id] while stack: current = stack.pop() for child_id in children_of.get(current, []): ids.append(child_id) stack.append(child_id) return ids