2.1.0: el asistente se fusiona con la lista de acciones

Había dos caminos para lo mismo. Ahora encima de la lista sale «Hacer las N de
una vez», que ejecuta seguidas las acciones que no necesitan elegir nada, con
el mismo motor que tenía el asistente. Convertir y respaldar se quedan fuera
porque hay que elegir; lo dudoso nunca entra.

- POST /api/acciones/hacer; acciones() trae  y el progreso.
- Se quita el punto de entrada «Asistente paso a paso» de la interfaz (el
  motor y la entrada por línea de comandos siguen).
- Las acciones de ordenar no cuentan como pendientes sin un plan calculado:
  tras ordenarlo todo la lista seguía diciendo que faltaban dos cosas.

Probado de punta a punta: 19 archivos antes y después, ninguno perdido, árbol
completo ordenado en un clic.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Este commit está contenido en:
Labstream
2026-09-16 21:53:50 -05:00
padre 6b8bc23941
commit 1e1187d28a
Se han modificado 4 ficheros con 69 adiciones y 21 borrados

Ver fichero

@@ -34,7 +34,7 @@ import actualizador
asistente.O = sys.modules[__name__]
actualizador.O = sys.modules[__name__]
VERSION = "2.0.0"
VERSION = "2.1.0"
CONGELADO = getattr(sys, "frozen", False)
SIN_VENTANA = getattr(subprocess, "CREATE_NO_WINDOW", 0) # ffmpeg/ffprobe/net sin abrir consolas negras # empaquetado como .exe con PyInstaller
@@ -2782,8 +2782,10 @@ def acciones(raiz):
else:
añadir(clave=clave, titulo=titulo, estado="hecho", que="Nada que mover.", cifra="", detalle="")
else:
añadir(clave=clave, titulo=titulo, boton="Calcular", que=que, cifra="",
detalle="Hay que calcular el plan para saber cuánto es.", ir="plan", paso=clave)
# sin el plan calculado no se sabe si queda algo: se ofrece calcularlo, pero no cuenta como
# pendiente (si no, después de ordenarlo todo la lista seguía diciendo que faltaban dos cosas)
añadir(clave=clave, titulo=titulo, boton="Calcular", que=que, cifra="", estado="espera",
detalle="Hay que calcular el plan para saber si queda algo.", ir="plan", paso=clave)
# --- 5. stock de Envato viejo ---
tope = limite_meses(3)
@@ -2842,7 +2844,10 @@ def acciones(raiz):
ir="respaldar")
con.close()
return {"raiz": raiz, "cliente": r["cliente"], "acciones": out, "escaneo": dict(esc)}
# «lo seguro» son las acciones que se pueden hacer sin elegir nada: no entran convertir ni respaldar
auto = [a["clave"] for a in out if a["estado"] == "toca" and a["clave"] in ("limpiar", "fechas", "resto", "stock", "repetidos")]
return {"raiz": raiz, "cliente": r["cliente"], "acciones": out, "escaneo": dict(esc),
"automatico": auto, "asistente": asistente.ESTADO if asistente.ESTADO.get("raiz", "").lower() == raiz.lower() else None}
def estado_carpeta(ruta):
@@ -3147,6 +3152,21 @@ class Manejador(BaseHTTPRequestHandler):
CONFIG["tour_visto"] = True
guardar_json(CONFIG_PATH, CONFIG)
return self._json({"ok": True})
if ruta == "/api/acciones/hacer":
# «Hacer todo lo seguro»: el mismo motor que tenía el asistente, pero lanzado desde la
# lista de acciones y sin preguntar nada. Deja fuera lo que no debe ir en automático:
# convertir (tarda horas y hay que elegir formato) y respaldar (necesita otro disco).
raiz = os.path.normpath(d["raiz"])
if asistente.ESTADO["activo"]:
return self._json({"error": "ya hay algo en marcha en esta carpeta"}, 409)
diag = asistente.diagnostico(raiz)
filas = Plan(raiz_cfg(raiz)).correr()["filas"]
dec = {p["clave"]: p["defecto"] for p in asistente.pasos(diag, filas)}
dec["convertir"] = "no"
dec["respaldo"] = "no"
dec["carpetas"] = "seguras" # nunca las dudosas sin que alguien las mire
asistente.ejecutar(raiz, dec, filas, en_hilo=True)
return self._json({"lanzado": True, "hara": {k: v for k, v in dec.items() if v not in ("no", "dejar")}})
if ruta == "/api/asistente":
raiz = os.path.normpath(d["raiz"])
if asistente.ESTADO["activo"]: