#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()