AIdeaText commited on
Commit
44dad06
verified
1 Parent(s): 708de37

Update modules/ui/ui.py

Browse files
Files changed (1) hide show
  1. modules/ui/ui.py +21 -322
modules/ui/ui.py CHANGED
@@ -1,93 +1,23 @@
1
  # modules/ui/ui.py
2
  # Importaciones generales
 
 
3
  import streamlit as st
4
- from streamlit_player import st_player
5
  import logging
6
- from datetime import datetime, timezone
7
- from dateutil.parser import parse
8
-
9
-
10
- # Configuraci贸n del logger
11
- logging.basicConfig(level=logging.INFO)
12
- logger = logging.getLogger(__name__)
13
 
14
  # Importaciones locales
15
-
16
  from session_state import initialize_session_state, logout
17
-
18
  from translations import get_translations
19
-
20
- from ..auth.auth import authenticate_user, authenticate_student, authenticate_admin
21
-
22
  from ..admin.admin_ui import admin_page
23
 
24
- from ..chatbot import display_sidebar_chat
25
-
26
- # Students activities
27
- from ..studentact.student_activities_v2 import display_student_activities
28
- from ..studentact.current_situation_interface import display_current_situation_interface
29
- from ..studentact.current_situation_analysis import analyze_text_dimensions
30
-
31
-
32
- ##Importaciones desde la configuraci贸n de bases datos #######
33
-
34
- from ..database.sql_db import (
35
- get_user,
36
- get_admin_user,
37
- get_student_user,
38
- get_teacher_user,
39
- create_user,
40
- create_student_user,
41
- create_teacher_user,
42
- create_admin_user,
43
- update_student_user, # Agregada
44
- delete_student_user, # Agregada
45
- record_login,
46
- record_logout,
47
- get_recent_sessions,
48
- get_user_total_time,
49
- store_application_request,
50
- store_student_feedback
51
- )
52
-
53
- from ..database.mongo_db import (
54
- get_collection,
55
- insert_document,
56
- find_documents,
57
- update_document,
58
- delete_document
59
- )
60
-
61
- from ..database.morphosintax_mongo_db import (
62
- store_student_morphosyntax_result,
63
- get_student_morphosyntax_analysis,
64
- update_student_morphosyntax_analysis,
65
- delete_student_morphosyntax_analysis,
66
- get_student_morphosyntax_data
67
- )
68
-
69
- from ..database.chat_mongo_db import store_chat_history, get_chat_history
70
-
71
- ##Importaciones desde los an谩lisis #######
72
- from ..morphosyntax.morphosyntax_interface import (
73
- display_morphosyntax_interface,
74
- display_arc_diagram
75
- )
76
-
77
- from ..semantic.semantic_interface import (
78
- display_semantic_interface,
79
- display_semantic_results
80
- )
81
-
82
- from ..semantic.semantic_live_interface import display_semantic_live_interface
83
-
84
- from ..discourse.discourse_live_interface import display_discourse_live_interface
85
-
86
- from ..discourse.discourse_interface import ( # Agregar esta importaci贸n
87
- display_discourse_interface,
88
- display_discourse_results
89
- )
90
 
 
91
  def main():
92
  logger.info(f"Entrando en main() - P谩gina actual: {st.session_state.page}")
93
 
@@ -120,22 +50,6 @@ def main():
120
  elif st.session_state.page == "Admin":
121
  logger.info("Renderizando p谩gina de administrador")
122
  admin_page()
123
-
124
- elif st.session_state.page == "semantic":
125
- # Si estamos en la p谩gina sem谩ntica, redirigir a la p谩gina de usuario
126
- # pero mantener el tab seleccionado
127
- logger.info("Redirigiendo p谩gina sem谩ntica a p谩gina de usuario")
128
- st.session_state.page = 'user'
129
- st.session_state.selected_tab = 1 # 铆ndice del tab sem谩ntico
130
- st.rerun()
131
-
132
- elif st.session_state.page == "morpho":
133
- # Similar para la p谩gina morfosint谩ctica
134
- logger.info("Redirigiendo p谩gina morfosint谩ctica a p谩gina de usuario")
135
- st.session_state.page = 'user'
136
- st.session_state.selected_tab = 0 # 铆ndice del tab morfosint谩ctico
137
- st.rerun()
138
-
139
  else:
140
  logger.error(f"P谩gina no reconocida: {st.session_state.page}")
141
  st.error(t.get('unrecognized_page', 'P谩gina no reconocida'))
@@ -145,6 +59,8 @@ def main():
145
 
146
  logger.info(f"Saliendo de main() - Estado final de la sesi贸n: {st.session_state}")
147
 
 
 
148
  def login_register_page(lang_code, t):
149
  # st.title("AIdeaText")
150
  # st.write(t.get("welcome_message", "Bienvenido. Por favor, inicie sesi贸n o reg铆strese."))
@@ -164,6 +80,8 @@ def login_register_page(lang_code, t):
164
  with right_column:
165
  display_videos_and_info(lang_code, t)
166
 
 
 
167
  def login_form(lang_code, t):
168
  with st.form("login_form"):
169
  username = st.text_input(t.get("email", "Correo electr贸nico"))
@@ -185,6 +103,9 @@ def login_form(lang_code, t):
185
  else:
186
  st.error(t.get("invalid_credentials", "Credenciales incorrectas"))
187
 
 
 
 
188
  def register_form(lang_code, t):
189
  # st.header(t.get("request_trial", "Solicitar prueba de la aplicaci贸n"))
190
  name = st.text_input(t.get("name", "Nombre"))
@@ -219,11 +140,16 @@ def register_form(lang_code, t):
219
  st.error(t.get("application_error", "Hubo un problema al enviar tu solicitud. Por favor, intenta de nuevo m谩s tarde."))
220
  logger.error(f"Failed to store application request for {email}")
221
 
 
 
 
222
  def is_institutional_email(email):
223
  forbidden_domains = ['gmail.com', 'hotmail.com', 'yahoo.com', 'outlook.com']
224
  return not any(domain in email.lower() for domain in forbidden_domains)
225
 
226
 
 
 
227
  def display_videos_and_info(lang_code, t):
228
  # Crear tabs para cada secci贸n
229
  tab_use_case, tab_videos, tab_events, tab_gallery, tab_news = st.tabs([
@@ -364,233 +290,6 @@ def display_videos_and_info(lang_code, t):
364
  - Sistema de chat integrado para soporte
365
  """)
366
 
367
- #Despu茅s de iniciar sesi贸n
368
- ####################################
369
- ####################################
370
-
371
- def user_page(lang_code, t):
372
- logger.info(f"Entrando en user_page para el estudiante: {st.session_state.username}")
373
-
374
- # Inicializar el tab seleccionado si no existe
375
- if 'selected_tab' not in st.session_state:
376
- st.session_state.selected_tab = 0
377
-
378
- # Inicializar el estado del an谩lisis en vivo
379
- if 'semantic_live_active' not in st.session_state:
380
- st.session_state.semantic_live_active = False
381
-
382
- # Manejar la carga inicial de datos del usuario
383
- if 'user_data' not in st.session_state:
384
- with st.spinner(t.get('loading_data', "Cargando tus datos...")):
385
- try:
386
- st.session_state.user_data = get_student_morphosyntax_data(st.session_state.username)
387
- st.session_state.last_data_fetch = datetime.now(timezone.utc).isoformat()
388
- except Exception as e:
389
- logger.error(f"Error al obtener datos del usuario: {str(e)}")
390
- st.error(t.get('data_load_error', "Hubo un problema al cargar tus datos. Por favor, intenta recargar la p谩gina."))
391
- return
392
-
393
- logger.info(f"Idioma actual: {st.session_state.lang_code}")
394
- logger.info(f"Modelos NLP cargados: {'nlp_models' in st.session_state}")
395
-
396
- # Configuraci贸n de idiomas disponibles
397
- languages = {'Espa帽ol': 'es', 'English': 'en', 'Fran莽ais': 'fr'}
398
-
399
- # Estilos CSS personalizados
400
- st.markdown("""
401
- <style>
402
- .stSelectbox > div > div {
403
- padding-top: 0px;
404
- }
405
- .stButton > button {
406
- padding-top: 2px;
407
- margin-top: 0px;
408
- }
409
- div[data-testid="stHorizontalBlock"] > div:nth-child(3) {
410
- display: flex;
411
- justify-content: flex-end;
412
- align-items: center;
413
- }
414
- </style>
415
- """, unsafe_allow_html=True)
416
-
417
- # Barra superior con informaci贸n del usuario y controles
418
- with st.container():
419
- col1, col2, col3 = st.columns([2, 2, 1])
420
- with col1:
421
- st.markdown(f"<h3 style='margin-bottom: 0; padding-top: 10px;'>{t['welcome']}, {st.session_state.username}</h3>",
422
- unsafe_allow_html=True)
423
- with col2:
424
- selected_lang = st.selectbox(
425
- t['select_language'],
426
- list(languages.keys()),
427
- index=list(languages.values()).index(st.session_state.lang_code),
428
- key=f"language_selector_{st.session_state.username}_{st.session_state.lang_code}"
429
- )
430
- new_lang_code = languages[selected_lang]
431
- if st.session_state.lang_code != new_lang_code:
432
- st.session_state.lang_code = new_lang_code
433
- st.rerun()
434
- with col3:
435
- if st.button(t['logout'],
436
- key=f"logout_button_{st.session_state.username}_{st.session_state.lang_code}"):
437
- st.session_state.clear()
438
- st.rerun()
439
-
440
- st.markdown("---")
441
-
442
- # Asegurarse de que tenemos las traducciones del chatbot
443
- chatbot_t = t.get('CHATBOT_TRANSLATIONS', {}).get(lang_code, {})
444
-
445
- # Mostrar chatbot en sidebar
446
- display_sidebar_chat(lang_code, chatbot_t)
447
-
448
- # Inicializar estados para todos los tabs
449
- if 'tab_states' not in st.session_state:
450
- st.session_state.tab_states = {
451
- 'current_situation_active': False,
452
- 'morpho_active': False,
453
- 'semantic_live_active': False,
454
- 'semantic_active': False,
455
- 'discourse_live_active': False,
456
- 'discourse_active': False,
457
- 'activities_active': False,
458
- 'feedback_active': False
459
- }
460
-
461
- # Sistema de tabs
462
- tab_names = [
463
- t.get('current_situation_tab', "Mi Situaci贸n Actual"),
464
- t.get('morpho_tab', 'An谩lisis Morfosint谩ctico'),
465
- t.get('semantic_live_tab', 'An谩lisis Sem谩ntico Vivo'),
466
- t.get('semantic_tab', 'An谩lisis Sem谩ntico'),
467
- t.get('discourse_live_tab', 'An谩lisis de Discurso Vivo'),
468
- t.get('discourse_tab', 'An谩lsis de Discurso'),
469
- t.get('activities_tab', 'Mis Actividades'),
470
- t.get('feedback_tab', 'Formulario de Comentarios')
471
- ]
472
-
473
- tabs = st.tabs(tab_names)
474
-
475
- # Manejar el contenido de cada tab
476
- for index, tab in enumerate(tabs):
477
- with tab:
478
- try:
479
- # Actualizar el tab seleccionado solo si no hay un an谩lisis activo
480
- if tab.selected and st.session_state.selected_tab != index:
481
- can_switch = True
482
- for state_key in st.session_state.tab_states.keys():
483
- if st.session_state.tab_states[state_key] and index != get_tab_index(state_key):
484
- can_switch = False
485
- break
486
- if can_switch:
487
- st.session_state.selected_tab = index
488
-
489
- if index == 0: # Situaci贸n actual
490
- st.session_state.tab_states['current_situation_active'] = True
491
- display_current_situation_interface(
492
- st.session_state.lang_code,
493
- st.session_state.nlp_models,
494
- t # Pasamos todo el diccionario de traducciones
495
- )
496
-
497
- elif index == 1: # Morfosint谩ctico
498
- st.session_state.tab_states['morpho_active'] = True
499
- display_morphosyntax_interface(
500
- st.session_state.lang_code,
501
- st.session_state.nlp_models,
502
- t # Pasamos todo el diccionario de traducciones
503
- )
504
-
505
- elif index == 2: # Sem谩ntico Vivo
506
- st.session_state.tab_states['semantic_live_active'] = True
507
- display_semantic_live_interface(
508
- st.session_state.lang_code,
509
- st.session_state.nlp_models,
510
- t # Pasamos todo el diccionario de traducciones
511
- )
512
-
513
- elif index == 3: # Sem谩ntico
514
- st.session_state.tab_states['semantic_active'] = True
515
- display_semantic_interface(
516
- st.session_state.lang_code,
517
- st.session_state.nlp_models,
518
- t # Pasamos todo el diccionario de traducciones
519
- )
520
-
521
- elif index == 4: # Discurso Vivo
522
- st.session_state.tab_states['discourse_live_active'] = True
523
- display_discourse_live_interface(
524
- st.session_state.lang_code,
525
- st.session_state.nlp_models,
526
- t # Pasamos todo el diccionario de traducciones
527
- )
528
-
529
- elif index == 5: # Discurso
530
- st.session_state.tab_states['discourse_active'] = True
531
- display_discourse_interface(
532
- st.session_state.lang_code,
533
- st.session_state.nlp_models,
534
- t # Pasamos todo el diccionario de traducciones
535
- )
536
-
537
- elif index == 6: # Actividades
538
- st.session_state.tab_states['activities_active'] = True
539
- display_student_activities(
540
- username=st.session_state.username,
541
- lang_code=st.session_state.lang_code,
542
- t=t # Pasamos todo el diccionario de traducciones
543
- )
544
-
545
- elif index == 7: # Feedback
546
- st.session_state.tab_states['feedback_active'] = True
547
- display_feedback_form(
548
- st.session_state.lang_code,
549
- t # Ya estaba recibiendo el diccionario completo
550
- )
551
-
552
- except Exception as e:
553
- # Desactivar el estado en caso de error
554
- state_key = get_state_key_for_index(index)
555
- if state_key:
556
- st.session_state.tab_states[state_key] = False
557
- logger.error(f"Error en tab {index}: {str(e)}")
558
- st.error(t.get('tab_error', 'Error al cargar esta secci贸n'))
559
-
560
-
561
- #########################################################################################
562
- #########################################################################################
563
- # Panel de depuraci贸n (solo visible en desarrollo)
564
- if st.session_state.get('debug_mode', False):
565
- with st.expander("Debug Info"):
566
- st.write(f"P谩gina actual: {st.session_state.page}")
567
- st.write(f"Usuario: {st.session_state.get('username', 'No logueado')}")
568
- st.write(f"Rol: {st.session_state.get('role', 'No definido')}")
569
- st.write(f"Idioma: {st.session_state.lang_code}")
570
- st.write(f"Tab seleccionado: {st.session_state.selected_tab}")
571
- st.write(f"脷ltima actualizaci贸n de datos: {st.session_state.get('last_data_fetch', 'Nunca')}")
572
- st.write(f"Traducciones disponibles: {list(t.keys())}")
573
-
574
- ########################################################################
575
- ########################################################################
576
- def display_feedback_form(lang_code, t):
577
- logging.info(f"display_feedback_form called with lang_code: {lang_code}")
578
-
579
- st.header(t['feedback_title'])
580
-
581
- name = st.text_input(t['name'])
582
- email = st.text_input(t['email'])
583
- feedback = st.text_area(t['feedback'])
584
-
585
- if st.button(t['submit']):
586
- if name and email and feedback:
587
- if store_student_feedback(st.session_state.username, name, email, feedback):
588
- st.success(t['feedback_success'])
589
- else:
590
- st.error(t['feedback_error'])
591
- else:
592
- st.warning(t['complete_all_fields'])
593
-
594
  # Definici贸n de __all__ para especificar qu茅 se exporta
595
  __all__ = ['main', 'login_register_page', 'initialize_session_state']
596
 
 
1
  # modules/ui/ui.py
2
  # Importaciones generales
3
+
4
+ # modules/ui/ui.py
5
  import streamlit as st
 
6
  import logging
7
+ from datetime import datetime
 
 
 
 
 
 
8
 
9
  # Importaciones locales
 
10
  from session_state import initialize_session_state, logout
 
11
  from translations import get_translations
12
+ from .login_register_page import login_register_page
13
+ from .user_page import user_page
 
14
  from ..admin.admin_ui import admin_page
15
 
16
+ # Configuraci贸n del logger
17
+ logging.basicConfig(level=logging.INFO)
18
+ logger = logging.getLogger(__name__)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
+ #############################################################
21
  def main():
22
  logger.info(f"Entrando en main() - P谩gina actual: {st.session_state.page}")
23
 
 
50
  elif st.session_state.page == "Admin":
51
  logger.info("Renderizando p谩gina de administrador")
52
  admin_page()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  else:
54
  logger.error(f"P谩gina no reconocida: {st.session_state.page}")
55
  st.error(t.get('unrecognized_page', 'P谩gina no reconocida'))
 
59
 
60
  logger.info(f"Saliendo de main() - Estado final de la sesi贸n: {st.session_state}")
61
 
62
+ #############################################################
63
+ #############################################################
64
  def login_register_page(lang_code, t):
65
  # st.title("AIdeaText")
66
  # st.write(t.get("welcome_message", "Bienvenido. Por favor, inicie sesi贸n o reg铆strese."))
 
80
  with right_column:
81
  display_videos_and_info(lang_code, t)
82
 
83
+ #############################################################
84
+ #############################################################
85
  def login_form(lang_code, t):
86
  with st.form("login_form"):
87
  username = st.text_input(t.get("email", "Correo electr贸nico"))
 
103
  else:
104
  st.error(t.get("invalid_credentials", "Credenciales incorrectas"))
105
 
106
+
107
+ #############################################################
108
+ #############################################################
109
  def register_form(lang_code, t):
110
  # st.header(t.get("request_trial", "Solicitar prueba de la aplicaci贸n"))
111
  name = st.text_input(t.get("name", "Nombre"))
 
140
  st.error(t.get("application_error", "Hubo un problema al enviar tu solicitud. Por favor, intenta de nuevo m谩s tarde."))
141
  logger.error(f"Failed to store application request for {email}")
142
 
143
+
144
+ #############################################################
145
+ #############################################################
146
  def is_institutional_email(email):
147
  forbidden_domains = ['gmail.com', 'hotmail.com', 'yahoo.com', 'outlook.com']
148
  return not any(domain in email.lower() for domain in forbidden_domains)
149
 
150
 
151
+ #############################################################
152
+ #############################################################
153
  def display_videos_and_info(lang_code, t):
154
  # Crear tabs para cada secci贸n
155
  tab_use_case, tab_videos, tab_events, tab_gallery, tab_news = st.tabs([
 
290
  - Sistema de chat integrado para soporte
291
  """)
292
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  # Definici贸n de __all__ para especificar qu茅 se exporta
294
  __all__ = ['main', 'login_register_page', 'initialize_session_state']
295