|
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 |
|
|