CreaRack-SL

Remate de capacidad: vatios unificados, totales visibles y reporte con límites (v1.57.1)

Resumen

Cierre de la feature DCIM #134 iniciada en v1.57.0. Tras el click-test de Edu, se unifican las unidades (W), se visualizan los totales reales de equipos en el modal de información del rack, y se incorpora la capacidad al Project Report (PDF imprimible) con indicadores visuales (ámbar ≥90%, rojo si se supera).

Cambios principales

1. Unidad de potencia unificada a vatios (W)

Contexto: El campo power_consumption del modelo Rack tenía la etiqueta “kWh” en la UI, pero el motor de rollup (racks/services/rollup.py) siempre lo trató como W. La confusión ocurrió en v1.57.0 cuando el usuario Edu imprimió el reporte y vio datos incoherentes.

Solución:

  • Cambio de etiqueta en templates/editor.html línea ~368: "Kwh" → "W" (sin modificar datos).
  • Ajuste del comentario en racks/models.py (línea ~79) aclarando que es W, no kWh.
  • No hay migración de datos — el consumo nominal siempre fue en vatios internamente.

Impacto: Usuarios ven ahora “W” tanto en el editor como en los badges de cabecera de equipos.

2. “Devices total” en el modal Rack Information

Contexto: Cuando el usuario editaba los límites de potencia/peso del rack, no podía ver en tiempo real el Σ de sus equipos. Debía salir del modal, revisar badges, volver a entrar.

Solución:

  • Nueva función getCapacityTotals() en static/js/editor/devices.js (líneas ~260-271) que centraliza el cálculo de W, kg, U ocupadas.
  • Refactor: updatePowerRollup() ahora usa getCapacityTotals() internamente (paridad con racks/services/rollup.py).
  • En ui_panels.js, al abrir el modal, se rellena #modal-rack-devices-total con el formato: "350 W · 82 kg · 12/42U".
  • Template editor.html (línea ~367) añade nueva fila: <div style="font-size: 0.9rem;"><strong>Devices total:</strong> <span id="modal-rack-devices-total">—</span></div>.
  • Traducción ES en locale/es/LC_MESSAGES/django.po: “Devices total:” → “Total de los equipos:”.

Impacto: El usuario ve en vivo el consumo total al fijar límites.

3. Capacidad en el Project Report (/report)

Contexto: v1.57.0 añadió validación de capacidad en el PDF por-rack (endpoint /api/racks/{rack_id}/pdf). Pero el “Project Report” (la vista /report que genera un PDF con todos los racks) se quedó sin esta información. El click-test de Edu imprimió /report, no el PDF individual, y faltaban los datos.

Solución:

  • Nuevo código en core/views.py (líneas ~238-260):

    • Función helper _capacity_state(used, limit) que retorna estado CSS: "" (OK), "warn" (≥90%), "over" (>100%).
    • Loop sobre racks asignando rack.capacity (dict con used_u, power_w, weight_kg, capacity_u, pct_u, etc.) usando rack_rollup().
    • Tres campos de estado: capacity_space_state, capacity_power_state, capacity_weight_state.
  • Template report.html (líneas ~62-65) añade tres nuevas filas en la cabecera de cada rack:

    <div class="info-item cap-{{ rack.capacity_space_state|default:'ok' }}"><strong>Space:</strong> {{ rack.capacity.used_u }}/{{ rack.capacity.capacity_u }}U ({{ rack.capacity.pct_u }}%)</div>
    <div class="info-item cap-{{ rack.capacity_power_state|default:'ok' }}"><strong>Power:</strong> {{ rack.capacity.power_w|floatformat:"0" }} W{% if rack.max_power_w %} / {{ rack.max_power_w|floatformat:"0" }} W{% endif %}</div>
    <div class="info-item cap-{{ rack.capacity_weight_state|default:'ok' }}"><strong>Weight:</strong> {{ rack.capacity.weight_kg|floatformat:"1" }} kg{% if rack.max_weight_kg %} / {{ rack.max_weight_kg|floatformat:"0" }} kg{% endif %}</div>
  • Estilos CSS en report.html (líneas ~246-249):

    .info-item.cap-warn { color: #854d0e; font-weight: 600; }
    .info-item.cap-over { color: #991b1b; font-weight: 600; }

    Print-safe (no usa transparencias, colores de texto duros).

  • Traducción ES: “Space:” → “Espacio:”, “Power:” → “Potencia:”, “Weight:” → “Peso:”.

Impacto: El PDF imprimible ahora muestra capacidad con avisos visuales ámbar/rojo, alineado con el PDF por-rack.

Testing

Test nuevo en tests/api/test_rack_capacity.py (líneas ~105-122): test_project_report_includes_capacity

  • Crea un rack con límite de potencia 100 W.
  • Añade un equipo de 250 W (supera límite).
  • Verifica que el HTML del reporte contiene "cap-over" y "250 W / 100 W" y "1/42U".
  • Resultado: 7/7 tests verdes en test_rack_capacity.py.

Notas operativas

Contexto del ciclo: Las versiones v1.55.0 → v1.57.0 no llegaron a STAGE/PROD en el primer intento. Los auto-deploys de Dokploy fallaban silenciosamente en el FROM de la imagen base privada (error 401, ghcr.io login hecho en host pero el cliente de build de Dokploy corre en su container). Esto motivó:

  • Fix inmediato del build client.
  • Task #201: persistencia de credenciales de registry vía Settings.
  • Footgun documentado: footguns_dokploy_build_client_in_container_ghcr_login.

La v1.57.1 se despliega con este fix confirmado.

Versión

  • v1.57.1 — 2026-07-16
  • Anterior: v1.57.0 (2026-07-16 — misma sesión)
  • Base: DCIM #134 (capacidad per-rack, iniciado v1.57.0)

Véase también

  • [[concept—saas—multi-tenancy]]
  • [[concept—dcim—rollup]]
  • [[concept—observability—alerting]]