test admin pour souci bdd

#1
Files changed (1) hide show
  1. app/views/admin.py +220 -219
app/views/admin.py CHANGED
@@ -1,219 +1,220 @@
1
- ### Page Admin ###
2
-
3
- import sqlite3
4
- import hashlib
5
- from pathlib import Path
6
- import streamlit as st
7
- import pandas as pd
8
- from src.security.security_report import SecurityReport
9
-
10
- from views.home import arret_enregistrement
11
-
12
- db_path = Path(__file__).parent.parent.parent / "database" / "db_logsv2.db"
13
-
14
- query = """
15
- SELECT
16
- log.id_log,
17
- log.timestamp,
18
- prompt.prompt,
19
- prompt.response,
20
- status.status,
21
- origin.origin AS origin
22
- FROM log
23
- LEFT JOIN prompt ON log.id_prompt = prompt.id_prompt
24
- LEFT JOIN status ON log.id_status = status.id_status
25
- LEFT JOIN origin ON log.id_origin = origin.id_origin
26
- ORDER BY log.timestamp DESC
27
- """
28
-
29
-
30
- def check_password():
31
- """
32
- Fonction de vérification du mot de passe pour accéder à la page Admin.
33
- Renvoie True si le mot de passe saisi est correct, False sinon.
34
- """
35
-
36
- def password_entered():
37
- """
38
- Fonction pour comparer le hash du mot de passe saisi avec le hash attendu.
39
- Positionne la variable de session "password_correct" à True si le mot de passe est correct,
40
- à False sinon.
41
- """
42
- if (
43
- hashlib.sha256(st.session_state["password"].encode()).hexdigest()
44
- == "676bcf91f4659cccada503f86bfd836889318b87ab691ae812cb572f2e87aa87"
45
- ):
46
- st.session_state["password_correct"] = True
47
- else:
48
- st.session_state["password_correct"] = False
49
-
50
- if "password_correct" not in st.session_state:
51
- # Premier affichage, pas encore de mot de passe saisi.
52
- st.text_input(
53
- "Password", type="password", on_change=password_entered, key="password"
54
- )
55
- return False
56
- elif not st.session_state["password_correct"]:
57
- # Mot de passe incorrect, affichage d'un message d'erreur.
58
- st.text_input(
59
- "Password", type="password", on_change=password_entered, key="password"
60
- )
61
- st.error("😕 Password incorrect")
62
- return False
63
- else:
64
- # Password ok.
65
- return True
66
-
67
-
68
- def adm_page():
69
- """
70
- La page Admin permet de visualiser les données stockées dans la base de données,
71
- sous forme compacte grâce à la requête "query" définie ci-dessus.
72
- """
73
- # si enregistrement en cours, on l'arrête
74
- arret_enregistrement()
75
-
76
- # Si mdp correct, afficher les onglets
77
- if check_password():
78
- # Tabs
79
- tab1, tab2, tab3, tab4 = st.tabs(
80
- [
81
- "Évènements",
82
- "Rapport journalier",
83
- "Accès à l'API SmartRescue",
84
- "Paramétrer les clés API externes",
85
- ]
86
- )
87
-
88
- # Section Évènements SmartRescue
89
- with tab1:
90
- st.markdown("## 🚨 Accès aux évènements SmartRescue")
91
-
92
- # Filtrage des données
93
- st.sidebar.header("Filtres")
94
- items_per_page = st.sidebar.selectbox(
95
- "Éléments par page", [10, 20, 50, 100], 0
96
- )
97
-
98
- start_date = st.sidebar.date_input(
99
- "Date de début", value=pd.to_datetime("2025-01-01")
100
- )
101
- end_date = st.sidebar.date_input(
102
- "Date de fin", value=pd.to_datetime("today")
103
- )
104
-
105
- query_filtered = """
106
- SELECT
107
- log.id_log,
108
- log.timestamp,
109
- prompt.prompt,
110
- prompt.response,
111
- status.status,
112
- origin.origin AS origin
113
- FROM log
114
- LEFT JOIN prompt ON log.id_prompt = prompt.id_prompt
115
- LEFT JOIN status ON log.id_status = status.id_status
116
- LEFT JOIN origin ON log.id_origin = origin.id_origin
117
- WHERE DATE(log.timestamp) >= DATE(?) AND DATE(log.timestamp) <= DATE(?)
118
- ORDER BY log.timestamp DESC
119
- """
120
-
121
- # Connexion à la base de données
122
- with sqlite3.connect(db_path) as conn:
123
- # Récupération des enregistrements filtrés par date
124
- data = pd.read_sql_query(
125
- query_filtered, conn, params=(start_date, end_date)
126
- )
127
- cols = [
128
- "id_logs",
129
- "timestamp",
130
- "prompt",
131
- "response",
132
- "status",
133
- "origin",
134
- ]
135
-
136
- if data.empty:
137
- data = pd.DataFrame(columns=cols)
138
-
139
- total_items = len(data)
140
- total_pages = max(1, (total_items - 1) // items_per_page + 1)
141
-
142
- if "current_page" not in st.session_state:
143
- st.session_state.current_page = 1
144
-
145
- # Sélection de la page
146
- current_page = st.sidebar.number_input(
147
- "Numéro de page",
148
- 1,
149
- total_pages,
150
- st.session_state.current_page,
151
- 1,
152
- )
153
-
154
- st.session_state.current_page = current_page
155
-
156
- # Pagination
157
- start_idx = (current_page - 1) * items_per_page
158
- end_idx = min(start_idx + items_per_page, total_items)
159
- st.write(
160
- f"Affichage des éléments {start_idx + 1} à {end_idx} sur {total_items}"
161
- )
162
-
163
- # Affichage du tableau
164
- st.dataframe(
165
- data.iloc[start_idx:end_idx], use_container_width=True, hide_index=True
166
- )
167
-
168
- # Section Rapport Journalier
169
- with tab2:
170
- st.markdown("## 📊 Rapport Logs")
171
- st.write(
172
- "Générez par mail un rapport détaillé des événements, incluant les alertes de sécurité, "
173
- "les activités suspectes et les tendances globales des interactions avec SmartRescue."
174
- )
175
-
176
- if st.button("📝 Générer le rapport"):
177
- report = SecurityReport()
178
- report.run_report()
179
- st.success("✅ Rapport généré avec succès !")
180
-
181
- # Section API SmartRescue
182
- with tab3:
183
- st.markdown("## 🌐 API SmartRescue")
184
- st.markdown(
185
- """
186
- Les données présentées dans l'onglet *Évènements* peuvent être consultées [via l'API SmartRescue](http://127.0.0.1:8901/docs).
187
-
188
- Voici quelques exemples de requêtes possibles :
189
- - Requête get sans critères : [http://127.0.0.1:8901/data](http://127.0.0.1:8901/data)
190
- - Requête get avec une date de début : [http://127.0.0.1:8901/data?start_date=2025-01-29](http://127.0.0.1:8901/data?start_date=2025-01-29)
191
- - Requête get avec une date de fin : [http://127.0.0.1:8901/data?end_date=2025-01-27](http://127.0.0.1:8901/data?end_date=2025-01-27)
192
- - Requête get avec une date de début et une date de fin : [http://127.0.0.1:8901/data?start_date=2025-01-28&end_date=2025-01-28](http://127.0.0.1:8901/data?start_date=2025-01-28&end_date=2025-01-28)
193
- """
194
- )
195
-
196
- # Section Clés API externes
197
- with tab4:
198
- st.markdown("## 🔑 Clés API externes")
199
-
200
- # Texte d'explication
201
- st.write(
202
- "Pour utiliser l'API SmartRescue, vous devez fournir les clés API externes suivantes :"
203
- )
204
-
205
- api_key_hf = st.text_input(
206
- "HF_API_KEY",
207
- type="default",
208
- value=st.session_state.get("HF_API_KEY", ""),
209
- )
210
- api_key_m = st.text_input(
211
- "MISTRAL_API_KEY",
212
- type="default",
213
- value=st.session_state.get("MISTRAL_API_KEY", ""),
214
- )
215
-
216
- if st.button("Submit"):
217
- st.session_state["HF_API_KEY"] = api_key_hf
218
- st.session_state["MISTRAL_API_KEY"] = api_key_m
219
- st.success("Les clés API ont été mises à jour avec succès.")
 
 
1
+ ### Page Admin ###
2
+
3
+ import sqlite3
4
+ import hashlib
5
+ from pathlib import Path
6
+ import streamlit as st
7
+ import pandas as pd
8
+ from src.security.security_report import SecurityReport
9
+
10
+ from views.home import arret_enregistrement
11
+
12
+ db_path = Path(__file__).parent.parent.parent / "database" / "db_logsv2.db"
13
+
14
+ query = """
15
+ SELECT
16
+ log.id_log,
17
+ log.timestamp,
18
+ prompt.prompt,
19
+ prompt.response,
20
+ status.status,
21
+ origin.origin AS origin
22
+ FROM log
23
+ LEFT JOIN prompt ON log.id_prompt = prompt.id_prompt
24
+ LEFT JOIN status ON log.id_status = status.id_status
25
+ LEFT JOIN origin ON log.id_origin = origin.id_origin
26
+ ORDER BY log.timestamp DESC
27
+ """
28
+
29
+
30
+ def check_password():
31
+ """
32
+ Fonction de vérification du mot de passe pour accéder à la page Admin.
33
+ Renvoie True si le mot de passe saisi est correct, False sinon.
34
+ """
35
+
36
+ def password_entered():
37
+ """
38
+ Fonction pour comparer le hash du mot de passe saisi avec le hash attendu.
39
+ Positionne la variable de session "password_correct" à True si le mot de passe est correct,
40
+ à False sinon.
41
+ """
42
+ if (
43
+ hashlib.sha256(st.session_state["password"].encode()).hexdigest()
44
+ == "676bcf91f4659cccada503f86bfd836889318b87ab691ae812cb572f2e87aa87"
45
+ ):
46
+ st.session_state["password_correct"] = True
47
+ else:
48
+ st.session_state["password_correct"] = False
49
+
50
+ if "password_correct" not in st.session_state:
51
+ # Premier affichage, pas encore de mot de passe saisi.
52
+ st.text_input(
53
+ "Password", type="password", on_change=password_entered, key="password"
54
+ )
55
+ return False
56
+ elif not st.session_state["password_correct"]:
57
+ # Mot de passe incorrect, affichage d'un message d'erreur.
58
+ st.text_input(
59
+ "Password", type="password", on_change=password_entered, key="password"
60
+ )
61
+ st.error("😕 Password incorrect")
62
+ return False
63
+ else:
64
+ # Password ok.
65
+ return True
66
+
67
+
68
+ def adm_page():
69
+ """
70
+ La page Admin permet de visualiser les données stockées dans la base de données,
71
+ sous forme compacte grâce à la requête "query" définie ci-dessus.
72
+ """
73
+ # si enregistrement en cours, on l'arrête
74
+ arret_enregistrement()
75
+
76
+ # Si mdp correct, afficher les onglets
77
+ if check_password():
78
+ # Tabs
79
+ tab1, tab2, tab3, tab4 = st.tabs(
80
+ [
81
+ "Évènements",
82
+ "Rapport journalier",
83
+ "Accès à l'API SmartRescue",
84
+ "Paramétrer les clés API externes",
85
+ ]
86
+ )
87
+
88
+ # Section Évènements SmartRescue
89
+ with tab1:
90
+ st.markdown("## 🚨 Accès aux évènements SmartRescue")
91
+
92
+ # Filtrage des données
93
+ st.sidebar.header("Filtres")
94
+ items_per_page = st.sidebar.selectbox(
95
+ "Éléments par page", [10, 20, 50, 100], 0
96
+ )
97
+
98
+ start_date = st.sidebar.date_input(
99
+ "Date de début", value=pd.to_datetime("2025-01-01")
100
+ )
101
+ end_date = st.sidebar.date_input(
102
+ "Date de fin", value=pd.to_datetime("today")
103
+ )
104
+
105
+ query_filtered = """
106
+ SELECT
107
+ log.id_log,
108
+ log.timestamp,
109
+ prompt.prompt,
110
+ prompt.response,
111
+ status.status,
112
+ origin.origin AS origin
113
+ FROM log
114
+ LEFT JOIN prompt ON log.id_prompt = prompt.id_prompt
115
+ LEFT JOIN status ON log.id_status = status.id_status
116
+ LEFT JOIN origin ON log.id_origin = origin.id_origin
117
+ WHERE DATE(log.timestamp) >= DATE(?) AND DATE(log.timestamp) <= DATE(?)
118
+ ORDER BY log.timestamp DESC
119
+ """
120
+
121
+ # Connexion à la base de données
122
+ with sqlite3.connect(db_path) as conn:
123
+ # Récupération des enregistrements filtrés par date
124
+ data = pd.read_sql_query(
125
+ query_filtered, conn, params=(start_date, end_date)
126
+ )
127
+ cols = [
128
+ "id_logs",
129
+ "timestamp",
130
+ "prompt",
131
+ "response",
132
+ "status",
133
+ "origin",
134
+ ]
135
+
136
+ if data.empty:
137
+ data = pd.DataFrame(columns=cols)
138
+
139
+ total_items = len(data)
140
+ total_pages = max(1, (total_items - 1) // items_per_page + 1)
141
+
142
+ if "current_page" not in st.session_state:
143
+ st.session_state.current_page = 1
144
+
145
+ # Sélection de la page
146
+ current_page = st.sidebar.number_input(
147
+ "Numéro de page",
148
+ 1,
149
+ total_pages,
150
+ st.session_state.current_page,
151
+ 1,
152
+ )
153
+
154
+ st.session_state.current_page = current_page
155
+
156
+ # Pagination
157
+ start_idx = (current_page - 1) * items_per_page
158
+ end_idx = min(start_idx + items_per_page, total_items)
159
+ st.write(
160
+ f"Affichage des éléments {start_idx + 1} à {end_idx} sur {total_items}"
161
+ )
162
+
163
+ # Affichage du tableau
164
+ st.dataframe(
165
+ data.iloc[start_idx:end_idx], use_container_width=True, hide_index=True
166
+ )
167
+
168
+ # Section Rapport Journalier
169
+ with tab2:
170
+ st.markdown("## 📊 Rapport Logs")
171
+ st.write(
172
+ "Générez par mail un rapport détaillé des événements, incluant les alertes de sécurité, "
173
+ "les activités suspectes et les tendances globales des interactions avec SmartRescue."
174
+ )
175
+
176
+ if st.button("📝 Générer le rapport"):
177
+ st.write(f"db_path : {db_path}")
178
+ report = SecurityReport()
179
+ report.run_report()
180
+ st.success("✅ Rapport généré avec succès !")
181
+
182
+ # Section API SmartRescue
183
+ with tab3:
184
+ st.markdown("## 🌐 API SmartRescue")
185
+ st.markdown(
186
+ """
187
+ Les données présentées dans l'onglet *Évènements* peuvent être consultées [via l'API SmartRescue](http://127.0.0.1:8901/docs).
188
+
189
+ Voici quelques exemples de requêtes possibles :
190
+ - Requête get sans critères : [http://127.0.0.1:8901/data](http://127.0.0.1:8901/data)
191
+ - Requête get avec une date de début : [http://127.0.0.1:8901/data?start_date=2025-01-29](http://127.0.0.1:8901/data?start_date=2025-01-29)
192
+ - Requête get avec une date de fin : [http://127.0.0.1:8901/data?end_date=2025-01-27](http://127.0.0.1:8901/data?end_date=2025-01-27)
193
+ - Requête get avec une date de début et une date de fin : [http://127.0.0.1:8901/data?start_date=2025-01-28&end_date=2025-01-28](http://127.0.0.1:8901/data?start_date=2025-01-28&end_date=2025-01-28)
194
+ """
195
+ )
196
+
197
+ # Section Clés API externes
198
+ with tab4:
199
+ st.markdown("## 🔑 Clés API externes")
200
+
201
+ # Texte d'explication
202
+ st.write(
203
+ "Pour utiliser l'API SmartRescue, vous devez fournir les clés API externes suivantes :"
204
+ )
205
+
206
+ api_key_hf = st.text_input(
207
+ "HF_API_KEY",
208
+ type="default",
209
+ value=st.session_state.get("HF_API_KEY", ""),
210
+ )
211
+ api_key_m = st.text_input(
212
+ "MISTRAL_API_KEY",
213
+ type="default",
214
+ value=st.session_state.get("MISTRAL_API_KEY", ""),
215
+ )
216
+
217
+ if st.button("Submit"):
218
+ st.session_state["HF_API_KEY"] = api_key_hf
219
+ st.session_state["MISTRAL_API_KEY"] = api_key_m
220
+ st.success("Les clés API ont été mises à jour avec succès.")