""" fix_evangelios.py Agrega los 4 evangelios que faltan (S.Mateo, S.Marcos, S.Lucas, S.Juan en el JSON). """ import os, sys, io, json, requests sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') sys.path.append(os.path.dirname(os.path.abspath(__file__))) from dotenv import load_dotenv load_dotenv() from app.database import engine, Base, SessionLocal import app.main from app.models.aprendizaje import BibliaLibro, BibliaVersiculo # Los 4 evangelios: nombre en JSON → nombre en español (correcto) EVANGELIOS_MAP = { "S. Mateo": "Mateo", "S. Marcos": "Marcos", "S. Lucas": "Lucas", "S.Juan": "Juan", } def main(): print("=== Insertando evangelios faltantes ===\n") Base.metadata.create_all(bind=engine) db = SessionLocal() # Verificar si ya existen mateo = db.query(BibliaLibro).filter(BibliaLibro.nombre == "Mateo").first() if mateo: print("[OK] Mateo ya existe — evangelios ya insertados.") db.close() return print("Descargando JSON...") url = "https://raw.githubusercontent.com/dscottpi/bibles/master/RVR1960-Spanish.json" data = requests.get(url, timeout=120).json() # Necesitamos insertar en el orden correcto (AT=39 libros, NT empieza en posicion 40) # Mateo=40, Marcos=41, Lucas=42, Juan=43 # En la DB ya hay 62 libros (Hebreos=58...Apocalipsis=62), los evangelios van entre # posicion 39 (Malaquias) y 43 (Hechos). # Como PostgreSQL no tiene orden garantizado, los insertamos y la app los ordenará por ID. # Pero como ya insertamos Hechos...Apocalipsis antes, necesitamos reordenar. # La solución más limpia: re-importar completo esta vez con el mapa correcto. print("Re-importando todo con mapa corregido de evangelios...") # Borrar todo deleted_v = db.query(BibliaVersiculo).delete() db.commit() deleted_l = db.query(BibliaLibro).delete() db.commit() print("Borrados " + str(deleted_v) + " versiculos y " + str(deleted_l) + " libros.") ORDEN_CANONICO = [ "Génesis", "Éxodo", "Levítico", "Números", "Deuteronomio", "Josué", "Jueces", "Rut", "1 Samuel", "2 Samuel", "1 Reyes", "2 Reyes", "1 Crónicas", "2 Crónicas", "Esdras", "Nehemías", "Ester", "Job", "Salmos", "Proverbios", "Eclesiastés", "Cantares", "Isaías", "Jeremías", "Lamentaciones", "Ezequiel", "Daniel", "Oseas", "Joel", "Amós", "Abdías", "Jonás", "Miqueas", "Nahúm", "Habacuc", "Sofonías", "Hageo", "Zacarías", "Malaquías", "Mateo", "Marcos", "Lucas", "Juan", "Hechos", "Romanos", "1 Corintios", "2 Corintios", "Gálatas", "Efesios", "Filipenses", "Colosenses", "1 Tesalonicenses", "2 Tesalonicenses", "1 Timoteo", "2 Timoteo", "Tito", "Filemón", "Hebreos", "Santiago", "1 Pedro", "2 Pedro", "1 Juan", "2 Juan", "3 Juan", "Judas", "Apocalipsis" ] AT_LIBROS = set(ORDEN_CANONICO[:39]) import unicodedata def norm(texto): nfkd = unicodedata.normalize('NFKD', texto) return ''.join(c for c in nfkd if not unicodedata.combining(c)).lower().strip() # Construir mapeo: nombre_normalizado_canonico → clave_en_JSON # Incluyendo los alias de evangelios con "S." json_aliases = { norm("Génesis"): "Génesis", norm("Éxodo"): "Éxodo", norm("Levítico"): "Levítico", norm("Números"): "Números", norm("Deuteronomio"): "Deuteronomio", norm("Josué"): "Josué", norm("Jueces"): "Jueces", norm("Rut"): "Rut", norm("1 Samuel"): "1 Samuel", norm("2 Samuel"): "2 Samuel", norm("1 Reyes"): "1 Reyes", norm("2 Reyes"): "2 Reyes", norm("1 Crónicas"): "1 Crónicas", norm("2 Crónicas"): "2 Crónicas", norm("Esdras"): "Esdras", norm("Nehemías"): "Nehemías", norm("Ester"): "Ester", norm("Job"): "Job", norm("Salmos"): "Salmos", norm("Proverbios"): "Proverbios", norm("Eclesiastés"): "Eclesiastés", norm("Cantares"): "Cantares", norm("Isaías"): "Isaías", norm("Jeremías"): "Jeremías", norm("Lamentaciones"): "Lamentaciones", norm("Ezequiel"): "Ezequiel", norm("Daniel"): "Daniel", norm("Oseas"): "Oseas", norm("Joel"): "Joel", norm("Amós"): "Amós", norm("Abdías"): "Abdías", norm("Jonás"): "Jonás", norm("Miqueas"): "Miqueas", norm("Nahúm"): "Nahúm", norm("Habacuc"): "Habacuc", norm("Sofonías"): "Sofonías", norm("Hageo"): "Hageo", norm("Zacarías"): "Zacarías", norm("Malaquías"): "Malaquías", norm("Mateo"): "S. Mateo", # alias en el JSON norm("Marcos"): "S. Marcos", # alias en el JSON norm("Lucas"): "S. Lucas", # alias en el JSON norm("Juan"): "S.Juan", # alias en el JSON (sin espacio) norm("Hechos"): "Hechos", norm("Romanos"): "Romanos", norm("1 Corintios"): "1 Corintios", norm("2 Corintios"): "2 Corintios", norm("Gálatas"): "Gálatas", norm("Efesios"): "Efesios", norm("Filipenses"): "Filipenses", norm("Colosenses"): "Colosenses", norm("1 Tesalonicenses"): "1 Tesalonicenses", norm("2 Tesalonicenses"): "2 Tesalonicenses", norm("1 Timoteo"): "1 Timoteo", norm("2 Timoteo"): "2 Timoteo", norm("Tito"): "Tito", norm("Filemón"): "Filemón", norm("Hebreos"): "Hebreos", norm("Santiago"): "Santiago", norm("1 Pedro"): "1 Pedro", norm("2 Pedro"): "2 Pedro", norm("1 Juan"): "1 Juan", norm("2 Juan"): "2 Juan", norm("3 Juan"): "3 Juan", norm("Judas"): "Judas", norm("Apocalipsis"): "Apocalipsis", } total_versiculos = 0 libros_insertados = 0 for nombre_canonico in ORDEN_CANONICO: json_key = json_aliases.get(norm(nombre_canonico)) if not json_key or json_key not in data: print(" FALTANTE: " + nombre_canonico + " (json_key=" + str(json_key) + ")") continue testamento = "Antiguo" if nombre_canonico in AT_LIBROS else "Nuevo" nuevo_libro = BibliaLibro(nombre=nombre_canonico, testamento=testamento) db.add(nuevo_libro) db.commit() db.refresh(nuevo_libro) capitulos_data = data[json_key] versiculos_a_insertar = [] for cap_key in sorted(capitulos_data.keys(), key=lambda x: int(x)): num_cap = int(cap_key) versiculos_dict = capitulos_data[cap_key] for ver_key in sorted(versiculos_dict.keys(), key=lambda x: int(x)): num_ver = int(ver_key) texto = versiculos_dict[ver_key].strip() versiculos_a_insertar.append( BibliaVersiculo( libro_id=nuevo_libro.id, capitulo=num_cap, versiculo=num_ver, texto=texto ) ) db.bulk_save_objects(versiculos_a_insertar) db.commit() total_versiculos += len(versiculos_a_insertar) libros_insertados += 1 print(" [OK] " + nombre_canonico + " (" + testamento + ") - " + str(len(versiculos_a_insertar)) + " versiculos") print("\n=== Importacion completa ===") print(str(libros_insertados) + " libros, " + str(total_versiculos) + " versiculos.") # Verificacion final for check_libro, check_cap, check_ver in [("Génesis", 1, 1), ("Mateo", 1, 1), ("Juan", 3, 16), ("Apocalipsis", 22, 21)]: lib = db.query(BibliaLibro).filter(BibliaLibro.nombre == check_libro).first() if lib: v = db.query(BibliaVersiculo).filter( BibliaVersiculo.libro_id == lib.id, BibliaVersiculo.capitulo == check_cap, BibliaVersiculo.versiculo == check_ver ).first() if v: print(check_libro + " " + str(check_cap) + ":" + str(check_ver) + " = " + v.texto) else: print(check_libro + " " + str(check_cap) + ":" + str(check_ver) + " = NO ENCONTRADO") else: print(check_libro + " = LIBRO NO ENCONTRADO") db.close() if __name__ == "__main__": main()