AIdeaText commited on
Commit
49d7f2c
·
verified ·
1 Parent(s): 10a22d7

Update modules/admin/admin_ui.py

Browse files
Files changed (1) hide show
  1. modules/admin/admin_ui.py +230 -227
modules/admin/admin_ui.py CHANGED
@@ -1,228 +1,231 @@
1
- import streamlit as st
2
- from datetime import datetime
3
- from ..database.sql_db import (
4
- get_user,
5
- get_student_user,
6
- get_admin_user,
7
- get_teacher_user,
8
- create_student_user,
9
- update_student_user,
10
- delete_student_user,
11
- record_login,
12
- record_logout,
13
- get_recent_sessions,
14
- get_user_total_time
15
- )
16
-
17
- #from ..database.morphosintax_mongo_db import get_student_morphosyntax_analysis
18
- from ..auth.auth import hash_password # Agregar esta importación al inicio
19
-
20
- #######################################################################################
21
- def format_duration(seconds):
22
- """Convierte segundos a formato legible"""
23
- if not seconds:
24
- return "0h 0m"
25
- hours = seconds // 3600
26
- minutes = (seconds % 3600) // 60
27
- return f"{hours}h {minutes}m"
28
-
29
- def admin_page():
30
- st.title("Panel de Administración")
31
- st.write(f"Bienvenido, {st.session_state.username}")
32
-
33
- # Crear tres tabs para las diferentes secciones
34
- tab1, tab2, tab3 = st.tabs([
35
- "Gestión de Usuarios",
36
- "Búsqueda de Usuarios",
37
- "Actividad de la Plataforma"
38
- ])
39
-
40
-
41
- ########################################################
42
- # Tab 1: Gestión de Usuarios
43
- with tab1:
44
- st.header("Crear Nuevo Usuario Estudiante")
45
-
46
- # Crear dos columnas para el formulario
47
- col1, col2 = st.columns(2)
48
-
49
- with col1:
50
- new_username = st.text_input(
51
- "Correo electrónico del nuevo usuario",
52
- key="admin_new_username"
53
- )
54
-
55
- with col2:
56
- new_password = st.text_input(
57
- "Contraseña",
58
- type="password",
59
- key="admin_new_password"
60
- )
61
-
62
- if st.button("Crear Usuario", key="admin_create_user", type="primary"):
63
- if new_username and new_password: # Verificamos que ambos campos tengan valor
64
- try:
65
- # Hashear la contraseña antes de crear el usuario
66
- hashed_password = hash_password(new_password)
67
- if create_student_user(new_username, hashed_password, {'partitionKey': new_username}):
68
- st.success(f"Usuario estudiante {new_username} creado exitosamente")
69
- else:
70
- st.error("Error al crear el usuario estudiante")
71
- except Exception as e:
72
- st.error(f"Error al crear usuario: {str(e)}")
73
- else:
74
- st.warning("Por favor complete todos los campos")
75
-
76
- #######################################################################
77
- # Tab 2: Búsqueda de Usuarios
78
- with tab2:
79
- st.header("Búsqueda de Usuarios")
80
-
81
- search_col1, search_col2 = st.columns([2,1])
82
-
83
- with search_col1:
84
- student_username = st.text_input(
85
- "Nombre de usuario del estudiante",
86
- key="admin_view_student"
87
- )
88
-
89
- with search_col2:
90
- search_button = st.button(
91
- "Buscar",
92
- key="admin_view_student_data",
93
- type="primary"
94
- )
95
-
96
- if search_button:
97
- student = get_student_user(student_username)
98
- if student:
99
- # Crear tabs para diferentes tipos de información
100
- info_tab1, info_tab2, info_tab3 = st.tabs([
101
- "Información Básica",
102
- "Análisis Realizados",
103
- "Tiempo en Plataforma"
104
- ])
105
-
106
- with info_tab1:
107
- st.subheader("Información del Usuario")
108
- st.json(student)
109
-
110
- with info_tab2:
111
- st.subheader("Análisis Realizados")
112
- student_data = get_student_morphosyntax_analysis(student_username)
113
- if student_data:
114
- st.json(student_data)
115
- else:
116
- st.info("No hay datos de análisis para este estudiante.")
117
-
118
- with info_tab3:
119
- st.subheader("Tiempo en Plataforma")
120
- total_time = get_user_total_time(student_username)
121
- if total_time:
122
- st.metric(
123
- "Tiempo Total",
124
- format_duration(total_time)
125
- )
126
- else:
127
- st.info("No hay registros de tiempo para este usuario")
128
- else:
129
- st.error("Estudiante no encontrado")
130
-
131
- #######################################################################
132
- # Tab 3: Actividad de la Plataforma
133
- with tab3:
134
- st.header("Actividad Reciente")
135
-
136
- # Agregar botón de actualización
137
- if st.button("Actualizar datos", key="refresh_sessions", type="primary"):
138
- st.rerun()
139
-
140
- # Mostrar spinner mientras carga
141
- with st.spinner("Cargando datos de sesiones..."):
142
- # Obtener sesiones recientes
143
- recent_sessions = get_recent_sessions(20)
144
-
145
- if recent_sessions:
146
- # Crear dataframe para mostrar los datos
147
- sessions_data = []
148
- for session in recent_sessions:
149
- try:
150
- # 1. Manejar login_time (ahora es un objeto datetime)
151
- login_val = session.get('loginTime')
152
- if isinstance(login_val, datetime):
153
- login_time = login_val.strftime("%Y-%m-%d %H:%M:%S")
154
- else:
155
- login_time = str(login_val) if login_val else "N/A"
156
-
157
- # 2. Manejar logout_time
158
- logout_val = session.get('logoutTime')
159
- if isinstance(logout_val, datetime):
160
- logout_time = logout_val.strftime("%Y-%m-%d %H:%M:%S")
161
- elif logout_val == "Activo" or not logout_val:
162
- logout_time = "Activo"
163
- else:
164
- logout_time = str(logout_val)
165
-
166
- # Agregar datos a la lista (dentro del try)
167
- sessions_data.append({
168
- "Usuario": session.get('username', 'Desconocido'),
169
- "Inicio de Sesión": login_time,
170
- "Fin de Sesión": logout_time,
171
- "Duración": format_duration(session.get('sessionDuration', 0))
172
- })
173
- except Exception as e:
174
- st.error(f"Error procesando sesión: {str(e)}")
175
- continue
176
-
177
- # Mostrar información de depuración si hay problemas
178
- with st.expander("Información de depuración", expanded=False):
179
- st.write("Datos crudos recuperados:")
180
- st.json(recent_sessions)
181
- st.write("Datos procesados para mostrar:")
182
- st.json(sessions_data)
183
-
184
- # Mostrar tabla con estilos
185
- st.dataframe(
186
- sessions_data,
187
- hide_index=True,
188
- column_config={
189
- "Usuario": st.column_config.TextColumn("Usuario", width="medium"),
190
- "Inicio de Sesión": st.column_config.TextColumn("Inicio de Sesión", width="medium"),
191
- "Fin de Sesión": st.column_config.TextColumn("Fin de Sesión", width="medium"),
192
- "Duración": st.column_config.TextColumn("Duración", width="small")
193
- }
194
- )
195
-
196
- # Añadir métricas resumen
197
- total_sessions = len(sessions_data)
198
- total_users = len(set(s['Usuario'] for s in sessions_data))
199
-
200
- metric_col1, metric_col2 = st.columns(2)
201
- with metric_col1:
202
- st.metric("Total de Sesiones", total_sessions)
203
- with metric_col2:
204
- st.metric("Usuarios Únicos", total_users)
205
- else:
206
- st.info("No hay registros de sesiones recientes.")
207
-
208
- if st.button("Mostrar diagnóstico"):
209
- st.write("Verificando la función get_recent_sessions:")
210
- # Asegúrate de que get_container esté definido o importado
211
- container = get_container("users_sessions")
212
- if container:
213
- st.success("✅ Conectado al contenedor users_sessions")
214
- else:
215
- st.error("❌ No se pudo conectar al contenedor")
216
-
217
- #######################################################################
218
- # Agregar una línea divisoria antes del botón
219
- st.markdown("---")
220
-
221
- #######################################################################
222
- # Centrar el botón de cierre de sesión
223
- col1, col2, col3 = st.columns([2,1,2])
224
- with col2:
225
- if st.button("Cerrar Sesión", key="admin_logout", type="primary", use_container_width=True):
226
- from ..auth.auth import logout
227
- logout()
 
 
 
228
  st.rerun()
 
1
+ import streamlit as st
2
+ from datetime import datetime
3
+
4
+ from ..database.sql_db import (
5
+ get_user,
6
+ get_student_user,
7
+ get_admin_user,
8
+ get_teacher_user,
9
+ create_student_user,
10
+ update_student_user,
11
+ delete_student_user,
12
+ record_login,
13
+ record_logout,
14
+ get_recent_sessions,
15
+ get_user_total_time
16
+ )
17
+
18
+ from ..database.semantic_mongo_db import get_student_semantic_analysis
19
+
20
+ #from ..database.morphosintax_mongo_db import get_student_morphosyntax_analysis
21
+ from ..auth.auth import hash_password # Agregar esta importación al inicio
22
+
23
+ #######################################################################################
24
+ def format_duration(seconds):
25
+ """Convierte segundos a formato legible"""
26
+ if not seconds:
27
+ return "0h 0m"
28
+ hours = seconds // 3600
29
+ minutes = (seconds % 3600) // 60
30
+ return f"{hours}h {minutes}m"
31
+
32
+ def admin_page():
33
+ st.title("Panel de Administración")
34
+ st.write(f"Bienvenido, {st.session_state.username}")
35
+
36
+ # Crear tres tabs para las diferentes secciones
37
+ tab1, tab2, tab3 = st.tabs([
38
+ "Gestión de Usuarios",
39
+ "Búsqueda de Usuarios",
40
+ "Actividad de la Plataforma"
41
+ ])
42
+
43
+
44
+ ########################################################
45
+ # Tab 1: Gestión de Usuarios
46
+ with tab1:
47
+ st.header("Crear Nuevo Usuario Estudiante")
48
+
49
+ # Crear dos columnas para el formulario
50
+ col1, col2 = st.columns(2)
51
+
52
+ with col1:
53
+ new_username = st.text_input(
54
+ "Correo electrónico del nuevo usuario",
55
+ key="admin_new_username"
56
+ )
57
+
58
+ with col2:
59
+ new_password = st.text_input(
60
+ "Contraseña",
61
+ type="password",
62
+ key="admin_new_password"
63
+ )
64
+
65
+ if st.button("Crear Usuario", key="admin_create_user", type="primary"):
66
+ if new_username and new_password: # Verificamos que ambos campos tengan valor
67
+ try:
68
+ # Hashear la contraseña antes de crear el usuario
69
+ hashed_password = hash_password(new_password)
70
+ if create_student_user(new_username, hashed_password, {'partitionKey': new_username}):
71
+ st.success(f"Usuario estudiante {new_username} creado exitosamente")
72
+ else:
73
+ st.error("Error al crear el usuario estudiante")
74
+ except Exception as e:
75
+ st.error(f"Error al crear usuario: {str(e)}")
76
+ else:
77
+ st.warning("Por favor complete todos los campos")
78
+
79
+ #######################################################################
80
+ # Tab 2: Búsqueda de Usuarios
81
+ with tab2:
82
+ st.header("Búsqueda de Usuarios")
83
+
84
+ search_col1, search_col2 = st.columns([2,1])
85
+
86
+ with search_col1:
87
+ student_username = st.text_input(
88
+ "Nombre de usuario del estudiante",
89
+ key="admin_view_student"
90
+ )
91
+
92
+ with search_col2:
93
+ search_button = st.button(
94
+ "Buscar",
95
+ key="admin_view_student_data",
96
+ type="primary"
97
+ )
98
+
99
+ if search_button:
100
+ student = get_student_user(student_username)
101
+ if student:
102
+ # Crear tabs para diferentes tipos de información
103
+ info_tab1, info_tab2, info_tab3 = st.tabs([
104
+ "Información Básica",
105
+ "Análisis Realizados",
106
+ "Tiempo en Plataforma"
107
+ ])
108
+
109
+ with info_tab1:
110
+ st.subheader("Información del Usuario")
111
+ st.json(student)
112
+
113
+ with info_tab2:
114
+ st.subheader("Análisis Realizados")
115
+ student_data = get_student_semantic_analysis(username, limit=10)
116
+ if student_data:
117
+ st.json(student_data)
118
+ else:
119
+ st.info("No hay datos de análisis para este estudiante.")
120
+
121
+ with info_tab3:
122
+ st.subheader("Tiempo en Plataforma")
123
+ total_time = get_user_total_time(student_username)
124
+ if total_time:
125
+ st.metric(
126
+ "Tiempo Total",
127
+ format_duration(total_time)
128
+ )
129
+ else:
130
+ st.info("No hay registros de tiempo para este usuario")
131
+ else:
132
+ st.error("Estudiante no encontrado")
133
+
134
+ #######################################################################
135
+ # Tab 3: Actividad de la Plataforma
136
+ with tab3:
137
+ st.header("Actividad Reciente")
138
+
139
+ # Agregar botón de actualización
140
+ if st.button("Actualizar datos", key="refresh_sessions", type="primary"):
141
+ st.rerun()
142
+
143
+ # Mostrar spinner mientras carga
144
+ with st.spinner("Cargando datos de sesiones..."):
145
+ # Obtener sesiones recientes
146
+ recent_sessions = get_recent_sessions(20)
147
+
148
+ if recent_sessions:
149
+ # Crear dataframe para mostrar los datos
150
+ sessions_data = []
151
+ for session in recent_sessions:
152
+ try:
153
+ # 1. Manejar login_time (ahora es un objeto datetime)
154
+ login_val = session.get('loginTime')
155
+ if isinstance(login_val, datetime):
156
+ login_time = login_val.strftime("%Y-%m-%d %H:%M:%S")
157
+ else:
158
+ login_time = str(login_val) if login_val else "N/A"
159
+
160
+ # 2. Manejar logout_time
161
+ logout_val = session.get('logoutTime')
162
+ if isinstance(logout_val, datetime):
163
+ logout_time = logout_val.strftime("%Y-%m-%d %H:%M:%S")
164
+ elif logout_val == "Activo" or not logout_val:
165
+ logout_time = "Activo"
166
+ else:
167
+ logout_time = str(logout_val)
168
+
169
+ # Agregar datos a la lista (dentro del try)
170
+ sessions_data.append({
171
+ "Usuario": session.get('username', 'Desconocido'),
172
+ "Inicio de Sesión": login_time,
173
+ "Fin de Sesión": logout_time,
174
+ "Duración": format_duration(session.get('sessionDuration', 0))
175
+ })
176
+ except Exception as e:
177
+ st.error(f"Error procesando sesión: {str(e)}")
178
+ continue
179
+
180
+ # Mostrar información de depuración si hay problemas
181
+ with st.expander("Información de depuración", expanded=False):
182
+ st.write("Datos crudos recuperados:")
183
+ st.json(recent_sessions)
184
+ st.write("Datos procesados para mostrar:")
185
+ st.json(sessions_data)
186
+
187
+ # Mostrar tabla con estilos
188
+ st.dataframe(
189
+ sessions_data,
190
+ hide_index=True,
191
+ column_config={
192
+ "Usuario": st.column_config.TextColumn("Usuario", width="medium"),
193
+ "Inicio de Sesión": st.column_config.TextColumn("Inicio de Sesión", width="medium"),
194
+ "Fin de Sesión": st.column_config.TextColumn("Fin de Sesión", width="medium"),
195
+ "Duración": st.column_config.TextColumn("Duración", width="small")
196
+ }
197
+ )
198
+
199
+ # Añadir métricas resumen
200
+ total_sessions = len(sessions_data)
201
+ total_users = len(set(s['Usuario'] for s in sessions_data))
202
+
203
+ metric_col1, metric_col2 = st.columns(2)
204
+ with metric_col1:
205
+ st.metric("Total de Sesiones", total_sessions)
206
+ with metric_col2:
207
+ st.metric("Usuarios Únicos", total_users)
208
+ else:
209
+ st.info("No hay registros de sesiones recientes.")
210
+
211
+ if st.button("Mostrar diagnóstico"):
212
+ st.write("Verificando la función get_recent_sessions:")
213
+ # Asegúrate de que get_container esté definido o importado
214
+ container = get_container("users_sessions")
215
+ if container:
216
+ st.success("✅ Conectado al contenedor users_sessions")
217
+ else:
218
+ st.error("❌ No se pudo conectar al contenedor")
219
+
220
+ #######################################################################
221
+ # Agregar una línea divisoria antes del botón
222
+ st.markdown("---")
223
+
224
+ #######################################################################
225
+ # Centrar el botón de cierre de sesión
226
+ col1, col2, col3 = st.columns([2,1,2])
227
+ with col2:
228
+ if st.button("Cerrar Sesión", key="admin_logout", type="primary", use_container_width=True):
229
+ from ..auth.auth import logout
230
+ logout()
231
  st.rerun()