File size: 6,442 Bytes
2ee7bf6 b595026 2ee7bf6 b595026 2ee7bf6 1fb91b8 2ee7bf6 d695864 2ee7bf6 b595026 1fb91b8 b595026 1fb91b8 2ee7bf6 1fb91b8 2ee7bf6 1fb91b8 b595026 4038b34 1fb91b8 2ee7bf6 1fb91b8 2ee7bf6 ae58da9 d695864 ae58da9 b595026 38e4932 1fb91b8 ae58da9 1fb91b8 38e4932 1fb91b8 b595026 1fb91b8 b595026 38e4932 b595026 1fb91b8 ae58da9 1fb91b8 ae58da9 c3bd04c 2ee7bf6 bc146d8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# modules/database/discourse_mongo_db.py
import base64
import logging
from datetime import datetime, timezone
from ..database.mongo_db import get_collection, insert_document, find_documents
logger = logging.getLogger(__name__)
COLLECTION_NAME = 'student_discourse_analysis'
########################################################################
def store_student_discourse_result(username, text1, text2, analysis_result):
"""
Guarda el resultado del análisis de discurso en MongoDB.
"""
try:
# Verificar que el resultado sea válido
if not analysis_result.get('success', False):
logger.error("No se puede guardar un análisis fallido")
return False
logger.info(f"Almacenando análisis de discurso para {username}")
# Preparar el documento para MongoDB
document = {
'username': username,
'timestamp': datetime.now(timezone.utc).isoformat(),
'text1': text1,
'text2': text2,
'key_concepts1': analysis_result.get('key_concepts1', []),
'key_concepts2': analysis_result.get('key_concepts2', [])
}
# Codificar gráficos a base64 para almacenamiento
for graph_key in ['graph1', 'graph2', 'combined_graph']:
if graph_key in analysis_result and analysis_result[graph_key] is not None:
if isinstance(analysis_result[graph_key], bytes):
logger.info(f"Codificando {graph_key} como base64")
document[graph_key] = base64.b64encode(analysis_result[graph_key]).decode('utf-8')
logger.info(f"{graph_key} codificado correctamente, longitud: {len(document[graph_key])}")
else:
logger.warning(f"{graph_key} no es de tipo bytes, es: {type(analysis_result[graph_key])}")
else:
logger.info(f"{graph_key} no presente en el resultado del análisis")
# Almacenar el documento en MongoDB
collection = get_collection(COLLECTION_NAME)
if collection is None: # CORREGIDO: Usar 'is None' en lugar de valor booleano
logger.error("No se pudo obtener la colección")
return False
result = collection.insert_one(document)
logger.info(f"Análisis de discurso guardado con ID: {result.inserted_id}")
return True
except Exception as e:
logger.error(f"Error guardando análisis de discurso: {str(e)}")
return False
#################################################################################
# Corrección 1: Actualizar get_student_discourse_analysis para recuperar todos los campos necesarios
def get_student_discourse_analysis(username, limit=10):
"""
Recupera los análisis del discurso de un estudiante.
"""
try:
logger.info(f"Recuperando análisis de discurso para {username}")
collection = get_collection(COLLECTION_NAME)
if collection is None:
logger.error("No se pudo obtener la colección")
return []
query = {"username": username}
documents = list(collection.find(query).sort("timestamp", -1).limit(limit))
logger.info(f"Recuperados {len(documents)} documentos de análisis de discurso")
# Decodificar gráficos para uso en la aplicación
for doc in documents:
for graph_key in ['graph1', 'graph2', 'combined_graph']:
if graph_key in doc and doc[graph_key]:
try:
# Verificar si es string (base64) y decodificar
if isinstance(doc[graph_key], str):
logger.info(f"Decodificando {graph_key} de base64 a bytes")
doc[graph_key] = base64.b64decode(doc[graph_key])
logger.info(f"{graph_key} decodificado correctamente, tamaño: {len(doc[graph_key])} bytes")
elif not isinstance(doc[graph_key], bytes):
logger.warning(f"{graph_key} no es ni string ni bytes: {type(doc[graph_key])}")
except Exception as decode_error:
logger.error(f"Error decodificando {graph_key}: {str(decode_error)}")
doc[graph_key] = None
return documents
except Exception as e:
logger.error(f"Error recuperando análisis de discurso: {str(e)}")
return []
#####################################################################################
def get_student_discourse_data(username):
"""
Obtiene un resumen de los análisis del discurso de un estudiante.
"""
try:
analyses = get_student_discourse_analysis(username, limit=None)
formatted_analyses = []
for analysis in analyses:
formatted_analysis = {
'timestamp': analysis['timestamp'],
'text1': analysis.get('text1', ''),
'text2': analysis.get('text2', ''),
'key_concepts1': analysis.get('key_concepts1', []),
'key_concepts2': analysis.get('key_concepts2', [])
}
formatted_analyses.append(formatted_analysis)
return {'entries': formatted_analyses}
except Exception as e:
logger.error(f"Error al obtener datos del discurso: {str(e)}")
return {'entries': []}
###########################################################################
def update_student_discourse_analysis(analysis_id, update_data):
"""
Actualiza un análisis del discurso existente.
"""
try:
query = {"_id": analysis_id}
update = {"$set": update_data}
return update_document(COLLECTION_NAME, query, update)
except Exception as e:
logger.error(f"Error al actualizar análisis del discurso: {str(e)}")
return False
###########################################################################
def delete_student_discourse_analysis(analysis_id):
"""
Elimina un análisis del discurso.
"""
try:
query = {"_id": analysis_id}
return delete_document(COLLECTION_NAME, query)
except Exception as e:
logger.error(f"Error al eliminar análisis del discurso: {str(e)}")
return False |