AIdeaText commited on
Commit
1e9acd5
·
verified ·
1 Parent(s): a5fb792

Update modules/database/morphosyntax_iterative_mongo_db.py

Browse files
modules/database/morphosyntax_iterative_mongo_db.py CHANGED
@@ -1,139 +1,159 @@
1
- # modules/database/morphosyntax_iterative_mongo_db.py
2
-
3
  from datetime import datetime, timezone
4
  import logging
 
5
  from .mongo_db import get_collection, insert_document, find_documents, update_document, delete_document
6
 
7
  logger = logging.getLogger(__name__)
8
 
9
- # Nombres de colecciones manteniendo coherencia
10
  BASE_COLLECTION = 'student_morphosyntax_analysis_base'
11
  ITERATION_COLLECTION = 'student_morphosyntax_iterations'
12
 
13
  def store_student_morphosyntax_base(username, text, arc_diagrams):
14
- """Almacena el análisis morfosintáctico base"""
15
  try:
16
  base_document = {
17
- 'username': username, # key principal
18
  'timestamp': datetime.now(timezone.utc).isoformat(),
19
  'text': text,
20
  'arc_diagrams': arc_diagrams,
21
  'analysis_type': 'morphosyntax_base',
22
  'has_iterations': False
23
  }
24
-
25
  collection = get_collection(BASE_COLLECTION)
26
  result = collection.insert_one(base_document)
 
27
  logger.info(f"Análisis base guardado para {username}")
28
- return str(result.inserted_id)
29
-
 
30
  except Exception as e:
31
  logger.error(f"Error almacenando análisis base: {str(e)}")
32
  return None
33
 
34
  def store_student_morphosyntax_iteration(username, base_id, original_text, iteration_text, arc_diagrams):
35
- """Almacena una iteración de análisis morfosintáctico"""
 
 
 
36
  try:
 
 
 
 
37
  iteration_document = {
38
- 'username': username, # key principal
39
- 'base_id': base_id,
40
  'timestamp': datetime.now(timezone.utc).isoformat(),
41
  'original_text': original_text,
42
  'iteration_text': iteration_text,
43
  'arc_diagrams': arc_diagrams,
44
  'analysis_type': 'morphosyntax_iteration'
45
  }
46
-
47
  collection = get_collection(ITERATION_COLLECTION)
48
  result = collection.insert_one(iteration_document)
49
-
50
- # Actualizar documento base
51
  base_collection = get_collection(BASE_COLLECTION)
52
  base_collection.update_one(
53
- {'_id': base_id, 'username': username}, # incluir username en queries
54
  {'$set': {'has_iterations': True}}
55
  )
56
-
57
  logger.info(f"Iteración guardada para {username}, base_id: {base_id}")
58
- return str(result.inserted_id)
59
-
60
  except Exception as e:
61
  logger.error(f"Error almacenando iteración: {str(e)}")
62
  return None
63
 
64
  def get_student_morphosyntax_analysis(username, limit=10):
65
  """
66
- Obtiene los análisis base y sus iteraciones
67
- Returns: Lista de análisis con sus iteraciones
68
  """
69
  try:
70
- # Obtener análisis base
71
  base_collection = get_collection(BASE_COLLECTION)
72
  base_query = {
73
  "username": username,
74
  "analysis_type": "morphosyntax_base"
75
  }
76
- base_analyses = list(base_collection.find(base_query).sort("timestamp", -1).limit(limit))
77
-
 
 
78
  # Para cada análisis base, obtener sus iteraciones
79
  iteration_collection = get_collection(ITERATION_COLLECTION)
80
  for analysis in base_analyses:
81
  base_id = analysis['_id']
82
- iterations = list(iteration_collection.find({"base_id": base_id}).sort("timestamp", -1))
 
 
 
83
  analysis['iterations'] = iterations
84
-
85
  return base_analyses
86
-
87
  except Exception as e:
88
  logger.error(f"Error obteniendo análisis: {str(e)}")
89
  return []
90
 
91
  def update_student_morphosyntax_analysis(analysis_id, is_base, update_data):
92
  """
93
- Actualiza un análisis base o iteración
 
94
  """
 
 
95
  try:
96
  collection_name = BASE_COLLECTION if is_base else ITERATION_COLLECTION
97
  collection = get_collection(collection_name)
98
-
 
 
 
99
  query = {"_id": analysis_id}
100
  update = {"$set": update_data}
101
-
102
  result = update_document(collection_name, query, update)
103
  return result
104
-
105
  except Exception as e:
106
  logger.error(f"Error actualizando análisis: {str(e)}")
107
  return False
108
 
109
  def delete_student_morphosyntax_analysis(analysis_id, is_base):
110
  """
111
- Elimina un análisis base o iteración
112
- Si es base, también elimina todas sus iteraciones
113
  """
 
 
114
  try:
 
 
 
115
  if is_base:
116
- # Primero eliminar todas las iteraciones
117
  iteration_collection = get_collection(ITERATION_COLLECTION)
118
  iteration_collection.delete_many({"base_id": analysis_id})
119
-
120
  # Luego eliminar el análisis base
121
  collection = get_collection(BASE_COLLECTION)
122
  else:
123
  collection = get_collection(ITERATION_COLLECTION)
124
-
125
  query = {"_id": analysis_id}
126
  result = delete_document(collection.name, query)
127
  return result
128
-
129
  except Exception as e:
130
  logger.error(f"Error eliminando análisis: {str(e)}")
131
  return False
132
 
133
  def get_student_morphosyntax_data(username):
134
  """
135
- Obtiene todos los datos de análisis morfosintáctico de un estudiante
136
- Returns: Diccionario con todos los análisis y sus iteraciones
137
  """
138
  try:
139
  analyses = get_student_morphosyntax_analysis(username, limit=None)
@@ -142,7 +162,7 @@ def get_student_morphosyntax_data(username):
142
  'total_analyses': len(analyses),
143
  'has_iterations': any(a.get('has_iterations', False) for a in analyses)
144
  }
145
-
146
  except Exception as e:
147
  logger.error(f"Error obteniendo datos del estudiante: {str(e)}")
148
- return {'entries': [], 'total_analyses': 0, 'has_iterations': False}
 
 
 
1
  from datetime import datetime, timezone
2
  import logging
3
+ from bson import ObjectId # <--- Importar ObjectId
4
  from .mongo_db import get_collection, insert_document, find_documents, update_document, delete_document
5
 
6
  logger = logging.getLogger(__name__)
7
 
 
8
  BASE_COLLECTION = 'student_morphosyntax_analysis_base'
9
  ITERATION_COLLECTION = 'student_morphosyntax_iterations'
10
 
11
  def store_student_morphosyntax_base(username, text, arc_diagrams):
12
+ """Almacena el análisis morfosintáctico base y retorna su ObjectId."""
13
  try:
14
  base_document = {
15
+ 'username': username,
16
  'timestamp': datetime.now(timezone.utc).isoformat(),
17
  'text': text,
18
  'arc_diagrams': arc_diagrams,
19
  'analysis_type': 'morphosyntax_base',
20
  'has_iterations': False
21
  }
 
22
  collection = get_collection(BASE_COLLECTION)
23
  result = collection.insert_one(base_document)
24
+
25
  logger.info(f"Análisis base guardado para {username}")
26
+ # Retornamos el ObjectId directamente (NO str)
27
+ return result.inserted_id
28
+
29
  except Exception as e:
30
  logger.error(f"Error almacenando análisis base: {str(e)}")
31
  return None
32
 
33
  def store_student_morphosyntax_iteration(username, base_id, original_text, iteration_text, arc_diagrams):
34
+ """
35
+ Almacena una iteración de análisis morfosintáctico.
36
+ base_id: ObjectId de la base (o string convertible a ObjectId).
37
+ """
38
  try:
39
+ # Convertir a ObjectId si viene como string
40
+ if isinstance(base_id, str):
41
+ base_id = ObjectId(base_id)
42
+
43
  iteration_document = {
44
+ 'username': username,
45
+ 'base_id': base_id, # Guardar el ObjectId en la iteración
46
  'timestamp': datetime.now(timezone.utc).isoformat(),
47
  'original_text': original_text,
48
  'iteration_text': iteration_text,
49
  'arc_diagrams': arc_diagrams,
50
  'analysis_type': 'morphosyntax_iteration'
51
  }
 
52
  collection = get_collection(ITERATION_COLLECTION)
53
  result = collection.insert_one(iteration_document)
54
+
55
+ # Actualizar documento base (usando ObjectId)
56
  base_collection = get_collection(BASE_COLLECTION)
57
  base_collection.update_one(
58
+ {'_id': base_id, 'username': username},
59
  {'$set': {'has_iterations': True}}
60
  )
61
+
62
  logger.info(f"Iteración guardada para {username}, base_id: {base_id}")
63
+ return result.inserted_id # Retornar el ObjectId de la iteración
64
+
65
  except Exception as e:
66
  logger.error(f"Error almacenando iteración: {str(e)}")
67
  return None
68
 
69
  def get_student_morphosyntax_analysis(username, limit=10):
70
  """
71
+ Obtiene los análisis base y sus iteraciones.
72
+ Returns: Lista de análisis con sus iteraciones.
73
  """
74
  try:
 
75
  base_collection = get_collection(BASE_COLLECTION)
76
  base_query = {
77
  "username": username,
78
  "analysis_type": "morphosyntax_base"
79
  }
80
+ base_analyses = list(
81
+ base_collection.find(base_query).sort("timestamp", -1).limit(limit)
82
+ )
83
+
84
  # Para cada análisis base, obtener sus iteraciones
85
  iteration_collection = get_collection(ITERATION_COLLECTION)
86
  for analysis in base_analyses:
87
  base_id = analysis['_id']
88
+ # Buscar iteraciones con base_id = ObjectId
89
+ iterations = list(
90
+ iteration_collection.find({"base_id": base_id}).sort("timestamp", -1)
91
+ )
92
  analysis['iterations'] = iterations
93
+
94
  return base_analyses
95
+
96
  except Exception as e:
97
  logger.error(f"Error obteniendo análisis: {str(e)}")
98
  return []
99
 
100
  def update_student_morphosyntax_analysis(analysis_id, is_base, update_data):
101
  """
102
+ Actualiza un análisis base o iteración.
103
+ analysis_id puede ser un ObjectId o string.
104
  """
105
+ from bson import ObjectId
106
+
107
  try:
108
  collection_name = BASE_COLLECTION if is_base else ITERATION_COLLECTION
109
  collection = get_collection(collection_name)
110
+
111
+ if isinstance(analysis_id, str):
112
+ analysis_id = ObjectId(analysis_id)
113
+
114
  query = {"_id": analysis_id}
115
  update = {"$set": update_data}
116
+
117
  result = update_document(collection_name, query, update)
118
  return result
119
+
120
  except Exception as e:
121
  logger.error(f"Error actualizando análisis: {str(e)}")
122
  return False
123
 
124
  def delete_student_morphosyntax_analysis(analysis_id, is_base):
125
  """
126
+ Elimina un análisis base o iteración.
127
+ Si es base, también elimina todas sus iteraciones.
128
  """
129
+ from bson import ObjectId
130
+
131
  try:
132
+ if isinstance(analysis_id, str):
133
+ analysis_id = ObjectId(analysis_id)
134
+
135
  if is_base:
136
+ # Eliminar iteraciones vinculadas
137
  iteration_collection = get_collection(ITERATION_COLLECTION)
138
  iteration_collection.delete_many({"base_id": analysis_id})
139
+
140
  # Luego eliminar el análisis base
141
  collection = get_collection(BASE_COLLECTION)
142
  else:
143
  collection = get_collection(ITERATION_COLLECTION)
144
+
145
  query = {"_id": analysis_id}
146
  result = delete_document(collection.name, query)
147
  return result
148
+
149
  except Exception as e:
150
  logger.error(f"Error eliminando análisis: {str(e)}")
151
  return False
152
 
153
  def get_student_morphosyntax_data(username):
154
  """
155
+ Obtiene todos los datos de análisis morfosintáctico de un estudiante.
156
+ Returns: Diccionario con todos los análisis y sus iteraciones.
157
  """
158
  try:
159
  analyses = get_student_morphosyntax_analysis(username, limit=None)
 
162
  'total_analyses': len(analyses),
163
  'has_iterations': any(a.get('has_iterations', False) for a in analyses)
164
  }
165
+
166
  except Exception as e:
167
  logger.error(f"Error obteniendo datos del estudiante: {str(e)}")
168
+ return {'entries': [], 'total_analyses': 0, 'has_iterations': False}