AIdeaText commited on
Commit
a5d8590
·
verified ·
1 Parent(s): 635ddb6

Update modules/database/semantic_mongo_db.py

Browse files
Files changed (1) hide show
  1. modules/database/semantic_mongo_db.py +160 -159
modules/database/semantic_mongo_db.py CHANGED
@@ -1,160 +1,161 @@
1
- #/modules/database/semantic_mongo_db.py
2
-
3
- # Importaciones estándar
4
- import io
5
- import base64
6
- from datetime import datetime, timezone
7
- import logging
8
-
9
- # Importaciones de terceros
10
- import matplotlib.pyplot as plt
11
-
12
- # Importaciones locales
13
- from .mongo_db import (
14
- get_collection,
15
- insert_document,
16
- find_documents,
17
- update_document,
18
- delete_document
19
- )
20
-
21
- # Configuración del logger
22
- logger = logging.getLogger(__name__) # Cambiado de name a __name__
23
- COLLECTION_NAME = 'student_semantic_analysis'
24
-
25
- def store_student_semantic_result(username, text, analysis_result):
26
- """
27
- Guarda el resultado del análisis semántico en MongoDB.
28
- """
29
- try:
30
- # El gráfico ya viene en bytes, solo necesitamos codificarlo a base64
31
- concept_graph_data = None
32
- if 'concept_graph' in analysis_result and analysis_result['concept_graph'] is not None:
33
- try:
34
- # Ya está en bytes, solo codificar a base64
35
- concept_graph_data = base64.b64encode(analysis_result['concept_graph']).decode('utf-8')
36
- except Exception as e:
37
- logger.error(f"Error al codificar gráfico conceptual: {str(e)}")
38
-
39
- # Crear documento para MongoDB
40
- analysis_document = {
41
- 'username': username,
42
- 'timestamp': datetime.now(timezone.utc).isoformat(),
43
- 'text': text,
44
- 'analysis_type': 'semantic',
45
- 'key_concepts': analysis_result.get('key_concepts', []),
46
- 'concept_graph': concept_graph_data
47
- }
48
-
49
- # Insertar en MongoDB
50
- result = insert_document(COLLECTION_NAME, analysis_document)
51
- if result:
52
- logger.info(f"Análisis semántico guardado con ID: {result} para el usuario: {username}")
53
- return True
54
-
55
- logger.error("No se pudo insertar el documento en MongoDB")
56
- return False
57
-
58
- except Exception as e:
59
- logger.error(f"Error al guardar el análisis semántico: {str(e)}")
60
- return False
61
-
62
- ####################################################################################
63
- def get_student_semantic_analysis(username, limit=10):
64
- """
65
- Recupera los análisis semánticos de un estudiante.
66
- """
67
- try:
68
- # Obtener la colección
69
- collection = get_collection(COLLECTION_NAME)
70
- if collection is None: # Cambiado de if not collection a if collection is None
71
- logger.error("No se pudo obtener la colección semantic")
72
- return []
73
-
74
- # Consulta
75
- query = {
76
- "username": username,
77
- "analysis_type": "semantic"
78
- }
79
-
80
- # Campos a recuperar
81
- projection = {
82
- "timestamp": 1,
83
- "concept_graph": 1,
84
- "_id": 1
85
- }
86
-
87
- # Ejecutar consulta
88
- try:
89
- cursor = collection.find(query, projection).sort("timestamp", -1)
90
- if limit:
91
- cursor = cursor.limit(limit)
92
-
93
- # Convertir cursor a lista
94
- results = list(cursor)
95
- logger.info(f"Recuperados {len(results)} análisis semánticos para {username}")
96
- return results
97
-
98
- except Exception as db_error:
99
- logger.error(f"Error en la consulta a MongoDB: {str(db_error)}")
100
- return []
101
-
102
- except Exception as e:
103
- logger.error(f"Error recuperando análisis semántico: {str(e)}")
104
- return []
105
- ####################################################################################################
106
-
107
-
108
- def update_student_semantic_analysis(analysis_id, update_data):
109
- """
110
- Actualiza un análisis semántico existente.
111
- Args:
112
- analysis_id: ID del análisis a actualizar
113
- update_data: Datos a actualizar
114
- """
115
- query = {"_id": analysis_id}
116
- update = {"$set": update_data}
117
- return update_document(COLLECTION_NAME, query, update)
118
-
119
- def delete_student_semantic_analysis(analysis_id):
120
- """
121
- Elimina un análisis semántico.
122
- Args:
123
- analysis_id: ID del análisis a eliminar
124
- """
125
- query = {"_id": analysis_id}
126
- return delete_document(COLLECTION_NAME, query)
127
-
128
- def get_student_semantic_data(username):
129
- """
130
- Obtiene todos los análisis semánticos de un estudiante.
131
- Args:
132
- username: Nombre del usuario
133
- Returns:
134
- dict: Diccionario con todos los análisis del estudiante
135
- """
136
- analyses = get_student_semantic_analysis(username, limit=None)
137
-
138
- formatted_analyses = []
139
- for analysis in analyses:
140
- formatted_analysis = {
141
- 'timestamp': analysis['timestamp'],
142
- 'text': analysis['text'],
143
- 'key_concepts': analysis['key_concepts'],
144
- 'entities': analysis['entities']
145
- # No incluimos los gráficos en el resumen general
146
- }
147
- formatted_analyses.append(formatted_analysis)
148
-
149
- return {
150
- 'entries': formatted_analyses
151
- }
152
-
153
- # Exportar las funciones necesarias
154
- __all__ = [
155
- 'store_student_semantic_result',
156
- 'get_student_semantic_analysis',
157
- 'update_student_semantic_analysis',
158
- 'delete_student_semantic_analysis',
159
- 'get_student_semantic_data'
 
160
  ]
 
1
+ #/modules/database/semantic_mongo_db.py
2
+
3
+ # Importaciones estándar
4
+ import io
5
+ import base64
6
+ from datetime import datetime, timezone
7
+ import logging
8
+
9
+ # Importaciones de terceros
10
+ import matplotlib.pyplot as plt
11
+
12
+ # Importaciones locales
13
+ from .mongo_db import (
14
+ get_collection,
15
+ insert_document,
16
+ find_documents,
17
+ update_document,
18
+ delete_document
19
+ )
20
+
21
+ # Configuración del logger
22
+ logger = logging.getLogger(__name__) # Cambiado de name a __name__
23
+ COLLECTION_NAME = 'student_semantic_analysis'
24
+
25
+ def store_student_semantic_result(username, text, analysis_result):
26
+ """
27
+ Guarda el resultado del análisis semántico en MongoDB.
28
+ """
29
+ try:
30
+ # El gráfico ya viene en bytes, solo necesitamos codificarlo a base64
31
+ concept_graph_data = None
32
+ if 'concept_graph' in analysis_result and analysis_result['concept_graph'] is not None:
33
+ try:
34
+ # Ya está en bytes, solo codificar a base64
35
+ concept_graph_data = base64.b64encode(analysis_result['concept_graph']).decode('utf-8')
36
+ except Exception as e:
37
+ logger.error(f"Error al codificar gráfico conceptual: {str(e)}")
38
+
39
+ # Crear documento para MongoDB
40
+ analysis_document = {
41
+ 'username': username,
42
+ 'timestamp': datetime.now(timezone.utc).isoformat(),
43
+ 'text': text,
44
+ 'analysis_type': 'semantic',
45
+ 'key_concepts': analysis_result.get('key_concepts', []),
46
+ 'concept_graph': concept_graph_data
47
+ }
48
+
49
+ # Insertar en MongoDB
50
+ # Verificar explícitamente el resultado
51
+ if result and '_id' in result:
52
+ logger.info(f"Análisis semántico guardado con ID: {result['_id']} para el usuario: {username}")
53
+ return True
54
+
55
+ # Si llegamos aquí, algo salió mal con la inserción
56
+ logger.error(f"No se pudo insertar el documento en MongoDB: {result}")
57
+ return False
58
+
59
+ except Exception as e:
60
+ logger.error(f"Error al guardar el análisis semántico: {str(e)}")
61
+ return False
62
+
63
+ ####################################################################################
64
+ def get_student_semantic_analysis(username, limit=10):
65
+ """
66
+ Recupera los análisis semánticos de un estudiante.
67
+ """
68
+ try:
69
+ # Obtener la colección
70
+ collection = get_collection(COLLECTION_NAME)
71
+ if collection is None: # Cambiado de if not collection a if collection is None
72
+ logger.error("No se pudo obtener la colección semantic")
73
+ return []
74
+
75
+ # Consulta
76
+ query = {
77
+ "username": username,
78
+ "analysis_type": "semantic"
79
+ }
80
+
81
+ # Campos a recuperar
82
+ projection = {
83
+ "timestamp": 1,
84
+ "concept_graph": 1,
85
+ "_id": 1
86
+ }
87
+
88
+ # Ejecutar consulta
89
+ try:
90
+ cursor = collection.find(query, projection).sort("timestamp", -1)
91
+ if limit:
92
+ cursor = cursor.limit(limit)
93
+
94
+ # Convertir cursor a lista
95
+ results = list(cursor)
96
+ logger.info(f"Recuperados {len(results)} análisis semánticos para {username}")
97
+ return results
98
+
99
+ except Exception as db_error:
100
+ logger.error(f"Error en la consulta a MongoDB: {str(db_error)}")
101
+ return []
102
+
103
+ except Exception as e:
104
+ logger.error(f"Error recuperando análisis semántico: {str(e)}")
105
+ return []
106
+ ####################################################################################################
107
+
108
+
109
+ def update_student_semantic_analysis(analysis_id, update_data):
110
+ """
111
+ Actualiza un análisis semántico existente.
112
+ Args:
113
+ analysis_id: ID del análisis a actualizar
114
+ update_data: Datos a actualizar
115
+ """
116
+ query = {"_id": analysis_id}
117
+ update = {"$set": update_data}
118
+ return update_document(COLLECTION_NAME, query, update)
119
+
120
+ def delete_student_semantic_analysis(analysis_id):
121
+ """
122
+ Elimina un análisis semántico.
123
+ Args:
124
+ analysis_id: ID del análisis a eliminar
125
+ """
126
+ query = {"_id": analysis_id}
127
+ return delete_document(COLLECTION_NAME, query)
128
+
129
+ def get_student_semantic_data(username):
130
+ """
131
+ Obtiene todos los análisis semánticos de un estudiante.
132
+ Args:
133
+ username: Nombre del usuario
134
+ Returns:
135
+ dict: Diccionario con todos los análisis del estudiante
136
+ """
137
+ analyses = get_student_semantic_analysis(username, limit=None)
138
+
139
+ formatted_analyses = []
140
+ for analysis in analyses:
141
+ formatted_analysis = {
142
+ 'timestamp': analysis['timestamp'],
143
+ 'text': analysis['text'],
144
+ 'key_concepts': analysis['key_concepts'],
145
+ 'entities': analysis['entities']
146
+ # No incluimos los gráficos en el resumen general
147
+ }
148
+ formatted_analyses.append(formatted_analysis)
149
+
150
+ return {
151
+ 'entries': formatted_analyses
152
+ }
153
+
154
+ # Exportar las funciones necesarias
155
+ __all__ = [
156
+ 'store_student_semantic_result',
157
+ 'get_student_semantic_analysis',
158
+ 'update_student_semantic_analysis',
159
+ 'delete_student_semantic_analysis',
160
+ 'get_student_semantic_data'
161
  ]