AIdeaText commited on
Commit
8232326
verified
1 Parent(s): 08564de

Update modules/database/sql_db.py

Browse files
Files changed (1) hide show
  1. modules/database/sql_db.py +83 -59
modules/database/sql_db.py CHANGED
@@ -1,4 +1,4 @@
1
- #modules/database/sql_db.py
2
 
3
  from .database_init import get_container
4
  from datetime import datetime, timezone
@@ -8,30 +8,36 @@ import uuid
8
 
9
  logger = logging.getLogger(__name__)
10
 
 
11
  def get_user(username, role=None):
12
  container = get_container("users")
13
  try:
14
  query = f"SELECT * FROM c WHERE c.id = '{username}'"
15
  if role:
16
  query += f" AND c.role = '{role}'"
17
- items = list(container.query_items(
18
- query=query,
19
- enable_cross_partition_query=True
20
- ))
21
  return items[0] if items else None
22
  except Exception as e:
23
  logger.error(f"Error al obtener usuario {username}: {str(e)}")
24
  return None
25
 
 
 
26
  def get_admin_user(username):
27
  return get_user(username, role='Administrador')
28
 
 
 
29
  def get_student_user(username):
30
  return get_user(username, role='Estudiante')
31
 
 
 
32
  def get_teacher_user(username):
33
  return get_user(username, role='Profesor')
34
 
 
 
35
  def create_user(username, password, role, additional_info=None):
36
  """Crea un nuevo usuario"""
37
  container = get_container("users")
@@ -45,13 +51,12 @@ def create_user(username, password, role, additional_info=None):
45
  'password': password,
46
  'role': role,
47
  'timestamp': datetime.now(timezone.utc).isoformat(),
48
- 'additional_info': additional_info or {}
 
49
  }
50
 
51
- container.create_item(
52
- body=user_data,
53
- partition_key=username
54
- )
55
  logger.info(f"Usuario {role} creado: {username}")
56
  return True
57
 
@@ -59,19 +64,19 @@ def create_user(username, password, role, additional_info=None):
59
  logger.error(f"Error al crear usuario {role}: {str(e)}")
60
  return False
61
 
 
62
  def create_student_user(username, password, additional_info=None):
63
  return create_user(username, password, 'Estudiante', additional_info)
64
 
 
65
  def create_teacher_user(username, password, additional_info=None):
66
  return create_user(username, password, 'Profesor', additional_info)
67
 
 
68
  def create_admin_user(username, password, additional_info=None):
69
  return create_user(username, password, 'Administrador', additional_info)
70
 
71
- ############-- Funciones de control del tiempo de sesi贸n ##################
72
-
73
- ###########################################################
74
-
75
  def record_login(username):
76
  """Registra el inicio de sesi贸n de un usuario"""
77
  try:
@@ -87,24 +92,17 @@ def record_login(username):
87
  "username": username,
88
  "loginTime": datetime.now(timezone.utc).isoformat(),
89
  "additional_info": {},
90
- # El campo para partition key debe estar en el documento
91
  "partitionKey": username
92
  }
93
 
94
- # Crear el documento usando options
95
- result = container.create_item(
96
- body=session_doc,
97
- enable_cross_partition_query=True
98
- )
99
  logger.info(f"Sesi贸n {session_id} registrada para {username}")
100
  return session_id
101
  except Exception as e:
102
  logger.error(f"Error registrando login: {str(e)}")
103
  return None
104
 
105
-
106
- ###########################################################
107
-
108
  def record_logout(username, session_id):
109
  """Registra el cierre de sesi贸n y calcula la duraci贸n"""
110
  try:
@@ -113,7 +111,6 @@ def record_logout(username, session_id):
113
  logger.error("No se pudo obtener el contenedor users_sessions")
114
  return False
115
 
116
- # Obtener la sesi贸n actual
117
  query = "SELECT * FROM c WHERE c.id = @id AND c.username = @username"
118
  params = [
119
  {"name": "@id", "value": session_id},
@@ -122,8 +119,7 @@ def record_logout(username, session_id):
122
 
123
  items = list(container.query_items(
124
  query=query,
125
- parameters=params,
126
- enable_cross_partition_query=True
127
  ))
128
 
129
  if not items:
@@ -137,22 +133,18 @@ def record_logout(username, session_id):
137
 
138
  session.update({
139
  "logoutTime": logout_time.isoformat(),
140
- "sessionDuration": duration
 
141
  })
142
 
143
- # Actualizar el documento
144
- container.upsert_item(
145
- body=session
146
- )
147
  logger.info(f"Sesi贸n {session_id} cerrada para {username}, duraci贸n: {duration}s")
148
  return True
149
  except Exception as e:
150
  logger.error(f"Error registrando logout: {str(e)}")
151
  return False
152
 
153
-
154
- ###########################################################
155
-
156
  def get_recent_sessions(limit=10):
157
  """Obtiene las sesiones m谩s recientes"""
158
  try:
@@ -171,11 +163,9 @@ def get_recent_sessions(limit=10):
171
 
172
  sessions = list(container.query_items(
173
  query=query,
174
- parameters=[{"name": "@limit", "value": limit}],
175
- enable_cross_partition_query=True
176
  ))
177
 
178
- # Validar y limpiar los datos
179
  clean_sessions = []
180
  for session in sessions:
181
  try:
@@ -194,10 +184,7 @@ def get_recent_sessions(limit=10):
194
  logger.error(f"Error obteniendo sesiones recientes: {str(e)}")
195
  return []
196
 
197
-
198
-
199
- ###########################################################
200
-
201
  def get_user_total_time(username):
202
  """Obtiene el tiempo total que un usuario ha pasado en la plataforma"""
203
  try:
@@ -215,8 +202,7 @@ def get_user_total_time(username):
215
 
216
  result = list(container.query_items(
217
  query=query,
218
- parameters=[{"name": "@username", "value": username}],
219
- enable_cross_partition_query=True
220
  ))
221
 
222
  return result[0] if result and result[0] is not None else 0
@@ -224,14 +210,15 @@ def get_user_total_time(username):
224
  logger.error(f"Error obteniendo tiempo total: {str(e)}")
225
  return 0
226
 
227
- ###########################################################
228
  def update_student_user(username, new_info):
229
- user_container, _, _ = get_sql_containers()
230
  try:
231
  user = get_student_user(username)
232
  if user:
233
  user['additional_info'].update(new_info)
234
- user_container.upsert_item(body=user)
 
235
  logger.info(f"Informaci贸n del estudiante actualizada: {username}")
236
  return True
237
  else:
@@ -241,13 +228,14 @@ def update_student_user(username, new_info):
241
  logger.error(f"Error al actualizar informaci贸n del estudiante {username}: {str(e)}")
242
  return False
243
 
244
-
245
  def delete_student_user(username):
246
- user_container, _, _ = get_sql_containers()
247
  try:
248
  user = get_student_user(username)
249
  if user:
250
- user_container.delete_item(item=user['id'], partition_key=username)
 
251
  logger.info(f"Estudiante eliminado: {username}")
252
  return True
253
  else:
@@ -257,9 +245,18 @@ def delete_student_user(username):
257
  logger.error(f"Error al eliminar estudiante {username}: {str(e)}")
258
  return False
259
 
 
260
  def store_application_request(name, lastname, email, institution, current_role, desired_role, reason):
261
- _, application_requests_container, _ = get_sql_containers()
262
  try:
 
 
 
 
 
 
 
 
263
  application_request = {
264
  "id": str(uuid.uuid4()),
265
  "name": name,
@@ -269,30 +266,57 @@ def store_application_request(name, lastname, email, institution, current_role,
269
  "current_role": current_role,
270
  "desired_role": desired_role,
271
  "reason": reason,
272
- "requestDate": datetime.utcnow().isoformat()
 
 
273
  }
274
- application_requests_container.create_item(body=application_request)
275
- logger.info(f"Solicitud de aplicaci贸n almacenada para el email: {email}")
 
 
 
 
276
  return True
 
277
  except Exception as e:
278
  logger.error(f"Error al almacenar la solicitud de aplicaci贸n: {str(e)}")
 
279
  return False
280
 
 
 
281
  def store_student_feedback(username, name, email, feedback):
282
- _, _, user_feedback_container = get_sql_containers()
283
  try:
 
 
 
 
 
 
 
 
284
  feedback_item = {
285
  "id": str(uuid.uuid4()),
286
- "username": username,
287
  "name": name,
288
  "email": email,
289
  "feedback": feedback,
290
  "role": "Estudiante",
291
- 'timestamp': datetime.now(timezone.utc).isoformat(),
 
292
  }
293
- result = user_feedback_container.create_item(body=feedback_item)
294
- logger.info(f"Feedback de estudiante almacenado con ID: {result['id']} para el usuario: {username}")
 
 
 
 
 
 
295
  return True
 
296
  except Exception as e:
297
- logger.error(f"Error al almacenar el feedback del estudiante {username}: {str(e)}")
 
298
  return False
 
1
+ # modules/database/sql_db.py
2
 
3
  from .database_init import get_container
4
  from datetime import datetime, timezone
 
8
 
9
  logger = logging.getLogger(__name__)
10
 
11
+ #########################################
12
  def get_user(username, role=None):
13
  container = get_container("users")
14
  try:
15
  query = f"SELECT * FROM c WHERE c.id = '{username}'"
16
  if role:
17
  query += f" AND c.role = '{role}'"
18
+ items = list(container.query_items(query=query))
 
 
 
19
  return items[0] if items else None
20
  except Exception as e:
21
  logger.error(f"Error al obtener usuario {username}: {str(e)}")
22
  return None
23
 
24
+
25
+ #########################################
26
  def get_admin_user(username):
27
  return get_user(username, role='Administrador')
28
 
29
+
30
+ #########################################
31
  def get_student_user(username):
32
  return get_user(username, role='Estudiante')
33
 
34
+
35
+ #########################################
36
  def get_teacher_user(username):
37
  return get_user(username, role='Profesor')
38
 
39
+
40
+ #########################################
41
  def create_user(username, password, role, additional_info=None):
42
  """Crea un nuevo usuario"""
43
  container = get_container("users")
 
51
  'password': password,
52
  'role': role,
53
  'timestamp': datetime.now(timezone.utc).isoformat(),
54
+ 'additional_info': additional_info or {},
55
+ 'partitionKey': username # Agregar partition key
56
  }
57
 
58
+ # Crear item sin especificar partition_key en el m茅todo
59
+ container.create_item(body=user_data)
 
 
60
  logger.info(f"Usuario {role} creado: {username}")
61
  return True
62
 
 
64
  logger.error(f"Error al crear usuario {role}: {str(e)}")
65
  return False
66
 
67
+ #########################################
68
  def create_student_user(username, password, additional_info=None):
69
  return create_user(username, password, 'Estudiante', additional_info)
70
 
71
+ #########################################
72
  def create_teacher_user(username, password, additional_info=None):
73
  return create_user(username, password, 'Profesor', additional_info)
74
 
75
+ #########################################
76
  def create_admin_user(username, password, additional_info=None):
77
  return create_user(username, password, 'Administrador', additional_info)
78
 
79
+ #########################################
 
 
 
80
  def record_login(username):
81
  """Registra el inicio de sesi贸n de un usuario"""
82
  try:
 
92
  "username": username,
93
  "loginTime": datetime.now(timezone.utc).isoformat(),
94
  "additional_info": {},
 
95
  "partitionKey": username
96
  }
97
 
98
+ result = container.create_item(body=session_doc)
 
 
 
 
99
  logger.info(f"Sesi贸n {session_id} registrada para {username}")
100
  return session_id
101
  except Exception as e:
102
  logger.error(f"Error registrando login: {str(e)}")
103
  return None
104
 
105
+ #########################################
 
 
106
  def record_logout(username, session_id):
107
  """Registra el cierre de sesi贸n y calcula la duraci贸n"""
108
  try:
 
111
  logger.error("No se pudo obtener el contenedor users_sessions")
112
  return False
113
 
 
114
  query = "SELECT * FROM c WHERE c.id = @id AND c.username = @username"
115
  params = [
116
  {"name": "@id", "value": session_id},
 
119
 
120
  items = list(container.query_items(
121
  query=query,
122
+ parameters=params
 
123
  ))
124
 
125
  if not items:
 
133
 
134
  session.update({
135
  "logoutTime": logout_time.isoformat(),
136
+ "sessionDuration": duration,
137
+ "partitionKey": username
138
  })
139
 
140
+ container.upsert_item(body=session)
 
 
 
141
  logger.info(f"Sesi贸n {session_id} cerrada para {username}, duraci贸n: {duration}s")
142
  return True
143
  except Exception as e:
144
  logger.error(f"Error registrando logout: {str(e)}")
145
  return False
146
 
147
+ #########################################
 
 
148
  def get_recent_sessions(limit=10):
149
  """Obtiene las sesiones m谩s recientes"""
150
  try:
 
163
 
164
  sessions = list(container.query_items(
165
  query=query,
166
+ parameters=[{"name": "@limit", "value": limit}]
 
167
  ))
168
 
 
169
  clean_sessions = []
170
  for session in sessions:
171
  try:
 
184
  logger.error(f"Error obteniendo sesiones recientes: {str(e)}")
185
  return []
186
 
187
+ #########################################
 
 
 
188
  def get_user_total_time(username):
189
  """Obtiene el tiempo total que un usuario ha pasado en la plataforma"""
190
  try:
 
202
 
203
  result = list(container.query_items(
204
  query=query,
205
+ parameters=[{"name": "@username", "value": username}]
 
206
  ))
207
 
208
  return result[0] if result and result[0] is not None else 0
 
210
  logger.error(f"Error obteniendo tiempo total: {str(e)}")
211
  return 0
212
 
213
+ #########################################
214
  def update_student_user(username, new_info):
215
+ container = get_container("users")
216
  try:
217
  user = get_student_user(username)
218
  if user:
219
  user['additional_info'].update(new_info)
220
+ user['partitionKey'] = username
221
+ container.upsert_item(body=user)
222
  logger.info(f"Informaci贸n del estudiante actualizada: {username}")
223
  return True
224
  else:
 
228
  logger.error(f"Error al actualizar informaci贸n del estudiante {username}: {str(e)}")
229
  return False
230
 
231
+ #########################################
232
  def delete_student_user(username):
233
+ container = get_container("users")
234
  try:
235
  user = get_student_user(username)
236
  if user:
237
+ # El ID es suficiente para eliminaci贸n ya que partitionKey est谩 en el documento
238
+ container.delete_item(item=user['id'])
239
  logger.info(f"Estudiante eliminado: {username}")
240
  return True
241
  else:
 
245
  logger.error(f"Error al eliminar estudiante {username}: {str(e)}")
246
  return False
247
 
248
+ #########################################
249
  def store_application_request(name, lastname, email, institution, current_role, desired_role, reason):
250
+ """Almacena una solicitud de aplicaci贸n"""
251
  try:
252
+ # Obtener el contenedor usando get_container() que s铆 funciona
253
+ container = get_container("application_requests")
254
+ if not container:
255
+ logger.error("No se pudo obtener el contenedor de solicitudes")
256
+ return False
257
+
258
+ # Crear documento con la solicitud
259
+ # N贸tese que incluimos email como partition key en el cuerpo del documento
260
  application_request = {
261
  "id": str(uuid.uuid4()),
262
  "name": name,
 
266
  "current_role": current_role,
267
  "desired_role": desired_role,
268
  "reason": reason,
269
+ "requestDate": datetime.utcnow().isoformat(),
270
+ # El campo para partition key debe estar en el documento
271
+ "partitionKey": email
272
  }
273
+
274
+ # Crear el item en el contenedor - sin el par谩metro enable_cross_partition_query
275
+ container.create_item(
276
+ body=application_request # Solo pasamos el body
277
+ )
278
+ logger.info(f"Solicitud de aplicaci贸n almacenada para: {email}")
279
  return True
280
+
281
  except Exception as e:
282
  logger.error(f"Error al almacenar la solicitud de aplicaci贸n: {str(e)}")
283
+ logger.error(f"Detalles del error: {str(e)}")
284
  return False
285
 
286
+
287
+ ################################################################
288
  def store_student_feedback(username, name, email, feedback):
289
+ """Almacena el feedback de un estudiante"""
290
  try:
291
+ # Obtener el contenedor - verificar disponibilidad
292
+ logger.info(f"Intentando obtener contenedor user_feedback para usuario: {username}")
293
+ container = get_container("user_feedback")
294
+ if not container:
295
+ logger.error("No se pudo obtener el contenedor user_feedback")
296
+ return False
297
+
298
+ # Crear documento de feedback - asegurar que el username est茅 como partition key
299
  feedback_item = {
300
  "id": str(uuid.uuid4()),
301
+ "username": username, # Campo regular
302
  "name": name,
303
  "email": email,
304
  "feedback": feedback,
305
  "role": "Estudiante",
306
+ "timestamp": datetime.now(timezone.utc).isoformat(),
307
+ "partitionKey": username # Campo de partici贸n
308
  }
309
+
310
+ # Crear el item - sin el par谩metro enable_cross_partition_query
311
+ logger.info(f"Intentando almacenar feedback para usuario: {username}")
312
+ result = container.create_item(
313
+ body=feedback_item # Solo el body, no par谩metros adicionales
314
+ )
315
+
316
+ logger.info(f"Feedback almacenado exitosamente para el usuario: {username}")
317
  return True
318
+
319
  except Exception as e:
320
+ logger.error(f"Error al almacenar el feedback del estudiante {username}")
321
+ logger.error(f"Detalles del error: {str(e)}")
322
  return False