melodix-api / fix_evangelios.py
GitHub Action
deploy from github actions
440bac0
Raw
History Blame Contribute Delete
8.52 kB
"""
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()