Contrato
GET /api/racks/{id}
Devuelve el rack completo, incluidos los límites de capacidad (nuevos en v1.57.0).
Response (RackSchema):
{
"id": 1,
"name": "Rack A",
"location": "Data Center Room 1",
"height_u": 42,
"status": "active",
"power_consumption": 2.5,
"max_power_w": 3500, # ← NUEVO: vatios máximos (0 = sin límite)
"max_weight_kg": 800, # ← NUEVO: kg máximos (0 = sin límite)
"notes": "Production rack",
"deleted_at": null,
"is_template": false,
"devices": [...]
}
PUT /api/racks/{id}
Actualiza metadatos del rack. Los campos max_power_w / max_weight_kg son opcionales (exclude_unset: no se pisan si no vienen en el payload).
Request (RackInputSchema):
{
"name": "Rack A Updated",
"location": "New Location",
"height_u": 48,
"status": "active",
"power_consumption": 2.5,
"max_power_w": 4000, # ← NUEVO: opcional
"max_weight_kg": 1000, # ← NUEVO: opcional
"notes": "Updated notes"
}
Valores especiales:
max_power_w: 0omax_weight_kg: 0→ sin límite definido (los avisos no se colorean en ámbar/rojo).- Campo ausente en PUT → mantiene su valor anterior (protegido por
exclude_unseten el schema).
Comportamiento
- Persistencia:
racks/services/racks.py→update_rack()/create_rack()escriben los valores en la BD. - Validación: números no negativos (min=0). No hay validación cruzada (ej. no se chequea si
max_power_w < consumo_actualal guardar). - Schema: la exposición la hace
RackSchema(GET) /RackInputSchema(PUT). - Modal Rack Information: el frontend lee/escribe estos campos via el endpoint.
Fuentes de datos
- Lectura:
Rack.max_power_w/Rack.max_weight_kg(migration 0013). - Escritura:
RackService.create_rack(data)— extrae dedata.get("max_power_w")/data.get("max_weight_kg").RackService.update_rack(rack_id, org, data)— aplica setattr si el campo está endata.RackService.update_rack_metadata(rack, data)— lo mismo para updates directas.
Lado frontend
File: static/js/editor/ui_panels.js → initRackInfoModal().
- Lectura inicial:
STATE.rackData.max_power_w/STATE.rackData.max_weight_kg→ inputs#modal-rack-max-power/#modal-rack-max-weight. - Guardado: extrae valores al hacer click en “Save”, construye payload con los límites, envía PUT a
/api/racks/{id}. - Efecto: tras guardado exitoso, llama a
updatePowerRollup()para repintar los badges del editor (reflejando los nuevos límites).
Responsabilidades (DCIM #134)
| Componente | Qué hace |
|---|---|
| RackSchema | Expone max_power_w / max_weight_kg en GET. |
| RackInputSchema | Define max_power_w / max_weight_kg como float | None (opcional en PUT). |
| RackService | Valida/asigna límites al crear/actualizar. |
| update_rack() | Protege límites con exclude_unset (no pisa anteriores si no vienen en payload). |
| templates/editor.html | Inputs en el modal con data-max-power-w / data-max-weight-kg. |
| ui_panels.js | Lee/escribe limite via el modal; dispara updatePowerRollup() al guardar. |
Véase también
- [[feature—racks—capacidad-por-rack]] — feature global (v1.57.0)
- [[entity—racks—model—rack]] — modelo Rack + campos max_power_w / max_weight_kg
- [[entity—racks—service—update-power-rollup]] — función que colorea badges según estos límites
- [[entity—racks—service—racks-service]] — RackService que gestiona create/update