Contexto
Signage arrastraba dos sistemas de portal para clientes externos:
- El vivo:
ClientProjectcon su enlace público/client/<token>ensignage/views.py— usado, deployado en PROD. - El muerto:
ClientShareLink+PortalChangeLog(share links con niveles de permiso, cola de aprobaciones, auditoría) — nunca tuvo interfaz (0 referencias en JS/templates) y nunca tuvo datos (0 filas en ambas tablas tras auditoría en PROD).
El portal muerto comprendía:
- 22 endpoints API repartidos en 3 módulos:
share_links.py(6 endpoints),portal.py(12 endpoints),approvals.py(4 endpoints). - ~1.030 líneas de código en total.
- 2 modelos Django:
ClientShareLink(link compartible UUID),PortalChangeLog(auditoría + cola de aprobación). - 2 admin classes para gestión manual.
- Tests dedicados que solo ejercitaban estos endpoints (retirados junto con la feature).
Decisión
Retirado entero el 14 de agosto de 2026 (v1.66.18) — decisión de Edu tras task #226, punto 6.
Justificación:
- ✅ Cero datos: Auditoría verificó 0 filas en PROD antes de cortar.
- ✅ Cero interfaz: Ningún componente JS/template referenciaba el portal muerto.
- ✅ Arquitectura más clara: Un único portal (
ClientProject) en lugar de dos. - ✅ Menor carga de mantenimiento, auditoría y seguridad.
- 🔮 Reversible: Si en el futuro se necesitan niveles de permiso + cola de aprobaciones para el portal vivo, se construirá sobre
ClientProject.
Detalles de Implementación
Migración signage 0016
La migración depende explícitamente de core 0031 porque:
- Las migraciones core 0017, 0019 y 0022 crean políticas RLS sobre estas tablas por SQL crudo.
- En BD fresca, el DROP debe ir después de la limpieza de policies de core.
- La política dependía de
organization_id— se tumba antes del DROP COLUMN (errorDependentObjectsStillExistcazado en desarrollo).
Orden correcto:
- Core 0031 + policies cleanup.
- Signage 0016 → DROP de tablas
ClientShareLinkyPortalChangeLog.
Archivos Modificados
Eliminados:
signage/api/approvals.py(239 líneas)signage/api/portal.py(552 líneas)signage/api/share_links.py(~6 endpoints)signage/models_portal.py(eliminado, era módulo dedicado)
Modificados:
signage/api/__init__.py— quita imports de los 3 routers eliminados.signage/admin.py— quita 2 @admin.register classes.context/agents/dev-signage.md— actualiza ficha (documenta la retira).- Bump versión:
config/settings/base.py,README.md,CHANGELOG.md,RELEASE_NOTES.md→ v1.66.18.
Impacto en Usuario
Ninguno visible — el portal muerto nunca llegó a producción. Los clientes externos que usaban ClientProject no ven cambio.
Aprendizajes
Este cambio ilustra auditoría preventiva: antes de retira, se verificó la carga de datos real. Sin datos + sin interfaz = seguro retira. Patrón aplicable a otras features expertas o obsoletas en el grafo de Signage.
Véase también
- [[concept—saas—multi-tenancy]] — RLS e isolation del portal cliente en multi-tenancy
- [[incident—20260609—audit-suprema-signage]] — auditoría que provocó esta decisión (hallazgos R3 en portal)
- [[decision—20260403—multi-tenancy-rls]] — decisión arquitectónica de RLS que afecta a las políticas eliminadas