From b93ee95427482cecb7fe14eee03fdaabff38fe0b Mon Sep 17 00:00:00 2001 From: mono Date: Fri, 3 Jul 2026 18:26:42 -0500 Subject: [PATCH] feat: add script to re-upload catalogue images and force resize --- scripts/reupload_catalogue_images.py | 99 ++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100755 scripts/reupload_catalogue_images.py diff --git a/scripts/reupload_catalogue_images.py b/scripts/reupload_catalogue_images.py new file mode 100755 index 0000000..4d85943 --- /dev/null +++ b/scripts/reupload_catalogue_images.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +import argparse +import getpass +import sys + +import requests + + +TOKEN_URL = "/api/token/" +CATALOGUE_IMAGES_URL = "/don_confiao/api/catalogue_images/" + + +def get_credentials(): + username = input("Usuario: ") + password = getpass.getpass("Contraseña: ") + return username, password + + +def get_token(domain, username, password): + url = domain.rstrip("/") + TOKEN_URL + response = requests.post(url, json={"username": username, "password": password}) + if response.status_code != 200: + print(f"Error al obtener token: {response.status_code} {response.text}", file=sys.stderr) + sys.exit(1) + data = response.json() + return data["access"] + + +def get_catalogue_images(domain, token): + url = domain.rstrip("/") + CATALOGUE_IMAGES_URL + headers = {"Authorization": f"Bearer {token}"} + response = requests.get(url, headers=headers) + if response.status_code != 200: + print(f"Error al obtener imágenes de catálogo: {response.status_code} {response.text}", file=sys.stderr) + sys.exit(1) + return response.json() + + +def download_image(image_url): + response = requests.get(image_url) + if response.status_code != 200: + print(f" [ERR] No se pudo descargar imagen: {response.status_code}", file=sys.stderr) + return None + return response.content + + +def main(): + parser = argparse.ArgumentParser( + description="Vuelve a subir cada imagen de catálogo existente para forzar el redimensionado." + ) + parser.add_argument("domain", help="Dominio del backend (ej: http://localhost:8000)") + args = parser.parse_args() + + username, password = get_credentials() + token = get_token(args.domain, username, password) + print("Token obtenido correctamente.") + + images = get_catalogue_images(args.domain, token) + if not images: + print("No hay imágenes de catálogo para procesar.") + return + + headers = {"Authorization": f"Bearer {token}"} + updated = 0 + errors = 0 + + for img in images: + ci_id = img["id"] + product_id = img["product"] + image_url = img["image"] + + print(f" [{ci_id}] Descargando {image_url} ...") + content = download_image(image_url) + if content is None: + errors += 1 + continue + + # Determine content type from URL extension + ext = image_url.rsplit(".", 1)[-1].lower() if "." in image_url else "jpg" + mime = {"jpg": "image/jpeg", "jpeg": "image/jpeg", "png": "image/png"}.get(ext, "application/octet-stream") + filename = f"image.{ext}" + + update_url = args.domain.rstrip("/") + CATALOGUE_IMAGES_URL.rstrip("/") + f"/{ci_id}/" + files = {"image": (filename, content, mime)} + data = {"product": product_id} + response = requests.put(update_url, headers=headers, files=files, data=data) + + if response.status_code == 200: + print(f" [OK] Imagen {ci_id} (producto {product_id}) actualizada.") + updated += 1 + else: + print(f" [ERR] Imagen {ci_id}: {response.status_code} {response.text}") + errors += 1 + + print(f"\nResumen: {updated} actualizadas, {errors} errores") + + +if __name__ == "__main__": + main() -- 2.49.1