| import pandas as pd | |
| """ | |
| Small Database for managing prompts, estimates, and votes in a simple arena-like application. | |
| Les données sont stockées dans des fichiers CSV. | |
| Il faut toujours se référer au fichier et pas à la variable en mémoire. | |
| La mémoire est propre à chaque utilisateur. | |
| Pour être à jour des mises à jours des autres utilisateurs, il faut recharger les données depuis le fichier. | |
| """ | |
| DATABASE = { | |
| "prompts": { | |
| "filename": "database/prompts.csv", | |
| "columns": ["id", "team", "text"], | |
| }, | |
| "estimates": { | |
| "filename": "database/estimates.csv", | |
| "columns": ["id", "prompt_id", "mu", "sigma"], | |
| }, | |
| "votes": { | |
| "filename": "database/votes.csv", | |
| "columns": ["id", "winner_id", "loser_id"], | |
| }, | |
| "teams": { | |
| "filename": "database/teams.csv", | |
| "columns": ["id", "name"], | |
| }, | |
| "users": { | |
| "filename": "database/users.csv", | |
| "columns": ["id", "team", "username", "code"], | |
| }, | |
| "switches": { | |
| "filename": "database/switches.csv", | |
| "columns": ["id", "name", "status"], | |
| }, | |
| "inputs": { | |
| "filename": "database/inputs.csv", | |
| "columns": ["id", "name", "text"], | |
| }, | |
| } | |
| def load(table_name: str) -> pd.DataFrame: | |
| try: | |
| result = pd.read_csv(DATABASE[table_name]["filename"]) | |
| except FileNotFoundError: | |
| result = pd.DataFrame(columns=DATABASE[table_name]["columns"]) | |
| return result | |
| def insert(table_name: str, data: dict) -> None: | |
| """Inserts data into the specified table. | |
| Id is automatically generated . | |
| example: | |
| db.insert("prompts", {"team": "Test", "text": "This is a test prompt."}) | |
| """ | |
| df = load(table_name) | |
| data["id"] = 1 if df.empty else df["id"].max() + 1 | |
| df = pd.concat( | |
| [df if not df.empty else None, pd.DataFrame([data])], ignore_index=True | |
| ) | |
| df.to_csv(DATABASE[table_name]["filename"], index=False) | |
| def update(table_name: str, row_id: int, data: dict) -> None: | |
| """ | |
| Met à jour les estimations d'un prompt dans la table spécifiée par son id d'estimation. | |
| Exemple : | |
| db.update("estimates", 3, {"mu": 25.0, "sigma": 8.3}) | |
| """ | |
| df = load(table_name) | |
| idx = df.index[df["id"] == row_id] | |
| if idx.empty: | |
| idx = len(df) | |
| for key, value in data.items(): | |
| df.loc[idx, key] = value | |
| df.to_csv(DATABASE[table_name]["filename"], index=False) | |
| def delete(table_name: str, id: int) -> None: | |
| """ | |
| Supprime une ligne de la table spécifiée par son id. | |
| Exemple : | |
| db.delete("prompts", 5) | |
| """ | |
| df = load(table_name) | |
| df = df[df["id"] != id] | |
| df.to_csv(DATABASE[table_name]["filename"], index=False) | |
| def replace(table_name: str, df: pd.DataFrame) -> None: | |
| """ | |
| Remplace la totalité du contenu de la table spécifiée par le DataFrame fourni. | |
| Exemple : | |
| db.replace("prompts", df) | |
| """ | |
| df.to_csv(DATABASE[table_name]["filename"], index=False) | |
| def get_prompt(team: str) -> str | None: | |
| """ | |
| Retourne le prompt de l'équipe spécifiée. | |
| Si l'équipe n'a pas de prompt, retourne une chaîne vide. | |
| """ | |
| prompts_df = load("prompts") | |
| row = prompts_df[prompts_df["team"] == team] | |
| if not row.empty: | |
| return row.iloc[0]["text"] | |
| return None | |
| def get_prompt_id(team: str) -> str | None: | |
| """ | |
| Retourne le prompt de l'équipe spécifiée. | |
| Si l'équipe n'a pas de prompt, retourne une chaîne vide. | |
| """ | |
| prompts_df = load("prompts") | |
| row = prompts_df[prompts_df["team"] == team] | |
| if not row.empty: | |
| return row.iloc[0]["id"] | |
| return None | |
| def get_status(name: str) -> bool: | |
| """ | |
| Retourne le statut du switch spécifié. | |
| Si le nom du switch n'existe pas en base, retourne 0. | |
| """ | |
| switches_df = load("switches") | |
| row = switches_df[switches_df["name"] == name] | |
| if not row.empty: | |
| return bool(int(row.fillna(0).iloc[0]["status"])) | |
| return False | |
| def set_status(name: str, status: int) -> None: | |
| """ | |
| Met à jour le statut du switch spécifié. | |
| Si le nom du switch n'existe pas, l'ajoute avec le statut donné. | |
| """ | |
| switches_df = load("switches") | |
| switches_df.loc[switches_df["name"] == name, "status"] = status | |
| replace("switches", switches_df) | |
| def get_user(code: str) -> dict | None: | |
| """ | |
| Retourne les informations de l'utilisateur si le code est valide. | |
| Si le code est invalide, retourne None. | |
| """ | |
| users_df = load("users") | |
| row = users_df.loc[users_df["code"] == code, ["id", "team", "username"]] | |
| return row.to_dict(orient="records")[0] if not row.empty else None | |