CreaRack-SL

Modelo DCIM: Sala → Fila → Rack (invariantes y trampas)

Conceptoactiveverificado 2026-08-23#dcim#blueprint#room#row#sala#fila#plano#floorplan

Modelo DCIM: Sala → Fila → Rack

Nace de la ronda del 23-08-2026 (task #253): bib_ask sobre los invariantes de Blueprint/Room/Row devolvía 0 chunks — estas reglas solo vivían como comentarios en el código. Esta página los destila. Verificado contra v1.82.x.

Las tres caras de un mismo modelo

Blueprint es UN solo modelo con tres modos (Blueprint.mode):

modeQué esQué colocaPágina propia
map (default)plano de planta clásicoracks, vía BlueprintPlacement/blueprints/<id>
rowuna Fila de racks (línea de CPD)racks, vía BlueprintPlacement/rows/<id> (la vista exige mode="row" — un id de otro modo da 404)
roomuna Sala (plano que contiene Filas)FILAS, vía RoomRowPlacement(room, row, pos_x, pos_y, rotation)sección Rooms del dashboard

Invariantes que el código exige:

  • Una Sala NO coloca racks directamente: sus racks son los de sus Filas. Por eso una Sala no aparece en el {% regroup %} de racks del dashboard — se lista aparte (racks/views.py, sección Rooms con row_count/rack_count anotados).
  • Una Fila puede colocarse en varias Salas (RoomRowPlacement es N:M con posición); los racks viven en la Fila, no en la colocación.
  • La sección de un rack en el dashboard = el blueprint de su PRIMERA colocación activa (placements con blueprint no borrado, orden por pk). Sin colocación → “No Map”. La misma regla la usa el inventario del backup (backup_selection.py).
  • Borrar una Fila manda sus racks a la papelera SOLO si ningún otro placement activo los referencia (blueprints.py, delete): un rack colocado además en un mapa sobrevive.

Trampas conocidas (todas mordidas)

  • Clonado (task #253, arreglado en v1.82.4): el clon debe conservar mode y, en Salas, replicar las RoomRowPlacement. Clonar una Fila se RECHAZA (400): los BlueprintPlacement copiados apuntarían a LOS MISMOS Rack — racks compartidos entre dos filas rompen el borrado y el 404 de /rows/. El clon real de racks es clone_rack_in_row (página de la Fila).
  • El dashboard agrupa secciones por NOMBRE de blueprint, no por id (racks/views.py racks_by_group[blueprint_name] + dashboard_sections.build_sections): dos planos con el mismo nombre en la misma org se fundirían en una tarjeta. Blueprint.name NO tiene unique. Hoy sin colisión en PROD; el cambio a id está APLAZADO a conciencia (toca la caché de roll-ups + plantilla; task #253).
  • Fondos de plano (task #252, v1.82.4): viven en uploads/blueprints/<org_id>/ con nombre bp{id}_{slug}_{ts}; los legacy de la carpeta plana pueden estar COMPARTIDOS entre organizaciones (los creó el restore) — jamás borrarlos desde código de request (el RLS impide ver las referencias de otras orgs); limpieza: comando cleanup_blueprint_backgrounds (manual, dry-run por defecto).
  • Auto-Plan escribe la imagen ANTES de encolar el análisis; si la task falla, _cleanup_failed_upload recoge el fichero (si nada lo referencia — la task Huey corre con bypass RLS y sí ve todas las orgs).

Véase también

  • [[crearack—racks—filas-row]]
  • [[crearack—blueprints—crear-plano]]