Spaces:
Sleeping
Sleeping
Update modules/studentact/student_activities_v2.py
Browse files
modules/studentact/student_activities_v2.py
CHANGED
|
@@ -21,6 +21,7 @@ from ..database.morphosintax_mongo_db import get_student_morphosyntax_analysis
|
|
| 21 |
from ..database.semantic_mongo_db import get_student_semantic_analysis
|
| 22 |
from ..database.discourse_mongo_db import get_student_discourse_analysis
|
| 23 |
from ..database.chat_mongo_db import get_chat_history
|
|
|
|
| 24 |
|
| 25 |
logger = logging.getLogger(__name__)
|
| 26 |
|
|
@@ -37,11 +38,12 @@ def display_student_activities(username: str, lang_code: str, t: dict):
|
|
| 37 |
try:
|
| 38 |
st.header(t.get('activities_title', 'Mis Actividades'))
|
| 39 |
|
| 40 |
-
# Tabs para diferentes tipos de análisis
|
| 41 |
tabs = st.tabs([
|
| 42 |
t.get('morpho_activities', 'Análisis Morfosintáctico'),
|
| 43 |
t.get('semantic_activities', 'Análisis Semántico'),
|
| 44 |
t.get('discourse_activities', 'Análisis del Discurso'),
|
|
|
|
| 45 |
t.get('chat_activities', 'Conversaciones con el Asistente')
|
| 46 |
])
|
| 47 |
|
|
@@ -56,9 +58,13 @@ def display_student_activities(username: str, lang_code: str, t: dict):
|
|
| 56 |
# Tab de Análisis del Discurso
|
| 57 |
with tabs[2]:
|
| 58 |
display_discourse_activities(username, t)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
|
| 60 |
# Tab de Conversaciones del Chat
|
| 61 |
-
with tabs[
|
| 62 |
display_chat_activities(username, t)
|
| 63 |
|
| 64 |
except Exception as e:
|
|
@@ -160,16 +166,6 @@ def display_semantic_activities(username: str, t: dict):
|
|
| 160 |
st.error(t.get('error_semantic', 'Error al mostrar análisis semántico'))
|
| 161 |
|
| 162 |
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
###################################################################################################
|
| 174 |
def display_discourse_activities(username: str, t: dict):
|
| 175 |
"""Muestra actividades de análisis del discurso"""
|
|
@@ -215,6 +211,85 @@ def display_discourse_activities(username: str, t: dict):
|
|
| 215 |
logger.error(f"Error mostrando análisis del discurso: {str(e)}")
|
| 216 |
st.error(t.get('error_discourse', 'Error al mostrar análisis del discurso'))
|
| 217 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
#################################################################################
|
| 219 |
def display_discourse_comparison(analysis: dict, t: dict):
|
| 220 |
"""Muestra la comparación de análisis del discurso"""
|
|
@@ -280,3 +355,4 @@ def display_chat_activities(username: str, t: dict):
|
|
| 280 |
except Exception as e:
|
| 281 |
logger.error(f"Error mostrando historial del chat: {str(e)}")
|
| 282 |
st.error(t.get('error_chat', 'Error al mostrar historial del chat'))
|
|
|
|
|
|
| 21 |
from ..database.semantic_mongo_db import get_student_semantic_analysis
|
| 22 |
from ..database.discourse_mongo_db import get_student_discourse_analysis
|
| 23 |
from ..database.chat_mongo_db import get_chat_history
|
| 24 |
+
from ..database.current_situation_mongo_db import get_current_situation_analysis # Nueva importación
|
| 25 |
|
| 26 |
logger = logging.getLogger(__name__)
|
| 27 |
|
|
|
|
| 38 |
try:
|
| 39 |
st.header(t.get('activities_title', 'Mis Actividades'))
|
| 40 |
|
| 41 |
+
# Tabs para diferentes tipos de análisis (añadimos la nueva tab)
|
| 42 |
tabs = st.tabs([
|
| 43 |
t.get('morpho_activities', 'Análisis Morfosintáctico'),
|
| 44 |
t.get('semantic_activities', 'Análisis Semántico'),
|
| 45 |
t.get('discourse_activities', 'Análisis del Discurso'),
|
| 46 |
+
t.get('current_situation_activities', 'Mi Situación Actual'), # Nueva pestaña
|
| 47 |
t.get('chat_activities', 'Conversaciones con el Asistente')
|
| 48 |
])
|
| 49 |
|
|
|
|
| 58 |
# Tab de Análisis del Discurso
|
| 59 |
with tabs[2]:
|
| 60 |
display_discourse_activities(username, t)
|
| 61 |
+
|
| 62 |
+
# Tab de Situación Actual (nueva)
|
| 63 |
+
with tabs[3]:
|
| 64 |
+
display_current_situation_activities(username, t)
|
| 65 |
|
| 66 |
# Tab de Conversaciones del Chat
|
| 67 |
+
with tabs[4]:
|
| 68 |
display_chat_activities(username, t)
|
| 69 |
|
| 70 |
except Exception as e:
|
|
|
|
| 166 |
st.error(t.get('error_semantic', 'Error al mostrar análisis semántico'))
|
| 167 |
|
| 168 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 169 |
###################################################################################################
|
| 170 |
def display_discourse_activities(username: str, t: dict):
|
| 171 |
"""Muestra actividades de análisis del discurso"""
|
|
|
|
| 211 |
logger.error(f"Error mostrando análisis del discurso: {str(e)}")
|
| 212 |
st.error(t.get('error_discourse', 'Error al mostrar análisis del discurso'))
|
| 213 |
|
| 214 |
+
|
| 215 |
+
###################################################################################
|
| 216 |
+
# Nueva función para mostrar las actividades de Situación Actual
|
| 217 |
+
def display_current_situation_activities(username: str, t: dict):
|
| 218 |
+
"""Muestra actividades de análisis de situación actual con recomendaciones de Claude"""
|
| 219 |
+
try:
|
| 220 |
+
logger.info(f"Recuperando análisis de situación actual para {username}")
|
| 221 |
+
analyses = get_current_situation_analysis(username)
|
| 222 |
+
|
| 223 |
+
if not analyses:
|
| 224 |
+
logger.info("No se encontraron análisis de situación actual")
|
| 225 |
+
st.info(t.get('no_current_situation', 'No hay análisis de situación actual registrados'))
|
| 226 |
+
return
|
| 227 |
+
|
| 228 |
+
logger.info(f"Procesando {len(analyses)} análisis de situación actual")
|
| 229 |
+
|
| 230 |
+
for analysis in analyses:
|
| 231 |
+
try:
|
| 232 |
+
# Verificar campos necesarios
|
| 233 |
+
if not all(key in analysis for key in ['timestamp', 'feedback']):
|
| 234 |
+
logger.warning(f"Análisis incompleto: {analysis.keys()}")
|
| 235 |
+
continue
|
| 236 |
+
|
| 237 |
+
# Formatear fecha
|
| 238 |
+
timestamp = datetime.fromisoformat(analysis['timestamp'].replace('Z', '+00:00'))
|
| 239 |
+
formatted_date = timestamp.strftime("%d/%m/%Y %H:%M:%S")
|
| 240 |
+
|
| 241 |
+
# Crear expander con título que incluye información del tipo de texto si está disponible
|
| 242 |
+
title = f"{t.get('analysis_date', 'Fecha')}: {formatted_date}"
|
| 243 |
+
if 'text_type' in analysis:
|
| 244 |
+
text_type_display = {
|
| 245 |
+
'academic_article': t.get('academic_article', 'Artículo académico'),
|
| 246 |
+
'university_work': t.get('university_work', 'Trabajo universitario'),
|
| 247 |
+
'general_communication': t.get('general_communication', 'Comunicación general')
|
| 248 |
+
}.get(analysis['text_type'], analysis['text_type'])
|
| 249 |
+
title += f" - {text_type_display}"
|
| 250 |
+
|
| 251 |
+
with st.expander(title, expanded=False):
|
| 252 |
+
# Mostrar el texto original analizado
|
| 253 |
+
st.subheader(t.get('analyzed_text', 'Texto analizado'))
|
| 254 |
+
st.text_area(
|
| 255 |
+
"",
|
| 256 |
+
value=analysis.get('text', ''),
|
| 257 |
+
height=100,
|
| 258 |
+
disabled=True,
|
| 259 |
+
label_visibility="collapsed"
|
| 260 |
+
)
|
| 261 |
+
|
| 262 |
+
# Mostrar las recomendaciones generadas por Claude
|
| 263 |
+
st.subheader(t.get('recommendations', 'Recomendaciones'))
|
| 264 |
+
|
| 265 |
+
# Dar formato a las recomendaciones en un contenedor estilizado
|
| 266 |
+
st.markdown(f"""
|
| 267 |
+
<div style="padding: 20px; border-radius: 10px;
|
| 268 |
+
background-color: #f8f9fa; margin-bottom: 20px;">
|
| 269 |
+
{analysis['feedback']}
|
| 270 |
+
</div>
|
| 271 |
+
""", unsafe_allow_html=True)
|
| 272 |
+
|
| 273 |
+
# Mostrar métricas adicionales si están disponibles
|
| 274 |
+
if 'metrics' in analysis and analysis['metrics']:
|
| 275 |
+
with st.expander(t.get('metrics_details', 'Detalles de métricas')):
|
| 276 |
+
# Convertir métricas a dataframe para mejor visualización
|
| 277 |
+
metrics_df = pd.DataFrame([
|
| 278 |
+
{"Métrica": k, "Valor": v}
|
| 279 |
+
for k, v in analysis['metrics'].items()
|
| 280 |
+
if k not in ['test_type', 'timestamp'] and not isinstance(v, dict)
|
| 281 |
+
])
|
| 282 |
+
st.dataframe(metrics_df, use_container_width=True)
|
| 283 |
+
|
| 284 |
+
except Exception as e:
|
| 285 |
+
logger.error(f"Error procesando análisis individual de situación actual: {str(e)}")
|
| 286 |
+
continue
|
| 287 |
+
|
| 288 |
+
except Exception as e:
|
| 289 |
+
logger.error(f"Error mostrando análisis de situación actual: {str(e)}")
|
| 290 |
+
st.error(t.get('error_current_situation', 'Error al mostrar análisis de situación actual'))
|
| 291 |
+
|
| 292 |
+
|
| 293 |
#################################################################################
|
| 294 |
def display_discourse_comparison(analysis: dict, t: dict):
|
| 295 |
"""Muestra la comparación de análisis del discurso"""
|
|
|
|
| 355 |
except Exception as e:
|
| 356 |
logger.error(f"Error mostrando historial del chat: {str(e)}")
|
| 357 |
st.error(t.get('error_chat', 'Error al mostrar historial del chat'))
|
| 358 |
+
|