Puente rack-real: los stencils de rack crean racks del inventario (F4a v1.48.0)
Descripción general
Los 9 stencils de rack completo (12U–48U de 19” + Rack de Network) del editor de mapas (Map Editor, panel Shapes) ya no insertan un dibujo conectable: crean un rack REAL del inventario que aparece en el dashboard, se renombra con doble clic, acepta cables rack_connection con color de estado de monitorización y abre su Rack Editor con clic derecho.
Impacto de usuario
- Antes: soltar un stencil de rack = dibujo sin entidad en BD (el “rack no existía”)
- Ahora: soltar un stencil de rack =
Rackreal creado en el inventario, con nombre del stencil, visual profesional (imagen SVG tintada por estado de monitorización) y toda la funcionalidad: cables, rename, etiqueta bajo la forma (estilo draw.io), y persistencia tras reload - El resto de stencils (servidores 1U–6U, patch panels, UPS APC, mobiliario) siguen siendo dibujos conectables — es lo correcto para ellos
Cómo funciona
Backend: creación del rack real
-
POST
/api/blueprints/{bp_id}/rack(modificado enblueprints/api/racks.py):- Parámetros:
name,x,y,style_props(JSON con visual de stencil) - Crea un
Rackreal del inventario conRack.objects.create(name=rack_name, organization=org, height_u=42, status="active") - Devuelve
{ id, name, status, style_props }con el stencil grabado enBlueprintPlacement.style_props
- Parámetros:
-
Schema actualizado (
blueprints/api/schemas.py):PlacementInputSchema.name(str, opcional): nombre inicial del rack; si no se proporciona, por defecto “New Rack”
Frontend: visual y herramientas
-
StencilRenderer (helpers/StencilRenderer.js):
- Método nuevo:
buildImage(svg, stroke, w, h)— rasteriza un SVG aKonva.Imagetematizado con el color de estado (asincrónico, repinta la capa al cargar la imagen) - Método existente
buildNode()refactorizado para reutilizarbuildImage() - Lógica nueva: si
shape.materialize === "rack", llama ainsertRackStencil()en lugar de crear un dibujo
- Método nuevo:
-
MapRacks.createRackNode (static/js/blueprints/MapRacks.js):
- Rama nueva: si
rackData.style_props?.stencil?.svgexiste, pinta el visual conStencilRenderer.buildImage()+ etiqueta debajo (en lugar del rectángulo clásico) - Rama antigua (rect clásico) intacta para compatibilidad: los racks antiguos sin stencil siguen viéndose como rectángulos
- Rama nueva: si
-
RackTool (static/js/blueprints/drawing/tools/RackTool.js):
- Al crear un rack con la tecla K, busca el stencil “42U Rack 19 Standard” del catálogo (
DEFAULT_RACK_STENCIL) - Si el catálogo carga, inserta con visual de stencil (imagen 40x150px por defecto)
- Si falla, degrada al rectángulo clásico (sin error)
- Llama a
context.persistRack()constylePropsque contiene el SVG del stencil
- Al crear un rack con la tecla K, busca el stencil “42U Rack 19 Standard” del catálogo (
-
StencilPanel.js (modificado):
ensureSet()ahora inicializa el índice aunque el panel no esté abierto (necesario para queRackToolcargue el stencil de rack por defecto)
Catálogo: flag materialize: "rack"
El conversor (scripts/stencils/convert_mxgraph_stencils.py) añade la bandera materialize: "rack" a los 9 stencils:
{
"id": "42u-rack-19-standard",
"set": "rack-general",
"name": "42U Rack 19 Standard",
"svg": "...",
"w": 60,
"h": 150,
"materialize": "rack" // ← Flag nueva: este stencil crea un rack REAL
}
Stencils con materialize: "rack" (9 en total):
rack-general: 12U, 26U, 36U, 40U, 42U, 44U, 48U Racks 19”rack-general: 47U Rack 19” IBMnetworks: Rack (Network)
Fix: colores simbólicos de mxGraph (“velo negro”)
El problema
Los stencils de draw.io usan colores simbólicos como frameColor, cabinetColor, stroke, fillColor1. El conversor los copiaba tal cual al SVG, y un navegador los trata como color inválido → pinta negro → el stencil quedaba como una losa oscura sin detalle (el “velo” reportado por Edu en v1.46.0).
La solución
El conversor (scripts/stencils/convert_mxgraph_stencils.py) añade un mapa SYMBOLIC_COLORS:
SYMBOLIC_COLORS = {
"stroke": "currentColor", # pinta con el color de trazo actual
"strokeColor": "currentColor",
"frameColor": "#9ca3af", # marco gris de racks 19"
"cabinetColor": "#374151", # interior distinguible del fondo
"fillColor1": "#94a3b8", # relleno secundario (floorplan)
}
Antes de generar el SVG, resuelve cada color simbólico a su equivalente hexadecimal. El catálogo (static/stencils/floorplan.json + otros) queda regenerado (185/185 stencils, 0 símbolos restantes).
Verificación E2E:
- Drop de stencil de rack → visual nítido (sin losa negra) ✓
- Colores ajustados al lienzo oscuro (marco gris, interior distinguible) ✓
- Catálogo 185/185 regenerado sin símbolos ✓
Cambios de código
Backend
blueprints/api/racks.py:create_rack_in_blueprint()usapayload.name or "New Rack"(máx 100 caracteres)blueprints/api/schemas.py:PlacementInputSchema+ parámetronameopcional- Test nuevo en suite
blueprints: 4/4 verde
Frontend
static/js/blueprints/MapRacks.js:createRackNode()con rama de visual stencil (tintado + etiqueta debajo) + rama clásica (rect)static/js/blueprints/helpers/StencilRenderer.js: métodobuildImage()nuevo +insertRackStencil()nuevo (materializa rack real); refactor debuildNode()static/js/blueprints/drawing/tools/RackTool.js: carga stencil 42U por defecto, llama apersistRack()constylePropsstatic/js/blueprints/helpers/StencilPanel.js:ensureSet()inicializa índice para llamadas externasstatic/js/blueprints/map_editor.js:persistRack()aceptastyleProps- Catálogo de stencils regenerado:
static/stencils/floorplan.json+ otros
Versión
config/settings/base.py:APP_VERSION = "1.48.0"README.md: v1.48.0CHANGELOG.md: entrada [1.48.0] con secciones Fixed + AddedRELEASE_NOTES.md: entrada nueva con detalle técnico
Testing
- ✅ Test backend nuevo (blueprints suite 4/4 verde)
- ✅ E2E verificado en local:
- Drop de stencil de rack → rack real en BD
- Visual de stencil + etiqueta debajo
- Rename con doble clic
- Drag con cables (rack_connection)
- Persistencia tras reload
Notas
- Sin strings i18n nuevos (los stencils ya están en el catálogo)
- Los racks antiguos con rectángulo NO cambian (rama clásica intacta)
- Fallback gracioso: si el catálogo de stencils no carga, RackTool crea el rack con rect clásico
- Futura integración con Rack Editor: cables ya soportan
rack_connectioncon color de estado
Véase también
- [[concept—blueprints—map-editor]]
- [[crearack—blueprints—que-es-map-editor]]
- [[concept—producto—map-editor-autoplan-mas-seguro]]
- [[entity—blueprints—endpoint—create-rack-in-blueprint]]
- [[entity—blueprints—model—placement-input-schema]]