Volver a la wiki

Feature s115: Búsquedas guardadas persistidas en BD

Resumen Ejecutivo

Sesión: 115 (2026-06-08)
Ámbito: Auto-Provision · Producto
Estado: Merged (commit@1cd2537)
Autor: Edu (con Claude Code Opus)
Cierra: Parte 4 de la iniciativa Auto-Provision (no desperdiciar búsquedas)

Lo que cambia

Las búsquedas de escaneo que guardabas en Auto-Provision se guardaban en el navegador, así que al limpiar la caché o recargar la página a veces desaparecían y el botón “Load Previous Results” decía que no había ninguna (reporte de Edu).

Ahora se guardan en la base de datos, de forma que no se pierden, y además las ve todo tu equipo (cualquier compañero de la misma organización). Se conservan las 20 más recientes por org.

El aspecto y el funcionamiento del listado son los mismos; solo cambia dónde se guardan — de localStorage a BD.


Antecedente: Parte 4a (s114)

La sesión 114 (2026-06-08) añadió el botón “Refresh” por dispositivo en el Step 3, que permite reutilizar las credenciales para recomprobar un dispositivo sin volver al Step 1. La s115 cierra la Parte 4 añadiendo persistencia de búsquedas.


Cambios Técnicos

Modelo Nuevo: network.ScanSession

API REST: /auto-provision/scans

Router: network/api/scan_sessions.py

Operaciones:

MétodoURLPermisosDescripción
GET/auto-provision/scansnetwork.viewLista búsquedas de la org (máx 20, recientes primero)
POST/auto-provision/scansnetwork.editCrea una búsqueda. Poda automáticamente si ≥20.
DELETE/auto-provision/scans/{id}network.editBorra una búsqueda. RLS: solo si pertenece a la org.

Esquemas Ninja:

RLS: Aislamiento completo por organización. Un usuario solo ve/modifica búsquedas de su org.

Frontend: static/js/network/auto_provision/sessions.js

Cambios principales:

AntesDespués
localStorage["auto_provision_scans"]GET /api/network/auto-provision/scans
_getSavedScans() → JSON en localStorageloadSavedProfiles() → API call
_saveScanSession() → localStorage.setItem_saveScanSession() → POST /auto-provision/scans
_deleteSavedScan(index) → localStorage.splice_removeScanByIndex(index) → DELETE /auto-provision/scans/{id}

Caché local:

Escaneo interrumpido (transitorio):

Auditoría


Comportamiento Específico

Compartición a Nivel Organización

Límite de 20 por Organización

  1. Al crear una nueva búsqueda, se cuenta cuántas hay.
  2. Si ya hay 20, se podan las más antiguas (hasta quedarse con 20 recientes).
  3. Responsable: lógica en el handler POST (no es automático a nivel DBMS).

Integridad de Perfiles

Validación de Perfiles en Cross-Tenant


Tests

Archivo: tests/api/test_network_scan_sessions.py (10 tests)

Cobertura:

✅ Permisos RLS:

✅ Creación:

✅ Listado:

✅ Borrado:


Archivos Modificados

ArchivoCambioDescripción
network/models.pyAddedNuevo modelo ScanSession (36 líneas)
network/migrations/0048_scansession.pyAddedMigración Django (53 líneas)
network/api/scan_sessions.pyAddedRouter y handlers (103 líneas)
network/api/__init__.pyModifiedImporta nuevo router
static/js/network/auto_provision/sessions.jsModifiedMigra localStorage → API (~100 líneas)
CHANGELOG.mdModifiedEntrada s115
RELEASE_NOTES.mdModifiedNota para usuarios (s115)
context/agents/dev-auto-provision.mdModifiedSección “Persistencia de sesiones” actualizada
tests/api/test_network_scan_sessions.pyAdded10 tests unitarios (103 líneas)

Total LOC: ~250+ (código + tests + migraciones)


Impacto en UX


Backward Compatibility


Relación con Otras Features


Próximos Pasos (No Incluidos en s115)


Historial de Cambios


Véase también

Subir