AIdeaText commited on
Commit
d695864
·
verified ·
1 Parent(s): 5b1c944

Update modules/database/discourse_mongo_db.py

Browse files
Files changed (1) hide show
  1. modules/database/discourse_mongo_db.py +53 -100
modules/database/discourse_mongo_db.py CHANGED
@@ -23,96 +23,40 @@ COLLECTION_NAME = 'student_discourse_analysis'
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
- # Verificar qué tipo de objetos son los gráficos para depuración
30
- if 'graph1' in analysis_result:
31
- logger.info(f"Tipo de graph1 recibido: {type(analysis_result['graph1'])}")
32
- if 'graph2' in analysis_result:
33
- logger.info(f"Tipo de graph2 recibido: {type(analysis_result['graph2'])}")
34
- if 'combined_graph' in analysis_result:
35
- logger.info(f"Tipo de combined_graph recibido: {type(analysis_result['combined_graph'])}")
36
-
37
- # Convertir gráficos a bytes o base64 según corresponda
38
  graph1_data = None
39
  graph2_data = None
40
  combined_graph_data = None
41
 
 
42
  if 'graph1' in analysis_result and analysis_result['graph1'] is not None:
43
  try:
44
- # Si es un objeto matplotlib Figure, convertirlo a bytes primero
45
- if hasattr(analysis_result['graph1'], 'savefig'):
46
- logger.info("Convirtiendo graph1 de matplotlib a bytes")
47
- buf = io.BytesIO()
48
- analysis_result['graph1'].savefig(buf, format='png', dpi=100)
49
- buf.seek(0)
50
- graph1_bytes = buf.getvalue()
51
- graph1_data = base64.b64encode(graph1_bytes).decode('utf-8')
52
- # Si ya es bytes, codificarlo directamente
53
- elif isinstance(analysis_result['graph1'], bytes):
54
- logger.info("Codificando graph1 (ya en bytes) a base64")
55
- graph1_data = base64.b64encode(analysis_result['graph1']).decode('utf-8')
56
- # Si ya es una cadena base64, usarla directamente
57
- elif isinstance(analysis_result['graph1'], str):
58
- logger.info("Usando graph1 (ya en string) directamente")
59
- graph1_data = analysis_result['graph1']
60
- # Otro tipo - convertir a string
61
- else:
62
- logger.warning(f"Tipo inesperado para graph1: {type(analysis_result['graph1'])}")
63
- graph1_data = str(analysis_result['graph1'])
64
  except Exception as e:
65
- logger.error(f"Error al procesar gráfico 1: {str(e)}")
66
 
 
67
  if 'graph2' in analysis_result and analysis_result['graph2'] is not None:
68
  try:
69
- # Si es un objeto matplotlib Figure, convertirlo a bytes primero
70
- if hasattr(analysis_result['graph2'], 'savefig'):
71
- logger.info("Convirtiendo graph2 de matplotlib a bytes")
72
- buf = io.BytesIO()
73
- analysis_result['graph2'].savefig(buf, format='png', dpi=100)
74
- buf.seek(0)
75
- graph2_bytes = buf.getvalue()
76
- graph2_data = base64.b64encode(graph2_bytes).decode('utf-8')
77
- # Si ya es bytes, codificarlo directamente
78
- elif isinstance(analysis_result['graph2'], bytes):
79
- logger.info("Codificando graph2 (ya en bytes) a base64")
80
- graph2_data = base64.b64encode(analysis_result['graph2']).decode('utf-8')
81
- # Si ya es una cadena base64, usarla directamente
82
- elif isinstance(analysis_result['graph2'], str):
83
- logger.info("Usando graph2 (ya en string) directamente")
84
- graph2_data = analysis_result['graph2']
85
- # Otro tipo - convertir a string
86
- else:
87
- logger.warning(f"Tipo inesperado para graph2: {type(analysis_result['graph2'])}")
88
- graph2_data = str(analysis_result['graph2'])
89
  except Exception as e:
90
- logger.error(f"Error al procesar gráfico 2: {str(e)}")
91
 
 
92
  if 'combined_graph' in analysis_result and analysis_result['combined_graph'] is not None:
93
  try:
94
- # Si es un objeto matplotlib Figure, convertirlo a bytes primero
95
- if hasattr(analysis_result['combined_graph'], 'savefig'):
96
- logger.info("Convirtiendo combined_graph de matplotlib a bytes")
97
- buf = io.BytesIO()
98
- analysis_result['combined_graph'].savefig(buf, format='png', dpi=100)
99
- buf.seek(0)
100
- combined_graph_bytes = buf.getvalue()
101
- combined_graph_data = base64.b64encode(combined_graph_bytes).decode('utf-8')
102
- # Si ya es bytes, codificarlo directamente
103
- elif isinstance(analysis_result['combined_graph'], bytes):
104
- logger.info("Codificando combined_graph (ya en bytes) a base64")
105
- combined_graph_data = base64.b64encode(analysis_result['combined_graph']).decode('utf-8')
106
- # Si ya es una cadena base64, usarla directamente
107
- elif isinstance(analysis_result['combined_graph'], str):
108
- logger.info("Usando combined_graph (ya en string) directamente")
109
- combined_graph_data = analysis_result['combined_graph']
110
- # Otro tipo - convertir a string
111
- else:
112
- logger.warning(f"Tipo inesperado para combined_graph: {type(analysis_result['combined_graph'])}")
113
- combined_graph_data = str(analysis_result['combined_graph'])
114
  except Exception as e:
115
- logger.error(f"Error al procesar gráfico combinado: {str(e)}")
116
 
117
  # Crear documento para MongoDB
118
  analysis_document = {
@@ -131,7 +75,7 @@ def store_student_discourse_result(username, text1, text2, analysis_result):
131
  # Insertar en MongoDB
132
  result = insert_document(COLLECTION_NAME, analysis_document)
133
  if result:
134
- logger.info(f"Análisis del discurso guardado con ID: {result} para el usuario: {username}")
135
  return True
136
 
137
  logger.error("No se pudo insertar el documento en MongoDB")
@@ -147,7 +91,7 @@ def store_student_discourse_result(username, text1, text2, analysis_result):
147
 
148
  def get_student_discourse_analysis(username, limit=10):
149
  """
150
- Recupera los análisis del discurso de un estudiante, incluyendo todos los gráficos y conceptos.
151
  """
152
  try:
153
  # Obtener la colección
@@ -162,36 +106,45 @@ def get_student_discourse_analysis(username, limit=10):
162
  "analysis_type": "discourse"
163
  }
164
 
165
- # Eliminar la proyección para recuperar todos los campos
166
- # No usar projection para obtener TODOS los campos
167
 
168
  # Ejecutar consulta
169
- try:
170
- cursor = collection.find(query).sort("timestamp", -1)
171
- if limit:
172
- cursor = cursor.limit(limit)
173
-
174
- # Convertir cursor a lista
175
- results = list(cursor)
176
- logger.info(f"Recuperados {len(results)} análisis del discurso para {username}")
177
-
178
- # Verificar qué campos contienen los resultados para depuración
179
- if results:
180
- for result in results:
181
- logger.info(f"Campos disponibles: {list(result.keys())}")
182
- if 'graph1' in result:
183
- logger.info(f"Tipo de graph1: {type(result['graph1'])}")
184
- if 'graph2' in result:
185
- logger.info(f"Tipo de graph2: {type(result['graph2'])}")
186
- if 'combined_graph' in result:
187
- logger.info(f"Tipo de combined_graph: {type(result['combined_graph'])}")
188
 
189
- return results
 
 
 
 
 
 
190
 
191
- except Exception as db_error:
192
- logger.error(f"Error en la consulta a MongoDB: {str(db_error)}")
193
- return []
 
 
 
 
194
 
 
 
195
  except Exception as e:
196
  logger.error(f"Error recuperando análisis del discurso: {str(e)}")
197
  return []
 
23
  ########################################################################
24
  def store_student_discourse_result(username, text1, text2, analysis_result):
25
  """
26
+ Guarda el resultado del análisis de discurso en MongoDB.
27
+ Los gráficos ya deben venir en formato bytes.
28
  """
29
  try:
30
+ logger.info(f"Almacenando análisis de discurso para {username}")
31
+
32
+ # Los gráficos ya vienen en bytes, solo codificar a base64 para almacenamiento
 
 
 
 
 
 
33
  graph1_data = None
34
  graph2_data = None
35
  combined_graph_data = None
36
 
37
+ # Codificar graph1 si existe
38
  if 'graph1' in analysis_result and analysis_result['graph1'] is not None:
39
  try:
40
+ graph1_data = base64.b64encode(analysis_result['graph1']).decode('utf-8')
41
+ logger.info(f"Graph1 codificado en base64 ({len(graph1_data)} caracteres)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  except Exception as e:
43
+ logger.error(f"Error al codificar gráfico 1: {str(e)}")
44
 
45
+ # Codificar graph2 si existe
46
  if 'graph2' in analysis_result and analysis_result['graph2'] is not None:
47
  try:
48
+ graph2_data = base64.b64encode(analysis_result['graph2']).decode('utf-8')
49
+ logger.info(f"Graph2 codificado en base64 ({len(graph2_data)} caracteres)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  except Exception as e:
51
+ logger.error(f"Error al codificar gráfico 2: {str(e)}")
52
 
53
+ # Codificar combined_graph si existe
54
  if 'combined_graph' in analysis_result and analysis_result['combined_graph'] is not None:
55
  try:
56
+ combined_graph_data = base64.b64encode(analysis_result['combined_graph']).decode('utf-8')
57
+ logger.info(f"Combined_graph codificado en base64 ({len(combined_graph_data)} caracteres)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  except Exception as e:
59
+ logger.error(f"Error al codificar gráfico combinado: {str(e)}")
60
 
61
  # Crear documento para MongoDB
62
  analysis_document = {
 
75
  # Insertar en MongoDB
76
  result = insert_document(COLLECTION_NAME, analysis_document)
77
  if result:
78
+ logger.info(f"Análisis del discurso guardado con ID: {result}")
79
  return True
80
 
81
  logger.error("No se pudo insertar el documento en MongoDB")
 
91
 
92
  def get_student_discourse_analysis(username, limit=10):
93
  """
94
+ Recupera los análisis del discurso de un estudiante.
95
  """
96
  try:
97
  # Obtener la colección
 
106
  "analysis_type": "discourse"
107
  }
108
 
109
+ # NO usar projection - recuperar todos los campos
 
110
 
111
  # Ejecutar consulta
112
+ cursor = collection.find(query).sort("timestamp", -1)
113
+ if limit:
114
+ cursor = cursor.limit(limit)
115
+
116
+ # Convertir cursor a lista
117
+ results = list(cursor)
118
+ logger.info(f"Recuperados {len(results)} análisis del discurso para {username}")
119
+
120
+ # Decodificar gráficos de base64 a bytes para su uso en la aplicación
121
+ for result in results:
122
+ # Decodificar graph1
123
+ if 'graph1' in result and result['graph1']:
124
+ try:
125
+ result['graph1'] = base64.b64decode(result['graph1'])
126
+ except Exception as e:
127
+ logger.error(f"Error decodificando graph1: {str(e)}")
128
+ result['graph1'] = None
 
 
129
 
130
+ # Decodificar graph2
131
+ if 'graph2' in result and result['graph2']:
132
+ try:
133
+ result['graph2'] = base64.b64decode(result['graph2'])
134
+ except Exception as e:
135
+ logger.error(f"Error decodificando graph2: {str(e)}")
136
+ result['graph2'] = None
137
 
138
+ # Decodificar combined_graph
139
+ if 'combined_graph' in result and result['combined_graph']:
140
+ try:
141
+ result['combined_graph'] = base64.b64decode(result['combined_graph'])
142
+ except Exception as e:
143
+ logger.error(f"Error decodificando combined_graph: {str(e)}")
144
+ result['combined_graph'] = None
145
 
146
+ return results
147
+
148
  except Exception as e:
149
  logger.error(f"Error recuperando análisis del discurso: {str(e)}")
150
  return []