| |
| import streamlit as st |
| import logging |
|
|
| |
| logging.basicConfig(level=logging.INFO) |
| logger = logging.getLogger(__name__) |
|
|
| |
| from session_state import initialize_session_state, logout |
| from translations import get_translations |
| from ..auth.auth import authenticate_user |
| from ..admin.admin_ui import admin_page |
|
|
| |
| try: |
| from .user_page import user_page |
| except ImportError as e: |
| logger.error(f"No se pudo importar user_page: {str(e)}") |
|
|
| def user_page(lang_code, t): |
| st.error("La página de usuario no está disponible.") |
|
|
| |
| def main(): |
| |
| if 'page' not in st.session_state: |
| st.session_state.page = 'login' |
|
|
| logger.info(f"Entrando en main() - Página actual: {st.session_state.page}") |
|
|
| |
| if 'lang_code' not in st.session_state: |
| st.session_state.lang_code = 'en' |
|
|
| lang_code = st.session_state.get('lang_code', 'en') |
| t = get_translations(lang_code) |
|
|
| if st.session_state.get('logged_out', False): |
| st.session_state.logged_out = False |
| st.session_state.page = 'login' |
| st.rerun() |
|
|
| if not st.session_state.get('logged_in', False): |
| logger.info("Usuario no ha iniciado sesión. Mostrando página de login") |
| login_page(lang_code, t) |
| elif st.session_state.page == 'user': |
| if st.session_state.role == 'Administrador': |
| logger.info("Redirigiendo a la página de administrador") |
| st.session_state.page = 'Admin' |
| st.rerun() |
| else: |
| logger.info("Renderizando página de usuario") |
| user_page(lang_code, t) |
| elif st.session_state.page == "Admin": |
| logger.info("Renderizando página de administrador") |
| admin_page() |
| else: |
| logger.error(f"Página no reconocida: {st.session_state.page}") |
| st.error(t.get('unrecognized_page', 'Página no reconocida')) |
| st.session_state.page = 'user' |
| st.rerun() |
|
|
| |
|
|
| def login_page(lang_code, t): |
| |
| st.markdown(""" |
| <style> |
| /* Ocultar header y footer de Streamlit */ |
| #MainMenu {visibility: hidden !important;} |
| footer {visibility: hidden !important;} |
| header {visibility: hidden !important;} |
| .stDeployButton {display: none !important;} |
| [data-testid="stHeader"] {display: none !important;} |
| [data-testid="stToolbar"] {display: none !important;} |
| [data-testid="stDecoration"] {display: none !important;} |
| [data-testid="stStatusWidget"] {display: none !important;} |
| section[data-testid="stSidebar"] {display: none !important;} |
| |
| /* Ocultar elemento superior derecho (rectángulo vacío) */ |
| .stActionButton {display: none !important;} |
| button[kind="header"] {display: none !important;} |
| |
| /* Centrar contenido */ |
| .main { |
| display: flex; |
| flex-direction: column; |
| align-items: center; |
| justify-content: center; |
| min-height: 100vh; |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| } |
| |
| /* Container del login */ |
| .login-container { |
| background: white; |
| padding: 3rem; |
| border-radius: 20px; |
| box-shadow: 0 20px 60px rgba(0,0,0,0.3); |
| max-width: 700px; |
| width: 100%; |
| margin: 0 auto; |
| text-align: center; |
| } |
| |
| /* Logo AIdeaText */ |
| .logo-aideatext { |
| width: 120px; |
| height: auto; |
| margin: 0 10px 2rem 0; |
| display: inline-block; |
| vertical-align: middle; |
| } |
| |
| /* Logo NVIDIA (más grande) */ |
| .logo-nvidia { |
| width: 300px; |
| height: auto; |
| margin: 0 0 2rem 10px; |
| display: inline-block; |
| vertical-align: middle; |
| } |
| |
| /* Título */ |
| .login-title { |
| text-align: center; |
| font-size: 1.8rem; |
| font-weight: 700; |
| color: #1f2937; |
| margin-bottom: 0.5rem; |
| } |
| |
| .login-subtitle { |
| text-align: center; |
| font-size: 0.95rem; |
| color: #6b7280; |
| margin-bottom: 2rem; |
| } |
| |
| /* Footer NVIDIA */ |
| .nvidia-footer { |
| position: fixed; |
| bottom: 0; |
| left: 0; |
| width: 100%; |
| background: rgba(255,255,255,0.95); |
| padding: 12px; |
| text-align: center; |
| font-size: 11px; |
| color: #6b7280; |
| border-top: 1px solid #e5e7eb; |
| backdrop-filter: blur(10px); |
| } |
| |
| /* Botón de submit */ |
| .stButton button { |
| width: 100%; |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| color: white; |
| border: none; |
| padding: 0.75rem; |
| border-radius: 8px; |
| font-weight: 600; |
| font-size: 1rem; |
| margin-top: 1rem; |
| } |
| |
| .stButton button:hover { |
| transform: translateY(-2px); |
| box-shadow: 0 10px 25px rgba(102, 126, 234, 0.4); |
| } |
| |
| /* Inputs */ |
| .stTextInput input { |
| border-radius: 8px; |
| border: 1px solid #d1d5db; |
| padding: 0.75rem; |
| } |
| |
| .stTextInput input:focus { |
| border-color: #667eea; |
| box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); |
| } |
| </style> |
| """, unsafe_allow_html=True) |
|
|
| |
| st.markdown(""" |
| <div class="login-container"> |
| <img class="logo-aideatext" src="https://huggingface.co/spaces/AIdeaText/v5Prod/resolve/main/assets/img/AIdeaText_Logo_vectores.png" alt="AIdeaText Logo"> |
| <img class="logo-nvidia" src="https://huggingface.co/spaces/AIdeaText/v5Prod/resolve/main/assets/img/socialmedia/nvidia/nvidia-inception-program-badge-rgb-for-screen.png" alt="NVIDIA Logo"> |
| </div> |
| """, unsafe_allow_html=True) |
|
|
| |
| st.markdown(""" |
| <h1 class="login-title">AIdeaText</h1> |
| <p class="login-subtitle">Cognitive Development Platform</p> |
| """, unsafe_allow_html=True) |
|
|
| |
| with st.form("login_form", clear_on_submit=False): |
| username = st.text_input("Email", placeholder="your.email@institution.edu") |
| password = st.text_input("Password", type="password", placeholder="Enter your password") |
| submit_button = st.form_submit_button("Sign In") |
|
|
| if submit_button: |
| success, role = authenticate_user(username, password) |
| if success: |
| st.session_state.logged_in = True |
| st.session_state.username = username |
| st.session_state.role = role |
| if role == 'Administrador': |
| st.session_state.page = 'Admin' |
| else: |
| st.session_state.page = 'user' |
| logger.info(f"Usuario autenticado: {username}, Rol: {role}") |
| st.rerun() |
| else: |
| st.error("❌ Invalid credentials. Please try again.") |
|
|
|
|
| |
| st.markdown(""" |
| <div class="nvidia-footer"> |
| © 2025 NVIDIA, the NVIDIA logo are trademarks and/or registered trademarks of NVIDIA Corporation in the U.S. and other countries. |
| </div> |
| """, unsafe_allow_html=True) |
|
|
| |
|
|
| __all__ = ['main', 'login_page', 'initialize_session_state'] |
|
|
| if __name__ == "__main__": |
| main() |
|
|