|
|
|
from datetime import datetime, timezone, timedelta |
|
import logging |
|
from .mongo_db import get_collection |
|
|
|
logger = logging.getLogger(__name__) |
|
COLLECTION_NAME = 'student_current_situation' |
|
|
|
def store_current_situation_result(username, text, metrics, feedback): |
|
""" |
|
Guarda los resultados del análisis de situación actual. |
|
""" |
|
try: |
|
|
|
if not all([username, text, metrics]): |
|
logger.error("Faltan parámetros requeridos") |
|
return False |
|
|
|
collection = get_collection(COLLECTION_NAME) |
|
if collection is None: |
|
logger.error("No se pudo obtener la colección") |
|
return False |
|
|
|
|
|
formatted_metrics = { |
|
'vocabulary': { |
|
'score': metrics['vocabulary']['normalized_score'], |
|
'details': metrics['vocabulary']['details'] |
|
}, |
|
'structure': { |
|
'score': metrics['structure']['normalized_score'], |
|
'details': metrics['structure']['details'] |
|
}, |
|
'cohesion': { |
|
'score': metrics['cohesion']['normalized_score'], |
|
'details': metrics['cohesion']['details'] |
|
}, |
|
'clarity': { |
|
'score': metrics['clarity']['normalized_score'], |
|
'details': metrics['clarity']['details'] |
|
} |
|
} |
|
|
|
|
|
document = { |
|
'username': username, |
|
'timestamp': datetime.now(timezone.utc).isoformat(), |
|
'text': text, |
|
'metrics': formatted_metrics, |
|
'feedback': feedback, |
|
'analysis_type': 'current_situation' |
|
} |
|
|
|
|
|
result = collection.insert_one(document) |
|
if result.inserted_id: |
|
logger.info(f""" |
|
Análisis guardado exitosamente: |
|
- Usuario: {username} |
|
- ID: {result.inserted_id} |
|
- Longitud del texto: {len(text)} |
|
- Métricas: {formatted_metrics} |
|
""") |
|
|
|
|
|
if verify_storage(username): |
|
logger.info("Verificación de almacenamiento exitosa") |
|
return True |
|
else: |
|
logger.warning("Verificación de almacenamiento falló") |
|
return False |
|
|
|
logger.error("No se pudo insertar el documento") |
|
return False |
|
|
|
except Exception as e: |
|
logger.error(f"Error guardando análisis de situación actual: {str(e)}") |
|
return False |
|
|
|
def verify_storage(username): |
|
""" |
|
Verifica que los datos se están guardando correctamente. |
|
""" |
|
try: |
|
collection = get_collection(COLLECTION_NAME) |
|
if collection is None: |
|
logger.error("No se pudo obtener la colección para verificación") |
|
return False |
|
|
|
|
|
timestamp_threshold = (datetime.now(timezone.utc) - timedelta(minutes=5)).isoformat() |
|
|
|
recent_docs = collection.find({ |
|
'username': username, |
|
'timestamp': {'$gte': timestamp_threshold} |
|
}).sort('timestamp', -1).limit(1) |
|
|
|
docs = list(recent_docs) |
|
if docs: |
|
logger.info(f""" |
|
Último documento guardado: |
|
- ID: {docs[0]['_id']} |
|
- Timestamp: {docs[0]['timestamp']} |
|
- Métricas guardadas: {bool(docs[0].get('metrics'))} |
|
""") |
|
return True |
|
|
|
logger.warning(f"No se encontraron documentos recientes para {username}") |
|
return False |
|
|
|
except Exception as e: |
|
logger.error(f"Error verificando almacenamiento: {str(e)}") |
|
return False |
|
|
|
def get_recent_situation_analysis(username, limit=5): |
|
""" |
|
Obtiene los análisis más recientes de un usuario. |
|
""" |
|
try: |
|
collection = get_collection(COLLECTION_NAME) |
|
if collection is None: |
|
return [] |
|
|
|
results = collection.find( |
|
{'username': username} |
|
).sort('timestamp', -1).limit(limit) |
|
|
|
return list(results) |
|
|
|
except Exception as e: |
|
logger.error(f"Error obteniendo análisis recientes: {str(e)}") |
|
return [] |