CreaRack-SL

Papelera de dispositivos: borrar de todas partes y restaurar desde la Home

User value

Hasta la v1.87.0, borrar un dispositivo desde Wireless, UPS, Digital Signage u Observatory era definitivo: no había forma de recuperarlo. Solo racks y planos tenían papelera. Ahora un dispositivo borrado desde cualquier lista — la × de Wireless/UPS/Signage/Observatory, el botón Delete de la página Devices, o el hueco que deja al retirarlo del Rack Editor y guardar — cae en la pestaña Devices de la papelera de la Home, junto a Racks y Blueprints, y se puede restaurar con un clic.

Cómo usarla

  1. Borrar un dispositivo desde cualquiera de sus superficies habituales (lista, tarjeta, o retirándolo del Rack Editor y guardando el rack).
  2. Abrir Trash en la Home → pestaña Devices. Cada fila muestra nombre, IP y qué contenía la instantánea (ficha, monitorización, rack de origen) más la fecha de borrado.
  3. Restaurar: recrea la ficha, reactiva la monitorización y, si el rack de origen sigue existiendo, lo devuelve a su posición. Cada pieza puede omitirse por separado — si algo con esa IP ya existe (p. ej. se re-descubrió mientras tanto) o si la posición U original ya no está libre (el hueco se ocupó, o el rack encogió), esa parte se deja intacta y se omite. El histórico de métricas no vuelve. Desde v1.96.0: si TODO se omite, la entrada ya no se destruye — sigue en la papelera y el resultado dice "could not be restored" con el detalle de qué se saltó, en vez de responder "Device restored" sin haber recreado nada.
  4. Eliminar permanentemente o Vaciar la papelera: borra la entrada (y con ella la instantánea) sin posibilidad de deshacer.

Implementación

  • Modelo: [[entity—network—model—devicetrashentry]] — instantánea JSON de las tres caras del dispositivo (ficha + targets + colocaciones en rack).
  • Servicio network/services/device_trash.py: trash_device() (borra de verdad tras snapshot) y restore_entry() (recrea lo que no exista ya; solo borra la entrada si recreó algo — fix v1.96.0).
  • Entrada backend: POST /api/network/device-trash (network/api/device_trash.py, función trash_device_everywhere) — llamado desde las listas de dispositivos y desde racks/services/racks.py al guardar un rack que retira dispositivos.
  • Endpoints de papelera: racks/api/trash.py amplía el router ya existente de Racks/Blueprints con GET /api/trash/devices, POST /api/trash/devices/{id}/restore, DELETE /api/trash/devices/{id} y DELETE /api/trash/devices; GET /api/trash/count suma ahora devices al total. Desde v1.96.0, el restore devuelve success: false (200, no error) cuando no se recreó nada.
  • Frontend: helper compartido static/js/utils/deviceTrash.js consumido por static/js/pages/{wireless,ups,signage,observatory,devices}.js y por static/js/editor/devices.js (aviso en el Rack Editor); plantilla templates/htmx/trash/devices.html para la pestaña de la Home.
  • Migraciones: network/migrations/0062_devicetrashentry.py (tabla) + 0063_devicetrashentry_rls.py (Row Level Security por organización, ver [[concept—saas—multi-tenancy]]).
  • Tests: tests/api/test_device_trash.py, 11 casos; más tests/api/test_tanda7_correctness.py para el fix de v1.96.0 (restore que no destruye, y validación de solape con racks.utils.placement.validate_device_placements).

Límite conocido

El aviso en pantalla de un restore fallido (camino HTMX) todavía no tiene un listener JS dedicado — el backend ya distingue éxito de “se quedó en la papelera”, pero la UI no lo refleja aún de forma visible. Documentado en el CHANGELOG de v1.96.0 como pendiente para la pasada de UI.

Commits relacionados

  • 991773bd (29-08-2026) — feat(network+ui): papelera de dispositivos — v1.87.0 (#470). Commit único que introduce modelo, servicio, endpoints, UI y tests.
  • 120b0bf8 (31-08-2026) — fix(correctness): Tanda 7 auditoría — v1.96.0 (#482). Restaurar ya no destruye la instantánea si no recreó nada (antes se borraba siempre y respondía “restored” igual), y ya no recrea un equipo encima de otro si el hueco se ocupó o el rack encogió.

Véase también

  • [[entity—network—model—devicetrashentry]]
  • [[entity—network—model—deviceprofile]]
  • [[entity—monitoring—model—monitoringtarget]]
  • [[entity—racks—model—device]]
  • [[crearack—network—device-page]]
  • [[crearack—racks—trash-and-restore]]
  • [[concept—saas—multi-tenancy]]