Spaces:
Running
Running
| """ | |
| 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() | |