Spaces:
AIdeaText
/
Running on CPU Upgrade

AIdeaText commited on
Commit
455af65
·
verified ·
1 Parent(s): c7d5c40

Update modules/database/discourse_mongo_db.py

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