Spaces:
Running
Running
| #modules/admin/admin_ui.py | |
| import streamlit as st | |
| from datetime import datetime | |
| from ..database.sql_db import ( | |
| get_user, | |
| get_student_user, | |
| get_admin_user, | |
| get_teacher_user, | |
| create_student_user, | |
| update_student_user, | |
| delete_student_user, | |
| record_login, | |
| record_logout, | |
| get_recent_sessions, | |
| get_user_total_time | |
| ) | |
| from ..database.morphosintax_mongo_db import get_student_morphosyntax_analysis | |
| def format_duration(seconds): | |
| """Convierte segundos a formato legible""" | |
| if not seconds: | |
| return "0h 0m" | |
| hours = seconds // 3600 | |
| minutes = (seconds % 3600) // 60 | |
| return f"{hours}h {minutes}m" | |
| def admin_page(): | |
| st.title("Panel de Administraci贸n") | |
| st.write(f"Bienvenido, {st.session_state.username}") | |
| # Crear tres tabs para las diferentes secciones | |
| tab1, tab2, tab3 = st.tabs([ | |
| "Gesti贸n de Usuarios", | |
| "B煤squeda de Usuarios", | |
| "Actividad de la Plataforma" | |
| ]) | |
| # Tab 1: Gesti贸n de Usuarios | |
| with tab1: | |
| st.header("Crear Nuevo Usuario Estudiante") | |
| # Crear dos columnas para el formulario | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| new_username = st.text_input( | |
| "Correo electr贸nico del nuevo usuario", | |
| key="admin_new_username" | |
| ) | |
| with col2: | |
| new_password = st.text_input( | |
| "Contrase帽a", | |
| type="password", | |
| key="admin_new_password" | |
| ) | |
| if st.button("Crear Usuario", key="admin_create_user", type="primary"): | |
| if create_student_user(new_username, new_password): | |
| st.success(f"Usuario estudiante {new_username} creado exitosamente") | |
| else: | |
| st.error("Error al crear el usuario estudiante") | |
| # Tab 2: B煤squeda de Usuarios | |
| with tab2: | |
| st.header("B煤squeda de Usuarios") | |
| search_col1, search_col2 = st.columns([2,1]) | |
| with search_col1: | |
| student_username = st.text_input( | |
| "Nombre de usuario del estudiante", | |
| key="admin_view_student" | |
| ) | |
| with search_col2: | |
| search_button = st.button( | |
| "Buscar", | |
| key="admin_view_student_data", | |
| type="primary" | |
| ) | |
| if search_button: | |
| student = get_student_user(student_username) | |
| if student: | |
| # Crear tabs para diferentes tipos de informaci贸n | |
| info_tab1, info_tab2, info_tab3 = st.tabs([ | |
| "Informaci贸n B谩sica", | |
| "An谩lisis Realizados", | |
| "Tiempo en Plataforma" | |
| ]) | |
| with info_tab1: | |
| st.subheader("Informaci贸n del Usuario") | |
| st.json(student) | |
| with info_tab2: | |
| st.subheader("An谩lisis Realizados") | |
| student_data = get_student_morphosyntax_analysis(student_username) | |
| if student_data: | |
| st.json(student_data) | |
| else: | |
| st.info("No hay datos de an谩lisis para este estudiante.") | |
| with info_tab3: | |
| st.subheader("Tiempo en Plataforma") | |
| total_time = get_user_total_time(student_username) | |
| if total_time: | |
| st.metric( | |
| "Tiempo Total", | |
| format_duration(total_time) | |
| ) | |
| else: | |
| st.info("No hay registros de tiempo para este usuario") | |
| else: | |
| st.error("Estudiante no encontrado") | |
| # Tab 3: Actividad de la Plataforma | |
| with tab3: | |
| st.header("Actividad Reciente") | |
| # Obtener sesiones recientes | |
| recent_sessions = get_recent_sessions(10) | |
| if recent_sessions: | |
| # Crear dataframe para mostrar los datos | |
| sessions_data = [] | |
| for session in recent_sessions: | |
| sessions_data.append({ | |
| "Usuario": session['username'], | |
| "Inicio de Sesi贸n": datetime.fromisoformat( | |
| session['loginTime'].rstrip('Z') | |
| ).strftime("%Y-%m-%d %H:%M:%S"), | |
| "Fin de Sesi贸n": datetime.fromisoformat( | |
| session['logoutTime'].rstrip('Z') | |
| ).strftime("%Y-%m-%d %H:%M:%S") if session.get('logoutTime') else "Activo", | |
| "Duraci贸n": format_duration(session.get('sessionDuration', 0)) | |
| }) | |
| # Mostrar tabla con estilos | |
| st.dataframe( | |
| sessions_data, | |
| hide_index=True, | |
| column_config={ | |
| "Usuario": st.column_config.TextColumn( | |
| "Usuario", | |
| width="medium" | |
| ), | |
| "Inicio de Sesi贸n": st.column_config.TextColumn( | |
| "Inicio de Sesi贸n", | |
| width="medium" | |
| ), | |
| "Fin de Sesi贸n": st.column_config.TextColumn( | |
| "Fin de Sesi贸n", | |
| width="medium" | |
| ), | |
| "Duraci贸n": st.column_config.TextColumn( | |
| "Duraci贸n", | |
| width="small" | |
| ) | |
| } | |
| ) | |
| # A帽adir m茅tricas resumen | |
| total_sessions = len(sessions_data) | |
| total_users = len(set(session['Usuario'] for session in sessions_data)) | |
| metric_col1, metric_col2 = st.columns(2) | |
| with metric_col1: | |
| st.metric("Total de Sesiones", total_sessions) | |
| with metric_col2: | |
| st.metric("Usuarios 脷nicos", total_users) | |
| else: | |
| st.info("No hay registros de sesiones recientes") | |
| # Agregar una l铆nea divisoria antes del bot贸n | |
| st.markdown("---") | |
| # Centrar el bot贸n de cierre de sesi贸n | |
| col1, col2, col3 = st.columns([2,1,2]) | |
| with col2: | |
| if st.button("Cerrar Sesi贸n", key="admin_logout", type="primary", use_container_width=True): | |
| from ..auth.auth import logout | |
| logout() | |
| st.rerun() |