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", {"name": "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, 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