Akira-Kurusu commited on
Commit
60b260e
·
verified ·
1 Parent(s): 9e62597

Update database.py

Browse files
Files changed (1) hide show
  1. database.py +161 -51
database.py CHANGED
@@ -156,9 +156,169 @@ class DatabaseManager:
156
  print("Factores de riesgo insertados")
157
 
158
  conn.commit()
 
 
 
 
 
 
159
  except Exception as e:
160
  print(f"Error insertando datos por defecto: {e}")
161
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  # ------------------------------------------------------------------ #
163
  # UTILIDADES
164
  # ------------------------------------------------------------------ #
@@ -439,51 +599,6 @@ class DatabaseManager:
439
  finally:
440
  conn.close()
441
 
442
- def get_consultation_by_id(self, consultation_id: int, user_id: int, role: str) -> Optional[Dict]:
443
- """Devuelve una consulta completa con datos del paciente y factores de riesgo.
444
- Los doctores solo pueden ver sus propias consultas."""
445
- conn = self.get_connection()
446
- try:
447
- query = """
448
- SELECT
449
- c.consultationID, c.patientID, c.createdByUserID,
450
- c.diabeticRetinopathy, c.notes, c.consultationDate,
451
- c.imagePath, c.confidence, c.rawOutput,
452
- p.name AS patientName,
453
- p.birthDate AS birthDate,
454
- p.gender AS gender,
455
- p.diabetesType AS diabetesType,
456
- u.username AS doctorName
457
- FROM Consultations c
458
- JOIN Patients p ON c.patientID = p.patientID
459
- JOIN Users u ON c.createdByUserID = u.userID
460
- WHERE c.consultationID = ?
461
- """
462
- params = [consultation_id]
463
- if role != "Admin":
464
- query += " AND c.createdByUserID = ?"
465
- params.append(user_id)
466
-
467
- row = conn.execute(query, params).fetchone()
468
- if not row:
469
- return None
470
-
471
- result = self._serialize(row)
472
-
473
- # Cargar factores de riesgo del paciente
474
- rf_rows = conn.execute(
475
- """SELECT rf.riskFactorID, rf.name, rf.description
476
- FROM RiskFactors rf
477
- JOIN PatientsRiskFactors prf ON rf.riskFactorID = prf.riskFactorID
478
- WHERE prf.patientID = ?""",
479
- (result["patientID"],)
480
- ).fetchall()
481
- result["riskFactors"] = [self._serialize(r) for r in rf_rows]
482
-
483
- return result
484
- finally:
485
- conn.close()
486
-
487
  def get_patient_consultations(self, patient_id: int) -> List[Dict]:
488
  conn = self.get_connection()
489
  try:
@@ -529,12 +644,7 @@ class DatabaseManager:
529
  offset = (page - 1) * per_page
530
 
531
  rows = conn.execute(
532
- f"""SELECT c.*,
533
- p.name AS patientName,
534
- p.birthDate AS birthDate,
535
- p.gender AS gender,
536
- p.diabetesType AS diabetesType,
537
- u.username AS doctorName
538
  {base} {where}
539
  ORDER BY c.consultationDate DESC
540
  LIMIT ? OFFSET ?""",
 
156
  print("Factores de riesgo insertados")
157
 
158
  conn.commit()
159
+
160
+ # Cargar datos de demo si la BD está recién creada (sin pacientes)
161
+ n_patients = conn.execute("SELECT COUNT(*) FROM Patients").fetchone()[0]
162
+ if n_patients == 0:
163
+ self._seed_demo_data(conn)
164
+
165
  except Exception as e:
166
  print(f"Error insertando datos por defecto: {e}")
167
 
168
+ def _seed_demo_data(self, conn):
169
+ """Inserta datos de demostración al arrancar con una BD vacía."""
170
+ import random
171
+ from datetime import datetime, timedelta
172
+
173
+ print("=== Insertando datos de demostración ===")
174
+
175
+ def rand_consult_date(days_max=180):
176
+ days = random.randint(0, days_max)
177
+ hours = random.randint(7, 18)
178
+ mins = random.randint(0, 59)
179
+ return (datetime.now() - timedelta(days=days, hours=hours, minutes=mins)
180
+ ).strftime("%Y-%m-%d %H:%M:%S")
181
+
182
+ # ── Usuarios de prueba ────────────────────────────────────────────
183
+ demo_users = [
184
+ ("dr_ramirez", "doctor123", "Doctor"),
185
+ ("dr_perez", "doctor123", "Doctor"),
186
+ ("dr_martinez", "doctor123", "Doctor"),
187
+ ("supervisor", "admin456", "Admin"),
188
+ ]
189
+ user_ids = {}
190
+ for username, password, role in demo_users:
191
+ cur = conn.execute(
192
+ "INSERT OR IGNORE INTO Users (username, password, role) VALUES (?,?,?)",
193
+ (username, self.hash_password(password), role)
194
+ )
195
+ row = conn.execute("SELECT userID FROM Users WHERE username=?", (username,)).fetchone()
196
+ user_ids[username] = row["userID"]
197
+ conn.commit()
198
+ print(f" + {len(demo_users)} usuarios de prueba creados")
199
+
200
+ doctor_names = ["dr_ramirez", "dr_perez", "dr_martinez"]
201
+ doctor_ids = [user_ids[n] for n in doctor_names]
202
+
203
+ # ── Pacientes ─────────────────────────────────────────────────────
204
+ patients_data = [
205
+ ("Juan Carlos Medina Castillo", "1958-03-14", "M", "Tipo 2"),
206
+ ("María Elena Reyes Sánchez", "1965-07-22", "F", "Tipo 2"),
207
+ ("Roberto Antonio Pérez Núñez", "1972-11-05", "M", "Tipo 1"),
208
+ ("Carmen Altagracia Díaz López", "1949-01-30", "F", "Tipo 2"),
209
+ ("Luis Fernando Vargas Torres", "1980-09-18", "M", "Tipo 2"),
210
+ ("Ana Milagros Santos Herrera", "1955-04-12", "F", "Tipo 2"),
211
+ ("Pedro Emilio Guzmán Rosario", "1963-12-28", "M", "Tipo 1"),
212
+ ("Josefa Alicia Mora Taveras", "1970-06-03", "F", "Gestacional"),
213
+ ("Francisco Javier Marte Féliz", "1945-08-17", "M", "Tipo 2"),
214
+ ("Rosa María Almonte Encarnación", "1968-02-09", "F", "Tipo 2"),
215
+ ("Miguel Ángel Cabrera Paulino", "1976-10-25", "M", "MODY"),
216
+ ("Esperanza del Carmen Pichardo", "1952-05-31", "F", "Tipo 2"),
217
+ ("Carlos Daniel Tejada Ureña", "1988-03-07", "M", "Tipo 1"),
218
+ ("Yolanda Beatriz Novas Acosta", "1961-09-14", "F", "Tipo 2"),
219
+ ("Ramón Ernesto Jiménez Clase", "1957-07-19", "M", "Tipo 2"),
220
+ ("Gloria Inés Santana Bido", "1973-11-22", "F", "Tipo 2"),
221
+ ("Héctor Manuel Ogando Matos", "1966-04-08", "M", "Tipo 2"),
222
+ ("Milagros Concepción Báez Rijo", "1982-01-16", "F", "Tipo 1"),
223
+ ("Víctor Hugo Severino Cepeda", "1948-08-04", "M", "Tipo 2"),
224
+ ("Luz Marina Polanco Espinal", "1959-06-27", "F", "Tipo 2"),
225
+ ("Andrés Felipe Castillo Grullón", "1990-12-11", "M", "Tipo 1"),
226
+ ("Natividad Eugenia Pena Arias", "1944-03-23", "F", "Tipo 2"),
227
+ ("Domingo Rafael Flores Medina", "1967-10-01", "M", "Otro"),
228
+ ("Sandra Margarita Cruz Lizardo", "1978-05-18", "F", "Tipo 2"),
229
+ ("Eugenio Antonio Lora Ferreira", "1953-09-30", "M", "Tipo 2"),
230
+ ]
231
+ patient_ids = []
232
+ for i, (name, birth, gender, diab) in enumerate(patients_data):
233
+ cur = conn.execute(
234
+ "INSERT INTO Patients (createdByUserID, name, birthDate, gender, diabetesType) VALUES (?,?,?,?,?)",
235
+ (doctor_ids[i % len(doctor_ids)], name, birth, gender, diab)
236
+ )
237
+ patient_ids.append(cur.lastrowid)
238
+ conn.commit()
239
+ print(f" + {len(patient_ids)} pacientes creados")
240
+
241
+ # ── Factores de riesgo ────────────────────────────────────────────
242
+ rf_map = {r["name"]: r["riskFactorID"]
243
+ for r in conn.execute("SELECT riskFactorID, name FROM RiskFactors").fetchall()}
244
+
245
+ patient_risk_factors = {
246
+ "Hipertensión": [0, 3, 4, 5, 8, 9, 13, 14, 16, 18, 19, 21, 24],
247
+ "Diabetes Tipo 1": [2, 6, 12, 17, 20],
248
+ "Diabetes Tipo 2": [0, 1, 3, 4, 5, 7, 8, 9, 11, 13, 14, 15, 16, 18, 19, 21, 22, 23, 24],
249
+ "Obesidad": [0, 3, 8, 9, 14, 18, 21, 24],
250
+ "Tabaquismo": [6, 8, 14, 18, 22],
251
+ "Sedentarismo": [1, 3, 5, 9, 13, 19, 21],
252
+ "Antecedentes Familiares": [0, 2, 4, 6, 10, 12, 15, 17, 20],
253
+ "Edad Avanzada": [3, 8, 18, 21],
254
+ "Colesterol Alto": [0, 4, 8, 13, 16, 18, 24],
255
+ "Nefropatía": [3, 8, 18],
256
+ }
257
+ rf_count = 0
258
+ for rf_name, indices in patient_risk_factors.items():
259
+ rf_id = rf_map.get(rf_name)
260
+ if rf_id is None:
261
+ continue
262
+ for idx in indices:
263
+ if idx < len(patient_ids):
264
+ conn.execute(
265
+ "INSERT OR IGNORE INTO PatientsRiskFactors (patientID, riskFactorID) VALUES (?,?)",
266
+ (patient_ids[idx], rf_id)
267
+ )
268
+ rf_count += 1
269
+ conn.commit()
270
+ print(f" + {rf_count} factores de riesgo asignados")
271
+
272
+ # ── Consultas ─────────────────────────────────────────────────────
273
+ consultations = [
274
+ (0, 92.3, True, "Lesiones hemorrágicas visibles en polo posterior. Evaluación urgente con retinólogo."),
275
+ (0, 87.1, True, "Seguimiento: persisten microaneurismas. Control en 3 meses."),
276
+ (3, 95.8, True, "Retinopatía diabética no proliferativa severa. Derivación inmediata."),
277
+ (3, 88.4, True, "Exudados duros periféricos. Edema macular presente."),
278
+ (5, 79.2, True, "Microaneurismas múltiples en arcada temporal superior."),
279
+ (8, 96.1, True, "Retinopatía proliferativa. Neovascularización de disco. Requiere fotocoagulación."),
280
+ (8, 91.7, True, "Post-fotocoagulación. Reducción de neovascularización. Seguimiento mensual."),
281
+ (13, 84.5, True, "Hemorragias en llama en cuadrante nasal inferior."),
282
+ (14, 88.9, True, "Exudados algodonosos y microaneurismas. RDNP moderada."),
283
+ (18, 93.2, True, "Retinopatía diabética avanzada. Tracción vitreorretiniana incipiente."),
284
+ (21, 90.6, True, "Microaneurismas y hemorragias puntiformes bilaterales."),
285
+ (24, 82.3, True, "RDNP leve. Primera detección. Inicio de seguimiento cada 6 meses."),
286
+ (1, 91.5, False, "Retina sin signos de retinopatía. Control anual programado."),
287
+ (1, 94.2, False, "Sin cambios respecto a control anterior. Fondo de ojo normal."),
288
+ (2, 88.7, False, "Retina en buen estado. Se refuerza control glucémico."),
289
+ (4, 96.3, False, "Sin evidencia de retinopatía. Paciente con buen control metabólico."),
290
+ (6, 85.1, False, "Fondo de ojo sin alteraciones. Seguimiento semestral indicado."),
291
+ (7, 92.8, False, "Retina normal. Paciente en primer trimestre, control mensual."),
292
+ (9, 89.4, False, "Sin signos de RD. Se mejora el control de HbA1c."),
293
+ (10, 93.7, False, "Sin alteraciones retinianas. Paciente joven con buen pronóstico."),
294
+ (11, 87.6, False, "Retina sin lesiones. Control semestral."),
295
+ (12, 91.2, False, "Sin retinopatía. Visión borrosa ocasional descartada como causa retiniana."),
296
+ (15, 94.8, False, "Fondo de ojo normal. Mantener HbA1c < 7%."),
297
+ (16, 86.3, False, "Sin signos de RD. Control en 6 meses."),
298
+ (17, 93.1, False, "Retina sin alteraciones. Control glucémico óptimo."),
299
+ (19, 88.9, False, "Sin retinopatía. Se orienta sobre importancia del ejercicio físico."),
300
+ (20, 95.4, False, "Fondo de ojo normal. Primer control, paciente de reciente diagnóstico."),
301
+ (23, 90.1, False, "Retina sin lesiones. Excelente adherencia al tratamiento."),
302
+ ]
303
+ for pat_idx, confidence, has_dr, notes in consultations:
304
+ if pat_idx >= len(patient_ids):
305
+ continue
306
+ pid = patient_ids[pat_idx]
307
+ doc_id = conn.execute(
308
+ "SELECT createdByUserID FROM Patients WHERE patientID=?", (pid,)
309
+ ).fetchone()["createdByUserID"]
310
+ conn.execute(
311
+ """INSERT INTO Consultations
312
+ (patientID, createdByUserID, diabeticRetinopathy, notes,
313
+ confidence, rawOutput, consultationDate)
314
+ VALUES (?,?,?,?,?,?,?)""",
315
+ (pid, doc_id, 1 if has_dr else 0, notes,
316
+ confidence, confidence / 100.0, rand_consult_date())
317
+ )
318
+ conn.commit()
319
+ print(f" + {len(consultations)} consultas creadas")
320
+ print("=== Datos de demostración listos ===")
321
+
322
  # ------------------------------------------------------------------ #
323
  # UTILIDADES
324
  # ------------------------------------------------------------------ #
 
599
  finally:
600
  conn.close()
601
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
602
  def get_patient_consultations(self, patient_id: int) -> List[Dict]:
603
  conn = self.get_connection()
604
  try:
 
644
  offset = (page - 1) * per_page
645
 
646
  rows = conn.execute(
647
+ f"""SELECT c.*, p.name as patientName, u.username as doctorName
 
 
 
 
 
648
  {base} {where}
649
  ORDER BY c.consultationDate DESC
650
  LIMIT ? OFFSET ?""",