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