from typing import Any, Mapping from ..connection import connect from ..quote_ident import quote_ident from .ensure_player_id_column import ensure_player_id_column from .resolve_row_player_key import PLAYER_SHARED, resolve_row_player_key from .row_columns_and_values import row_columns_and_values def insert_row( slug: str, definition: dict[str, Any], form_data: Mapping[str, str], player_id: str = PLAYER_SHARED ) -> int: """Feature 3 : enregistre en base les données saisies dans le formulaire généré à partir de la définition d'objet.""" ensure_player_id_column(slug, definition["table_name"]) key = resolve_row_player_key(definition, player_id) cols, values = row_columns_and_values(definition, form_data) cols = cols + ["player_id"] values = values + [key] conn = connect(slug) placeholders = ["?"] * len(cols) quoted_cols = ", ".join(quote_ident(c) for c in cols) sql = f"INSERT INTO {definition['table_name']} ({quoted_cols}) VALUES ({', '.join(placeholders)})" # nosec B608 # noqa: S608 - table_name vient de slugify()+prefixe obj_ (db/table_name_for.py) ; colonnes deja echappees via quote_ident() ; valeurs parametrees (?) conn.execute(sql, values) new_id = int(conn.execute("SELECT last_insert_rowid() AS id").fetchone()["id"]) conn.commit() conn.close() return new_id