Actualización del 2025-06-15 a las 16:43:02
This commit is contained in:
parent
273bc4e02e
commit
d23754d3b8
7 changed files with 333 additions and 63 deletions
62
app.py
62
app.py
|
|
@ -19,6 +19,8 @@ import psycopg2.pool
|
|||
import bleach
|
||||
|
||||
from feed_processor import process_single_feed
|
||||
# --- IMPORTACIÓN CORREGIDA ---
|
||||
from url_processor import process_newspaper_url
|
||||
|
||||
logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='[%(asctime)s] %(levelname)s in %(module)s: %(message)s')
|
||||
|
||||
|
|
@ -198,6 +200,66 @@ def add_feed():
|
|||
flash("No se pudieron cargar las categorías o países.", "error")
|
||||
return render_template("add_feed.html", categorias=categorias, paises=paises)
|
||||
|
||||
|
||||
@app.route("/add_url", methods=['GET', 'POST'])
|
||||
def add_url():
|
||||
if request.method == 'POST':
|
||||
url_to_scrape = request.form.get("url")
|
||||
if not url_to_scrape:
|
||||
flash("La URL es obligatoria.", "error")
|
||||
return redirect(url_for('add_url'))
|
||||
|
||||
categoria_id = int(request.form.get("categoria_id")) if request.form.get("categoria_id") else None
|
||||
pais_id = int(request.form.get("pais_id")) if request.form.get("pais_id") else None
|
||||
|
||||
if not categoria_id or not pais_id:
|
||||
flash("Debes seleccionar una categoría y un país.", "error")
|
||||
return redirect(url_for('add_url'))
|
||||
|
||||
# Llama a la nueva función que devuelve una lista de noticias
|
||||
lista_noticias, message = process_newspaper_url(url_to_scrape, categoria_id, pais_id)
|
||||
|
||||
if lista_noticias:
|
||||
try:
|
||||
with get_conn() as conn:
|
||||
with conn.cursor() as cursor:
|
||||
# Usamos execute_values para insertar todas las noticias de una vez
|
||||
insert_query = """
|
||||
INSERT INTO noticias (id, titulo, resumen, url, fecha, imagen_url, categoria_id, pais_id)
|
||||
VALUES %s
|
||||
ON CONFLICT (url) DO UPDATE SET
|
||||
titulo = EXCLUDED.titulo,
|
||||
resumen = EXCLUDED.resumen,
|
||||
fecha = EXCLUDED.fecha,
|
||||
imagen_url = EXCLUDED.imagen_url;
|
||||
"""
|
||||
psycopg2.extras.execute_values(cursor, insert_query, lista_noticias)
|
||||
|
||||
# Mensaje de éxito mejorado que indica cuántas noticias se guardaron
|
||||
flash(f"Se encontraron y guardaron {len(lista_noticias)} noticias desde la URL.", "success")
|
||||
return redirect(url_for("home"))
|
||||
except psycopg2.Error as db_err:
|
||||
app.logger.error(f"[DB ERROR] Al insertar noticias scrapeadas: {db_err}", exc_info=True)
|
||||
flash(f"Error de base de datos al guardar las noticias: {db_err}", "error")
|
||||
else:
|
||||
# Muestra el mensaje de error o de "no se encontraron artículos"
|
||||
flash(message, "warning")
|
||||
|
||||
return redirect(url_for('add_url'))
|
||||
|
||||
# Petición GET: Muestra el formulario
|
||||
categorias, paises = [], []
|
||||
try:
|
||||
with get_conn() as conn:
|
||||
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cursor:
|
||||
categorias, paises = _get_form_dependencies(cursor)
|
||||
except psycopg2.Error as db_err:
|
||||
app.logger.error(f"[DB ERROR] Al cargar formulario de URL: {db_err}")
|
||||
flash("No se pudieron cargar las categorías o países para el formulario.", "error")
|
||||
|
||||
return render_template("add_url.html", categorias=categorias, paises=paises)
|
||||
|
||||
|
||||
@app.route("/edit/<int:feed_id>", methods=["GET", "POST"])
|
||||
def edit_feed(feed_id):
|
||||
if request.method == "POST":
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue