AIdeaText commited on
Commit
56a6527
·
verified ·
1 Parent(s): bf5747b

Update modules/studentact/student_activities_v2.py

Browse files
modules/studentact/student_activities_v2.py CHANGED
@@ -538,109 +538,157 @@ def display_semantic_activities(username: str, t: dict):
538
 
539
  def display_discourse_activities(username: str, t: dict):
540
  """
541
- Muestra actividades de análisis del discurso en la sección de historial
542
- Ahora muestra los dos gráficos principales uno al lado del otro
543
  """
544
  try:
545
- logger.info(f"Recuperando análisis del discurso para {username}")
 
546
 
547
- # Obtener análisis - usando la función existente
548
- analyses = get_student_discourse_analysis(username)
549
 
550
- if not analyses:
551
- logger.info("No se encontraron análisis del discurso")
 
552
  st.info(t.get('no_discourse_analyses', 'No hay análisis comparados de textos registrados'))
553
  return
554
-
555
- logger.info(f"Procesando {len(analyses)} análisis del discurso")
556
 
557
- for analysis in analyses:
 
 
 
 
 
 
 
 
 
558
  try:
559
- # Formatear fecha - con manejo de errores mejorado
 
560
  try:
561
- timestamp = datetime.fromisoformat(analysis.get('timestamp', '').replace('Z', '+00:00'))
562
- formatted_date = timestamp.strftime("%d/%m/%Y %H:%M:%S")
 
 
 
563
  except:
564
- formatted_date = str(analysis.get('timestamp', 'Fecha desconocida'))
565
 
566
  # Crear expander
567
- with st.expander(f"{t.get('analysis_date', 'Fecha')}: {formatted_date}", expanded=False):
568
- # Mostrar conceptos si están disponibles
569
- if 'key_concepts1' in analysis and analysis['key_concepts1']:
570
- # Usar la función de comparación existente para mostrar conceptos
571
- display_discourse_comparison(analysis, t)
 
 
 
572
 
573
- # Mostrar gráficos - ahora en dos columnas
574
- has_graphs = False
575
 
576
- # Crear columnas para los gráficos principales
577
- if ('graph1' in analysis and analysis['graph1']) or ('graph2' in analysis and analysis['graph2']):
578
- has_graphs = True
579
  col1, col2 = st.columns(2)
580
 
581
- # Gráfico 1 en la primera columna
582
  with col1:
583
- if 'graph1' in analysis and analysis['graph1']:
584
- st.markdown(f"**{t.get('graph1_title', 'Visualización Texto 1')}**")
585
  try:
586
- # Si es bytes directamente
587
- if isinstance(analysis['graph1'], bytes):
588
- st.image(analysis['graph1'], use_column_width=True)
589
- # Si es string base64
590
- elif isinstance(analysis['graph1'], str):
591
- image_bytes = base64.b64decode(analysis['graph1'])
592
- st.image(image_bytes, use_column_width=True)
593
- except Exception as e:
594
- logger.error(f"Error mostrando graph1: {str(e)}")
595
- st.error(t.get('error_graph', 'Error mostrando visualización del Texto 1'))
 
 
 
 
596
  else:
597
- st.info(t.get('no_graph1', 'No hay visualización para el Texto 1'))
598
 
599
- # Gráfico 2 en la segunda columna
600
  with col2:
601
- if 'graph2' in analysis and analysis['graph2']:
602
- st.markdown(f"**{t.get('graph2_title', 'Visualización Texto 2')}**")
603
  try:
604
- # Si es bytes directamente
605
- if isinstance(analysis['graph2'], bytes):
606
- st.image(analysis['graph2'], use_column_width=True)
607
- # Si es string base64
608
- elif isinstance(analysis['graph2'], str):
609
- image_bytes = base64.b64decode(analysis['graph2'])
610
- st.image(image_bytes, use_column_width=True)
611
- except Exception as e:
612
- logger.error(f"Error mostrando graph2: {str(e)}")
613
- st.error(t.get('error_graph', 'Error mostrando visualización del Texto 2'))
 
 
 
 
614
  else:
615
- st.info(t.get('no_graph2', 'No hay visualización para el Texto 2'))
616
 
617
- # Mostrar gráfico combinado si existe (debajo de los dos gráficos)
618
- if 'combined_graph' in analysis and analysis['combined_graph']:
619
- has_graphs = True
620
- st.markdown(f"### {t.get('combined_graph_title', 'Visualización Comparativa')}")
621
- try:
622
- # Si es bytes directamente
623
- if isinstance(analysis['combined_graph'], bytes):
624
- st.image(analysis['combined_graph'], use_column_width=True)
625
- # Si es string base64
626
- elif isinstance(analysis['combined_graph'], str):
627
- image_bytes = base64.b64decode(analysis['combined_graph'])
628
- st.image(image_bytes, use_column_width=True)
629
- except Exception as e:
630
- logger.error(f"Error mostrando combined_graph: {str(e)}")
631
- st.error(t.get('error_graph', 'Error mostrando visualización comparativa'))
632
 
633
- # Mensaje si no hay gráficos
634
- if not has_graphs:
635
- st.info(t.get('no_visualization', 'No hay visualizaciones disponibles'))
636
-
637
- except Exception as e:
638
- logger.error(f"Error procesando análisis individual: {str(e)}")
639
- continue
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
640
 
641
  except Exception as e:
642
- logger.error(f"Error mostrando análisis del discurso: {str(e)}")
643
- st.error(t.get('error_discourse', 'Error al mostrar análisis comparado de textos'))
 
 
644
 
645
  #################################################################################
646
 
 
538
 
539
  def display_discourse_activities(username: str, t: dict):
540
  """
541
+ Solución simplificada para mostrar análisis de discurso con máxima tolerancia a errores
 
542
  """
543
  try:
544
+ # Importar directamente la colección
545
+ from ..database.mongo_db import get_collection
546
 
547
+ # Registrar información de inicio
548
+ logger.info(f"Intentando obtener análisis de discurso para {username}")
549
 
550
+ # Obtener colección directamente
551
+ collection = get_collection('student_discourse_analysis')
552
+ if not collection:
553
  st.info(t.get('no_discourse_analyses', 'No hay análisis comparados de textos registrados'))
554
  return
 
 
555
 
556
+ # Consulta simplificada: solo por username
557
+ results = list(collection.find({"username": username}).sort("timestamp", -1))
558
+ logger.info(f"Recuperados {len(results)} documentos para {username}")
559
+
560
+ if not results:
561
+ st.info(t.get('no_discourse_analyses', 'No hay análisis comparados de textos registrados'))
562
+ return
563
+
564
+ # Mostrar cada resultado
565
+ for doc in results:
566
  try:
567
+ # Extraer y formatear fecha con manejo de errores
568
+ timestamp_str = doc.get('timestamp', 'Fecha desconocida')
569
  try:
570
+ if isinstance(timestamp_str, str):
571
+ dt = datetime.fromisoformat(timestamp_str.replace('Z', '+00:00'))
572
+ formatted_date = dt.strftime("%d/%m/%Y %H:%M:%S")
573
+ else:
574
+ formatted_date = str(timestamp_str)
575
  except:
576
+ formatted_date = str(timestamp_str)
577
 
578
  # Crear expander
579
+ expander_label = f"Análisis: {formatted_date}"
580
+ with st.expander(expander_label):
581
+ # Mostrar texto si existe
582
+ if 'text1' in doc and doc['text1']:
583
+ st.text_area("Texto analizado",
584
+ value=doc['text1'],
585
+ height=100,
586
+ disabled=True)
587
 
588
+ # Mostrar conceptos clave si existen
589
+ has_concepts = False
590
 
591
+ # Intentar mostrar conceptos clave en dos columnas
592
+ if 'key_concepts1' in doc or 'key_concepts2' in doc:
593
+ has_concepts = True
594
  col1, col2 = st.columns(2)
595
 
596
+ # Columna 1
597
  with col1:
598
+ st.markdown("**Conceptos clave (Texto 1)**")
599
+ if 'key_concepts1' in doc and doc['key_concepts1']:
600
  try:
601
+ # Mostrar simple como texto para evitar errores de formato
602
+ concepts = doc['key_concepts1']
603
+ if isinstance(concepts, list):
604
+ concept_text = ""
605
+ for c in concepts:
606
+ if isinstance(c, list) and len(c) >= 2:
607
+ concept_text += f"• {c[0]}: {c[1]}\n"
608
+ else:
609
+ concept_text += f" {c}\n"
610
+ st.text(concept_text)
611
+ else:
612
+ st.text(str(concepts))
613
+ except:
614
+ st.text("Error mostrando conceptos")
615
  else:
616
+ st.text("Sin conceptos disponibles")
617
 
618
+ # Columna 2
619
  with col2:
620
+ st.markdown("**Conceptos clave (Texto 2)**")
621
+ if 'key_concepts2' in doc and doc['key_concepts2']:
622
  try:
623
+ # Mostrar simple como texto para evitar errores de formato
624
+ concepts = doc['key_concepts2']
625
+ if isinstance(concepts, list):
626
+ concept_text = ""
627
+ for c in concepts:
628
+ if isinstance(c, list) and len(c) >= 2:
629
+ concept_text += f"• {c[0]}: {c[1]}\n"
630
+ else:
631
+ concept_text += f" {c}\n"
632
+ st.text(concept_text)
633
+ else:
634
+ st.text(str(concepts))
635
+ except:
636
+ st.text("Error mostrando conceptos")
637
  else:
638
+ st.text("Sin conceptos disponibles")
639
 
640
+ # Buscar visualizaciones
641
+ st.markdown("---")
642
+ st.markdown("**Visualizaciones**")
 
 
 
 
 
 
 
 
 
 
 
 
643
 
644
+ # Variable para verificar si se mostró alguna visualización
645
+ shown_images = 0
646
+
647
+ # Mostrar todas las visualizaciones posibles
648
+ for field_name in ['graph1', 'graph2', 'combined_graph']:
649
+ if field_name in doc and doc[field_name]:
650
+ try:
651
+ data = doc[field_name]
652
+
653
+ # Si es bytes, mostrar directamente
654
+ if isinstance(data, bytes):
655
+ st.image(data, caption=field_name, use_column_width=True)
656
+ shown_images += 1
657
+
658
+ # Si es string, intentar como base64
659
+ elif isinstance(data, str):
660
+ try:
661
+ import base64
662
+ image_bytes = base64.b64decode(data)
663
+ st.image(image_bytes, caption=field_name, use_column_width=True)
664
+ shown_images += 1
665
+ except:
666
+ # Si falla la decodificación, solo registrarlo
667
+ logger.error(f"No se pudo decodificar {field_name}")
668
+ except Exception as img_err:
669
+ logger.error(f"Error mostrando {field_name}: {str(img_err)}")
670
+
671
+ # Mensaje si no hay visualizaciones
672
+ if shown_images == 0:
673
+ st.info("No hay visualizaciones disponibles para este análisis")
674
+
675
+ # Mostrar los datos crudos para depuración (opcional)
676
+ with st.expander("Datos completos del análisis", expanded=False):
677
+ # Filtrar campos binarios y muy grandes
678
+ filtered_doc = {k: v for k, v in doc.items()
679
+ if not isinstance(v, bytes)
680
+ and not (isinstance(v, str) and len(str(v)) > 500)}
681
+ st.json(filtered_doc)
682
+
683
+ except Exception as doc_err:
684
+ logger.error(f"Error procesando documento: {str(doc_err)}")
685
+ st.error(f"Error procesando análisis: {str(doc_err)}")
686
 
687
  except Exception as e:
688
+ logger.error(f"Error general: {str(e)}")
689
+ st.error(f"Error recuperando análisis: {str(e)}")
690
+ # Mostrar el error completo para depuración
691
+ st.exception(e)
692
 
693
  #################################################################################
694