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 update_row( slug: str, definition: dict[str, Any], row_id: int, form_data: Mapping[str, str], player_id: str = PLAYER_SHARED ) -> None: """CRUD — Update : ré-enregistre une ligne existante avec les nouvelles valeurs saisies dans le même formulaire généré que pour la création. Filtre aussi par player_id (voir get_row.py — même garde-fou contre un row_id d'un autre joueur).""" 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) conn = connect(slug) set_clause = ", ".join(f"{quote_ident(c)} = ?" for c in cols) conn.execute( f"UPDATE {definition['table_name']} SET {set_clause} WHERE id = ? AND player_id = ?", # nosec B608 # noqa: S608 - table_name vient de slugify()+prefixe obj_ (db/table_name_for.py) ; set_clause deja echappe via quote_ident() ; valeurs parametrees (?) values + [row_id, key], ) conn.commit() conn.close()