AIdeaText commited on
Commit
ace33ce
·
verified ·
1 Parent(s): 71845c3

Update modules/studentact/current_situation_interface.py

Browse files
modules/studentact/current_situation_interface.py CHANGED
@@ -94,108 +94,126 @@ ANALYSIS_DIMENSION_MAPPING = {
94
 
95
  def display_current_situation_interface(lang_code, nlp_models, t):
96
  """
97
- Interfaz simplificada con gráfico de radar para visualizar métricas.
98
  """
99
- # Inicializar estados si no existen
100
- if 'text_input' not in st.session_state:
101
- st.session_state.text_input = ""
102
- if 'text_area' not in st.session_state: # Añadir inicialización de text_area
103
- st.session_state.text_area = ""
104
- if 'show_results' not in st.session_state:
105
- st.session_state.show_results = False
106
- if 'current_doc' not in st.session_state:
107
- st.session_state.current_doc = None
108
- if 'current_metrics' not in st.session_state:
109
- st.session_state.current_metrics = None
110
 
111
  try:
112
- # Container principal con dos columnas
113
- with st.container():
114
- input_col, results_col = st.columns([1,2])
115
-
116
- with input_col:
117
- # Text area con manejo de estado
118
- text_input = st.text_area(
119
- t.get('input_prompt', "Escribe o pega tu texto aquí:"),
120
- height=400,
121
- key="text_area",
122
- value=st.session_state.text_input,
123
- help="Este texto será analizado para darte recomendaciones personalizadas"
124
- )
125
-
126
- # Función para manejar cambios de texto
127
- if text_input != st.session_state.text_input:
128
- st.session_state.text_input = text_input
129
- st.session_state.show_results = False
130
-
131
- if st.button(
132
- t.get('analyze_button', "Analizar mi escritura"),
133
- type="primary",
134
- disabled=not text_input.strip(),
135
- use_container_width=True,
136
- ):
137
- try:
138
- with st.spinner(t.get('processing', "Analizando...")):
139
- doc = nlp_models[lang_code](text_input)
140
- metrics = analyze_text_dimensions(doc)
141
-
142
- storage_success = store_current_situation_result(
143
- username=st.session_state.username,
144
- text=text_input,
145
- metrics=metrics,
146
- feedback=None
147
- )
148
-
149
- if not storage_success:
150
- logger.warning("No se pudo guardar el análisis en la base de datos")
151
-
152
- st.session_state.current_doc = doc
153
- st.session_state.current_metrics = metrics
154
- st.session_state.show_results = True
155
-
156
- except Exception as e:
157
- logger.error(f"Error en análisis: {str(e)}")
158
- st.error(t.get('analysis_error', "Error al analizar el texto"))
159
 
160
- # Mostrar resultados en la columna derecha
161
- with results_col:
162
- if st.session_state.show_results and st.session_state.current_metrics is not None:
163
- # Primero los radio buttons para tipo de texto
164
- st.markdown("### Tipo de texto")
165
- text_type = st.radio(
166
- "",
167
- options=list(TEXT_TYPES.keys()),
168
- format_func=lambda x: TEXT_TYPES[x]['name'],
169
- horizontal=True,
170
- key="text_type_radio",
171
- help="Selecciona el tipo de texto para ajustar los criterios de evaluación"
172
  )
173
 
174
- st.session_state.current_text_type = text_type
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
 
176
- # Luego mostrar los resultados
177
- display_results(
178
- metrics=st.session_state.current_metrics,
179
- text_type=text_type
 
180
  )
 
 
 
181
 
182
- # Agregar selector de modo
183
- analysis_mode = st.radio(
184
- "Modo de análisis",
185
- ["Establecer línea base", "Comparar progreso"],
186
- key="analysis_mode"
187
- )
188
-
189
- if analysis_mode == "Establecer línea base":
190
- # Mostrar interfaz normal
191
- display_baseline_interface(lang_code, nlp_models, t)
192
- else:
193
- # Mostrar interfaz de comparación
194
- display_comparison_interface(lang_code, nlp_models, t)
195
-
196
  except Exception as e:
197
- logger.error(f"Error en interfaz principal: {str(e)}")
198
- st.error("Ocurrió un error al cargar la interfaz")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
 
200
  ###################################
201
 
 
94
 
95
  def display_current_situation_interface(lang_code, nlp_models, t):
96
  """
97
+ Interfaz con línea base y progreso lado a lado.
98
  """
99
+ # Inicializar estados
100
+ if 'baseline_text' not in st.session_state:
101
+ # Intentar recuperar línea base guardada
102
+ baseline = get_writing_baseline(st.session_state.username)
103
+ st.session_state.baseline_text = baseline['text'] if baseline else ""
104
+ st.session_state.baseline_metrics = baseline['metrics'] if baseline else None
105
+
106
+ if 'iteration_count' not in st.session_state:
107
+ st.session_state.iteration_count = 0
 
 
108
 
109
  try:
110
+ st.title("Análisis de Escritura")
111
+
112
+ # Crear dos columnas principales
113
+ col1, col2 = st.columns(2)
114
+
115
+ # Columna izquierda: Línea Base
116
+ with col1:
117
+ st.markdown("### Línea Base")
118
+ baseline_text = st.text_area(
119
+ "Texto base",
120
+ value=st.session_state.baseline_text,
121
+ height=200,
122
+ key="baseline_area",
123
+ help="Este texto servirá como punto de referencia"
124
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
 
126
+ if st.button("Establecer Línea Base", type="primary"):
127
+ with st.spinner("Analizando línea base..."):
128
+ doc = nlp_models[lang_code](baseline_text)
129
+ metrics = analyze_text_dimensions(doc)
130
+
131
+ success = store_writing_baseline(
132
+ username=st.session_state.username,
133
+ metrics=metrics,
134
+ text=baseline_text
 
 
 
135
  )
136
 
137
+ if success:
138
+ st.session_state.baseline_text = baseline_text
139
+ st.session_state.baseline_metrics = metrics
140
+ st.success("Línea base establecida")
141
+
142
+ # Mostrar métricas de línea base
143
+ display_metrics_column(metrics, "Línea Base")
144
+
145
+ # Columna derecha: Progreso
146
+ with col2:
147
+ st.markdown(f"### Iteración #{st.session_state.iteration_count + 1}")
148
+ current_text = st.text_area(
149
+ "Texto actual",
150
+ height=200,
151
+ key="current_area",
152
+ help="Escribe la nueva versión de tu texto"
153
+ )
154
+
155
+ if st.button("Analizar Progreso", type="primary"):
156
+ if not st.session_state.baseline_metrics:
157
+ st.error("Primero debes establecer una línea base")
158
+ return
159
+
160
+ with st.spinner("Analizando progreso..."):
161
+ doc = nlp_models[lang_code](current_text)
162
+ current_metrics = analyze_text_dimensions(doc)
163
+
164
+ # Incrementar contador de iteraciones
165
+ st.session_state.iteration_count += 1
166
 
167
+ # Guardar progreso
168
+ store_writing_progress(
169
+ username=st.session_state.username,
170
+ metrics=current_metrics,
171
+ text=current_text
172
  )
173
+
174
+ # Mostrar métricas actuales
175
+ display_metrics_column(current_metrics, f"Iteración #{st.session_state.iteration_count}")
176
 
177
+ # Expander con gráfico radar
178
+ with st.expander("Ver Comparación Visual", expanded=False):
179
+ if st.session_state.baseline_metrics and 'current_metrics' in locals():
180
+ baseline_config = prepare_metrics_config(st.session_state.baseline_metrics)
181
+ current_config = prepare_metrics_config(current_metrics)
182
+ display_radar_chart(
183
+ metrics_config=current_config,
184
+ thresholds=TEXT_TYPES['student_essay']['thresholds'],
185
+ baseline_metrics=st.session_state.baseline_metrics
186
+ )
187
+
 
 
 
188
  except Exception as e:
189
+ logger.error(f"Error en interfaz: {str(e)}")
190
+ st.error("Error al cargar la interfaz")
191
+
192
+
193
+ ###################################
194
+
195
+ def display_metrics_column(metrics, title):
196
+ """Muestra columna de métricas con formato consistente"""
197
+ st.markdown(f"#### Métricas {title}")
198
+
199
+ for dimension in ['vocabulary', 'structure', 'cohesion', 'clarity']:
200
+ value = metrics[dimension]['normalized_score']
201
+ if value < 0.6:
202
+ status = "⚠️ Por mejorar"
203
+ color = "inverse"
204
+ elif value < 0.8:
205
+ status = "📈 Aceptable"
206
+ color = "off"
207
+ else:
208
+ status = "✅ Óptimo"
209
+ color = "normal"
210
+
211
+ st.metric(
212
+ dimension.title(),
213
+ f"{value:.2f}",
214
+ status,
215
+ delta_color=color
216
+ )
217
 
218
  ###################################
219