# modules/database/current_situation_mongo_db.py 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: # Verificar parámetros 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 # Formatear métricas para MongoDB 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'] } } # Crear documento document = { 'username': username, 'timestamp': datetime.now(timezone.utc).isoformat(), 'text': text, 'metrics': formatted_metrics, # Usar las métricas formateadas 'feedback': feedback, 'analysis_type': 'current_situation' } # Insertar documento 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} """) # Verificar almacenamiento 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 # Buscar documentos recientes del usuario 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 []