AIdeaText commited on
Commit
388fcf3
·
verified ·
1 Parent(s): 6097f09

Update modules/studentact/student_activities_v2.py

Browse files
modules/studentact/student_activities_v2.py CHANGED
@@ -535,10 +535,14 @@ def display_semantic_activities(username: str, t: dict):
535
 
536
 
537
  ###################################################################################################
 
538
  def display_discourse_activities(username: str, t: dict):
539
  """
540
- Solución simplificada para mostrar análisis de discurso con máxima tolerancia a errores
541
- y corregida para evitar el error de verificación de colección MongoDB
 
 
 
542
  """
543
  try:
544
  # Importar directamente la colección
@@ -550,7 +554,7 @@ def display_discourse_activities(username: str, t: dict):
550
  # Obtener colección directamente
551
  collection = get_collection('student_discourse_analysis')
552
 
553
- # CORRECCIÓN: Verificar si collection es None, no usar 'if not collection'
554
  if collection is None:
555
  st.info(t.get('no_discourse_analyses', 'No hay análisis comparados de textos registrados'))
556
  return
@@ -564,8 +568,11 @@ def display_discourse_activities(username: str, t: dict):
564
  return
565
 
566
  # Mostrar cada resultado
567
- for doc in results:
568
  try:
 
 
 
569
  # Extraer y formatear fecha con manejo de errores
570
  timestamp_str = doc.get('timestamp', 'Fecha desconocida')
571
  try:
@@ -578,83 +585,93 @@ def display_discourse_activities(username: str, t: dict):
578
  formatted_date = str(timestamp_str)
579
 
580
  # Crear expander
581
- expander_label = f"Análisis: {formatted_date}"
582
- with st.expander(expander_label):
583
  # Mostrar texto si existe
584
  if 'text1' in doc and doc['text1']:
585
- st.text_area("Texto analizado",
586
- value=doc['text1'],
587
- height=100,
588
- disabled=True)
 
 
 
589
 
590
- # Mostrar conceptos clave si existen
591
- has_concepts = False
592
-
593
- # Intentar mostrar conceptos clave en dos columnas
594
- if 'key_concepts1' in doc or 'key_concepts2' in doc:
595
- has_concepts = True
596
- col1, col2 = st.columns(2)
597
 
598
- # Columna 1
599
- with col1:
600
- st.markdown("**Conceptos clave (Texto 1)**")
601
- if 'key_concepts1' in doc and doc['key_concepts1']:
602
- try:
603
- # Mostrar simple como texto para evitar errores de formato
604
- concepts = doc['key_concepts1']
605
- if isinstance(concepts, list):
606
- concept_text = ""
607
- for c in concepts:
608
- if isinstance(c, list) and len(c) >= 2:
609
- concept_text += f"{c[0]}: {c[1]}\n"
610
- else:
611
- concept_text += f"• {c}\n"
612
- st.text(concept_text)
613
  else:
614
- st.text(str(concepts))
615
- except:
616
- st.text("Error mostrando conceptos")
 
617
  else:
618
- st.text("Sin conceptos disponibles")
619
-
620
- # Columna 2
621
- with col2:
622
- st.markdown("**Conceptos clave (Texto 2)**")
623
- if 'key_concepts2' in doc and doc['key_concepts2']:
624
- try:
625
- # Mostrar simple como texto para evitar errores de formato
626
- concepts = doc['key_concepts2']
627
- if isinstance(concepts, list):
628
- concept_text = ""
629
- for c in concepts:
630
- if isinstance(c, list) and len(c) >= 2:
631
- concept_text += f"• {c[0]}: {c[1]}\n"
632
- else:
633
- concept_text += f"• {c}\n"
634
- st.text(concept_text)
 
635
  else:
636
- st.text(str(concepts))
637
- except:
638
- st.text("Error mostrando conceptos")
 
639
  else:
640
- st.text("Sin conceptos disponibles")
 
 
 
641
 
642
- # Buscar visualizaciones
643
  st.markdown("---")
644
- st.markdown("**Visualizaciones**")
645
 
646
  # Variable para verificar si se mostró alguna visualización
647
  shown_images = 0
648
 
649
- # Mostrar todas las visualizaciones posibles
650
  for field_name in ['graph1', 'graph2', 'combined_graph']:
651
  if field_name in doc and doc[field_name]:
652
  try:
653
  data = doc[field_name]
654
 
 
 
 
 
 
 
 
 
655
  # Si es bytes, mostrar directamente
656
  if isinstance(data, bytes):
657
- st.image(data, caption=field_name, use_column_width=True)
658
  shown_images += 1
659
 
660
  # Si es string, intentar como base64
@@ -662,7 +679,7 @@ def display_discourse_activities(username: str, t: dict):
662
  try:
663
  import base64
664
  image_bytes = base64.b64decode(data)
665
- st.image(image_bytes, caption=field_name, use_column_width=True)
666
  shown_images += 1
667
  except:
668
  # Si falla la decodificación, solo registrarlo
@@ -672,15 +689,15 @@ def display_discourse_activities(username: str, t: dict):
672
 
673
  # Mensaje si no hay visualizaciones
674
  if shown_images == 0:
675
- st.info("No hay visualizaciones disponibles para este análisis")
676
-
677
- # Mostrar los datos crudos para depuración (opcional)
678
- with st.expander("Datos completos del análisis", expanded=False):
679
- # Filtrar campos binarios y muy grandes
680
- filtered_doc = {k: v for k, v in doc.items()
681
- if not isinstance(v, bytes)
682
- and not (isinstance(v, str) and len(str(v)) > 500)}
683
- st.json(filtered_doc)
684
 
685
  except Exception as doc_err:
686
  logger.error(f"Error procesando documento: {str(doc_err)}")
@@ -689,14 +706,15 @@ def display_discourse_activities(username: str, t: dict):
689
  except Exception as e:
690
  logger.error(f"Error general: {str(e)}")
691
  st.error(f"Error recuperando análisis: {str(e)}")
692
- # Mostrar el error completo para depuración
693
- st.exception(e)
 
694
  #################################################################################
695
 
696
  def display_discourse_comparison(analysis: dict, t: dict):
697
  """
698
  Muestra la comparación de conceptos clave en análisis del discurso.
699
- Mejorada para manejar diferentes formatos y errores.
700
  """
701
  st.subheader(t.get('comparison_results', 'Resultados de la comparación'))
702
 
@@ -705,47 +723,44 @@ def display_discourse_comparison(analysis: dict, t: dict):
705
  st.info(t.get('no_concepts', 'No hay conceptos disponibles para comparar'))
706
  return
707
 
708
- # Mostrar en dos columnas
709
- col1, col2 = st.columns(2)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
710
 
711
- # Columna 1: Conceptos del texto 1
712
- with col1:
713
- st.markdown(f"**{t.get('concepts_text_1', 'Conceptos Texto 1')}**")
714
  try:
715
- # Comprobar formato y crear DataFrame
716
- if isinstance(analysis['key_concepts1'], list) and len(analysis['key_concepts1']) > 0:
717
- if isinstance(analysis['key_concepts1'][0], list) and len(analysis['key_concepts1'][0]) == 2:
718
- df1 = pd.DataFrame(analysis['key_concepts1'], columns=['Concepto', 'Relevancia'])
719
- st.dataframe(df1)
 
720
  else:
721
- # Si no tiene el formato esperado, mostrar como lista
722
- st.write(", ".join(str(c) for c in analysis['key_concepts1']))
723
  else:
724
- st.write(str(analysis['key_concepts1']))
725
  except Exception as e:
726
- logger.error(f"Error mostrando key_concepts1: {str(e)}")
727
- st.error(t.get('error_concepts1', 'Error mostrando conceptos del Texto 1'))
728
-
729
- # Columna 2: Conceptos del texto 2
730
- with col2:
731
- st.markdown(f"**{t.get('concepts_text_2', 'Conceptos Texto 2')}**")
732
- if 'key_concepts2' in analysis and analysis['key_concepts2']:
733
- try:
734
- # Comprobar formato y crear DataFrame
735
- if isinstance(analysis['key_concepts2'], list) and len(analysis['key_concepts2']) > 0:
736
- if isinstance(analysis['key_concepts2'][0], list) and len(analysis['key_concepts2'][0]) == 2:
737
- df2 = pd.DataFrame(analysis['key_concepts2'], columns=['Concepto', 'Relevancia'])
738
- st.dataframe(df2)
739
- else:
740
- # Si no tiene el formato esperado, mostrar como lista
741
- st.write(", ".join(str(c) for c in analysis['key_concepts2']))
742
- else:
743
- st.write(str(analysis['key_concepts2']))
744
- except Exception as e:
745
- logger.error(f"Error mostrando key_concepts2: {str(e)}")
746
- st.error(t.get('error_concepts2', 'Error mostrando conceptos del Texto 2'))
747
- else:
748
- st.info(t.get('no_concepts2', 'No hay conceptos disponibles para el Texto 2'))
749
 
750
 
751
  #################################################################################
 
535
 
536
 
537
  ###################################################################################################
538
+
539
  def display_discourse_activities(username: str, t: dict):
540
  """
541
+ Función mejorada para mostrar análisis de discurso que:
542
+ 1. Evita expanders anidados
543
+ 2. Usa keys únicos para todos los elementos
544
+ 3. Muestra los conceptos clave en formato horizontal
545
+ 4. Maneja correctamente la verificación de colección MongoDB
546
  """
547
  try:
548
  # Importar directamente la colección
 
554
  # Obtener colección directamente
555
  collection = get_collection('student_discourse_analysis')
556
 
557
+ # Verificar correctamente si collection es None
558
  if collection is None:
559
  st.info(t.get('no_discourse_analyses', 'No hay análisis comparados de textos registrados'))
560
  return
 
568
  return
569
 
570
  # Mostrar cada resultado
571
+ for i, doc in enumerate(results):
572
  try:
573
+ # Crear ID único para este análisis
574
+ doc_id = str(doc.get('_id', f"doc_{i}"))
575
+
576
  # Extraer y formatear fecha con manejo de errores
577
  timestamp_str = doc.get('timestamp', 'Fecha desconocida')
578
  try:
 
585
  formatted_date = str(timestamp_str)
586
 
587
  # Crear expander
588
+ expander_label = f"{t.get('analysis_date', 'Fecha')}: {formatted_date}"
589
+ with st.expander(expander_label, expanded=False):
590
  # Mostrar texto si existe
591
  if 'text1' in doc and doc['text1']:
592
+ st.text_area(
593
+ "Texto analizado",
594
+ value=doc['text1'],
595
+ height=100,
596
+ disabled=True,
597
+ key=f"text1_{doc_id}" # Key único para este text_area
598
+ )
599
 
600
+ # Mostrar conceptos clave en formato horizontal
601
+ if 'key_concepts1' in doc and doc['key_concepts1']:
602
+ st.subheader(t.get('key_concepts', 'Conceptos clave'))
 
 
 
 
603
 
604
+ # Formatear conceptos del texto 1 - Formato horizontal
605
+ st.markdown(f"**{t.get('concepts_text_1', 'Conceptos Texto 1')}:**")
606
+ try:
607
+ concepts = doc['key_concepts1']
608
+ if isinstance(concepts, list):
609
+ if len(concepts) > 0:
610
+ # Revisar el formato
611
+ if isinstance(concepts[0], list) and len(concepts[0]) == 2:
612
+ # Formato esperado: [["concepto", valor], ...]
613
+ # Mostrar en formato horizontal
614
+ concept_text = ", ".join([f"{c[0]} ({c[1]})" for c in concepts[:10]])
615
+ st.markdown(f"*{concept_text}*")
 
 
 
616
  else:
617
+ # Otro formato de lista
618
+ st.markdown(", ".join(str(c) for c in concepts[:10]))
619
+ else:
620
+ st.info("No hay conceptos disponibles")
621
  else:
622
+ st.write(str(concepts))
623
+ except Exception as e:
624
+ logger.error(f"Error mostrando conceptos 1: {str(e)}")
625
+ st.error("Error mostrando conceptos")
626
+
627
+ # Conceptos del texto 2 (si existen)
628
+ if 'key_concepts2' in doc and doc['key_concepts2']:
629
+ st.markdown(f"**{t.get('concepts_text_2', 'Conceptos Texto 2')}:**")
630
+ try:
631
+ concepts = doc['key_concepts2']
632
+ if isinstance(concepts, list):
633
+ if len(concepts) > 0:
634
+ # Revisar el formato
635
+ if isinstance(concepts[0], list) and len(concepts[0]) == 2:
636
+ # Formato esperado: [["concepto", valor], ...]
637
+ # Mostrar en formato horizontal
638
+ concept_text = ", ".join([f"{c[0]} ({c[1]})" for c in concepts[:10]])
639
+ st.markdown(f"*{concept_text}*")
640
  else:
641
+ # Otro formato de lista
642
+ st.markdown(", ".join(str(c) for c in concepts[:10]))
643
+ else:
644
+ st.info("No hay conceptos disponibles")
645
  else:
646
+ st.write(str(concepts))
647
+ except Exception as e:
648
+ logger.error(f"Error mostrando conceptos 2: {str(e)}")
649
+ st.error("Error mostrando conceptos")
650
 
651
+ # Mostrar visualizaciones si existen
652
  st.markdown("---")
653
+ st.subheader(t.get('visualizations', 'Visualizaciones'))
654
 
655
  # Variable para verificar si se mostró alguna visualización
656
  shown_images = 0
657
 
658
+ # Mostrar todas las visualizaciones posibles con keys únicos
659
  for field_name in ['graph1', 'graph2', 'combined_graph']:
660
  if field_name in doc and doc[field_name]:
661
  try:
662
  data = doc[field_name]
663
 
664
+ # Determinar título según tipo de gráfico
665
+ if field_name == 'graph1':
666
+ caption = t.get('graph1_title', 'Visualización del Texto 1')
667
+ elif field_name == 'graph2':
668
+ caption = t.get('graph2_title', 'Visualización del Texto 2')
669
+ else:
670
+ caption = t.get('combined_graph_title', 'Visualización Comparativa')
671
+
672
  # Si es bytes, mostrar directamente
673
  if isinstance(data, bytes):
674
+ st.image(data, caption=caption, use_column_width=True)
675
  shown_images += 1
676
 
677
  # Si es string, intentar como base64
 
679
  try:
680
  import base64
681
  image_bytes = base64.b64decode(data)
682
+ st.image(image_bytes, caption=caption, use_column_width=True)
683
  shown_images += 1
684
  except:
685
  # Si falla la decodificación, solo registrarlo
 
689
 
690
  # Mensaje si no hay visualizaciones
691
  if shown_images == 0:
692
+ st.info(t.get('no_visualization', 'No hay visualizaciones disponibles para este análisis'))
693
+
694
+ # NO usar expander anidado - simplemente mostrar datos importantes
695
+ st.markdown("---")
696
+ st.markdown("**Información adicional:**")
697
+ if 'analysis_type' in doc:
698
+ st.markdown(f"Tipo de análisis: {doc.get('analysis_type', 'Desconocido')}")
699
+ if 'timestamp' in doc:
700
+ st.markdown(f"Fecha: {doc.get('timestamp', 'Desconocida')}")
701
 
702
  except Exception as doc_err:
703
  logger.error(f"Error procesando documento: {str(doc_err)}")
 
706
  except Exception as e:
707
  logger.error(f"Error general: {str(e)}")
708
  st.error(f"Error recuperando análisis: {str(e)}")
709
+
710
+
711
+
712
  #################################################################################
713
 
714
  def display_discourse_comparison(analysis: dict, t: dict):
715
  """
716
  Muestra la comparación de conceptos clave en análisis del discurso.
717
+ Formato horizontal simplificado.
718
  """
719
  st.subheader(t.get('comparison_results', 'Resultados de la comparación'))
720
 
 
723
  st.info(t.get('no_concepts', 'No hay conceptos disponibles para comparar'))
724
  return
725
 
726
+ # Conceptos del Texto 1 - Formato horizontal
727
+ st.markdown(f"**{t.get('concepts_text_1', 'Conceptos Texto 1')}:**")
728
+ try:
729
+ # Comprobar formato y mostrar horizontalmente
730
+ if isinstance(analysis['key_concepts1'], list) and len(analysis['key_concepts1']) > 0:
731
+ if isinstance(analysis['key_concepts1'][0], list) and len(analysis['key_concepts1'][0]) == 2:
732
+ # Formatear como "concepto (valor), concepto2 (valor2), ..."
733
+ concepts_text = ", ".join([f"{c[0]} ({c[1]})" for c in analysis['key_concepts1'][:10]])
734
+ st.markdown(f"*{concepts_text}*")
735
+ else:
736
+ # Si no tiene el formato esperado, mostrar como lista simple
737
+ st.markdown(", ".join(str(c) for c in analysis['key_concepts1'][:10]))
738
+ else:
739
+ st.write(str(analysis['key_concepts1']))
740
+ except Exception as e:
741
+ logger.error(f"Error mostrando key_concepts1: {str(e)}")
742
+ st.error(t.get('error_concepts1', 'Error mostrando conceptos del Texto 1'))
743
 
744
+ # Conceptos del Texto 2 - Formato horizontal
745
+ st.markdown(f"**{t.get('concepts_text_2', 'Conceptos Texto 2')}:**")
746
+ if 'key_concepts2' in analysis and analysis['key_concepts2']:
747
  try:
748
+ # Comprobar formato y mostrar horizontalmente
749
+ if isinstance(analysis['key_concepts2'], list) and len(analysis['key_concepts2']) > 0:
750
+ if isinstance(analysis['key_concepts2'][0], list) and len(analysis['key_concepts2'][0]) == 2:
751
+ # Formatear como "concepto (valor), concepto2 (valor2), ..."
752
+ concepts_text = ", ".join([f"{c[0]} ({c[1]})" for c in analysis['key_concepts2'][:10]])
753
+ st.markdown(f"*{concepts_text}*")
754
  else:
755
+ # Si no tiene el formato esperado, mostrar como lista simple
756
+ st.markdown(", ".join(str(c) for c in analysis['key_concepts2'][:10]))
757
  else:
758
+ st.write(str(analysis['key_concepts2']))
759
  except Exception as e:
760
+ logger.error(f"Error mostrando key_concepts2: {str(e)}")
761
+ st.error(t.get('error_concepts2', 'Error mostrando conceptos del Texto 2'))
762
+ else:
763
+ st.info(t.get('no_concepts2', 'No hay conceptos disponibles para el Texto 2'))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
764
 
765
 
766
  #################################################################################