File size: 4,646 Bytes
1bc7a0c 9565067 1bc7a0c 9565067 1bc7a0c 4730bc7 1bc7a0c 4730bc7 1bc7a0c 9565067 1bc7a0c 9565067 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
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
|