File size: 4,606 Bytes
1bc7a0c
 
 
 
 
 
 
 
 
 
 
 
 
 
9565067
1bc7a0c
 
 
 
 
 
 
 
 
9565067
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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