File size: 5,767 Bytes
2ee7bf6 1fb91b8 2ee7bf6 d695864 2ee7bf6 1fb91b8 2ee7bf6 1fb91b8 2ee7bf6 1fb91b8 2ee7bf6 1fb91b8 2ee7bf6 ae58da9 d695864 ae58da9 1fb91b8 ae58da9 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 153 154 |
# modules/database/discourse_mongo_db.py
# Importaciones estándar
import io
import base64
from datetime import datetime, timezone
import logging
# Importaciones de terceros
import matplotlib.pyplot as plt
from .mongo_db import (
get_collection,
insert_document,
find_documents,
update_document,
delete_document
)
# Configuración del logger
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 contenga bytes de gráficos
if not analysis_result.get('success', False):
logger.error("No se puede guardar un análisis fallido")
return False
# 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
if 'graph1' in analysis_result and isinstance(analysis_result['graph1'], bytes):
document['graph1'] = base64.b64encode(analysis_result['graph1']).decode('utf-8')
if 'graph2' in analysis_result and isinstance(analysis_result['graph2'], bytes):
document['graph2'] = base64.b64encode(analysis_result['graph2']).decode('utf-8')
# Crear un gráfico combinado si se desea (opcional)
if 'graph1' in document and 'graph2' in document:
document['combined_graph'] = document['graph1'] # O alguna combinación
# Guardar en MongoDB
collection = get_collection('student_discourse_analysis')
if not collection:
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:
collection = get_collection('student_discourse_analysis')
if not collection:
logger.error("No se pudo obtener la colección")
return []
query = {"username": username}
documents = list(collection.find(query).sort("timestamp", -1).limit(limit))
# Decodificar gráficos de base64 a bytes
for doc in documents:
try:
if 'graph1' in doc and doc['graph1']:
doc['graph1'] = base64.b64decode(doc['graph1'])
if 'graph2' in doc and doc['graph2']:
doc['graph2'] = base64.b64decode(doc['graph2'])
if 'combined_graph' in doc and doc['combined_graph']:
doc['combined_graph'] = base64.b64decode(doc['combined_graph'])
except Exception as decode_error:
logger.error(f"Error decodificando gráficos: {str(decode_error)}")
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 |