Arena / db.py
FredOru's picture
v0.2
9565067
raw
history blame
4.61 kB
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