Volver a la wiki

Task Huey: Conversión asíncrona .vsdx/.vsd → SVG

Descripción

Módulo: racks/tasks.py

Task Huey asíncrona que convierte ficheros Visio modernos (.vsdx, .vsd) a imágenes vectoriales SVG, ejecutada en el worker para no bloquear el request principal. Diseñada para stencils de fabricante grandes (Cisco, APC, Schneider).

Decorador

@db_task()
def convert_visio_async(session_id: str, filepath: str) → None

Flujo de ejecución

  1. Obtiene directorio temporal: MEDIA_ROOT/temp/{session_id}
  2. Carga libvisio-ng (lazy, solo en worker — GPL-3.0):
    • Intenta libvisio_ng.get_page_info(filepath) para obtener nombres de páginas (fallback: nombres de fichero)
    • Llamadas: libvisio_ng.convert(filepath, output_dir=temp_dir)
  3. Genera SVG por página: v1 granularidad página (un dibujo con shapes agrupados → un SVG único; troceo por shape individual es v2)
  4. Sanitiza cada SVG antes de quedar disponible (sanitize_svg_file())
  5. Escribe manifest de masters: lista de {“name”, “u_height”, “image_path”} en el estado de la sesión
  6. Persiste estado final: status=done o status=error

Funciones auxiliares

write_session_state(session_id: str, status: str, masters=None, error="")

Escribe estado JSON a temp/{session_id}/visio_session.json.

Estados:

Payload JSON:

{
  "status": "done",
  "masters": [
    {"name": "Cisco Rack Layout", "u_height": 1, "image_path": "uploads/temp/{sid}/page1.svg"},
    {"name": "APC PDUs", "u_height": 1, "image_path": "uploads/temp/{sid}/page2.svg"}
  ],
  "error": ""
}

read_session_state(session_id: str) → dict | None

Lee el estado JSON. Devuelve None si no existe (sesión expirada o inválida).

Estrategia de nombres y rutas

Ciclo de vida

  1. Antes: análisis del fichero (extensión, tamaño) en analyze; sesión creada, UUID generado, estado = processing
  2. Durante: task corre en worker Huey; frontend hace polling a GET /visio/session/{id}
  3. Después: estado done → frontend obtiene lista de masters → usuario confirma en confirm
  4. Limpieza: temp/{sid} se elimina tras éxito de confirm o expiración (TTL configurable, no en este PR)

Manejo de errores

Testing

Cubierto en tests/api/test_visio_import_v2.py:

Dependencia

Véase también

Subir