CreaRack-SL

Clonar un rack de la Fila con un clic (v1.78.0)

Qué es

Un botón Clone en los controles bajo cada rack de la página de una Fila (/rows/<id>), junto a Left/Right/Delete. Duplica el rack seleccionado con todos sus dispositivos y coloca la copia al final de la línea.

Por qué

Antes de esta versión, clonar un rack completo con su equipamiento solo era posible desde el dashboard (POST /api/racks/{id}/clone). En una Fila, donde varios racks suelen compartir el mismo esquema de montaje, había que repetir manualmente cada equipo rack a rack. El botón Clone acerca esa capacidad al flujo de trabajo de la Fila.

Cómo funciona

Interfaz

  • Los controles bajo cada rack pasan de 3 a 4 botones: Left (--success) / Right (--warning) / Clone (--info) / Delete (--danger).
  • El botón Clone está siempre habilitado (a diferencia de Left/Right, que se desactivan en los extremos de la línea).

Backend

  • La lógica de clonado se extrajo del handler POST /api/racks/{id}/clone a RackService.clone_rack(original, organization) (racks/services/racks.py:126) — copia el rack (metadata + límites de capacidad/peso) y todos sus dispositivos con bulk_create, e invalida los rollups del dashboard.
  • El clon copia el montaje físico de cada dispositivo (posición, altura, notas, stencil), NO su management_config — el clon nace con management_config="{}", igual que ya hacían “Copy from…” y los Masters (racks/services/copy_from.py). Fix v1.96.0 (Tanda 7, #482): antes el clon heredaba la IP de gestión cifrada del original sin pasar por check_duplicate_management_ip, así que había dos dispositivos con la misma IP — y como la papelera de dispositivos (v1.87.0) resuelve por IP en toda la organización, retirar el clon borraba también el equipo ORIGINAL, su ficha y su histórico de métricas.
  • Nuevo método BlueprintService.clone_rack_in_row(blueprint, rack_id) (blueprints/services/blueprints.py:255) localiza el rack dentro de la fila, delega el clonado en RackService.clone_rack y coloca el nuevo placement al final de la línea (pos_x del último rack + 80px).
  • Nuevo endpoint POST /api/blueprints/{id}/row/clone-rack/{rack_id} (blueprints/api/blueprints.py:152): exige permiso blueprints.edit, filtra por organización y mode="row", y devuelve 404 si el blueprint o el rack no pertenecen a la fila.
  • El endpoint original POST /api/racks/{id}/clone ahora delega en el mismo RackService.clone_rack — misma lógica, sin duplicación.

Frontend

  • cloneRack(rackId) en static/js/rows/row_actions.js llama al endpoint y recarga la página al terminar.
  • static/js/rows/row_view.js añade el botón Clone (color --info) al layout de controles del canvas (Konva.js).

Tests

2 tests nuevos en TestRowRackOps (tests/api/test_blueprints.py) cubren el clonado dentro de la fila. tests/api/test_tanda7_correctness.py cubre el fix de v1.96.0 (el clon no duplica la IP de gestión).

Traducción

Aprovechando el cambio, entraron al catálogo español los 29 strings de la página de la Fila que nunca se habían traducido (20 del template, 9 de los módulos JS) — hueco heredado de DCIM Fase 2. La página se veía en inglés aunque el idioma estuviera en español.

Commits relacionados

  • 7ab3309f (2026-08-21, v1.78.0) — este cambio: botón Clone + RackService.clone_rack + endpoint + i18n de la página de la Fila.
  • 120b0bf8 (2026-08-31, v1.96.0) — fix(correctness): Tanda 7 auditoría (#482). clone_rack deja de copiar la IP de gestión del original, cerrando el camino que hacía que retirar el clon borrase el equipo original.

Impacto en usuario

  • Botón Clone visible en toda página de Fila, sin flag ni configuración.
  • El clon aparece siempre al final de la línea, con todos los dispositivos del original en su misma posición física, pero sin la configuración de gestión (IP/credenciales) del original — hay que configurarla aparte si el clon es un equipo real y no una plantilla de montaje.
  • La página de la Fila queda ya completamente en español cuando el idioma está en español.

Véase también

  • [[entity—racks—model—rack]]
  • [[entity—racks—model—device]]
  • [[entity—blueprints—model—blueprint]]
  • [[feature—racks—stencil-toggle-row-view]]
  • [[concept—racks—editor]]
  • [[concept—general—que-funcionalidades-dcim-tiene-crearack-hoy-en-pro]]
  • [[concept—saas—multi-tenancy]]