CreaRack-SL

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: 0 o max_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_unset en el schema).

Comportamiento

  1. Persistencia: racks/services/racks.py → update_rack() / create_rack() escriben los valores en la BD.
  2. Validación: números no negativos (min=0). No hay validación cruzada (ej. no se chequea si max_power_w < consumo_actual al guardar).
  3. Schema: la exposición la hace RackSchema (GET) / RackInputSchema (PUT).
  4. 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 de data.get("max_power_w") / data.get("max_weight_kg").
    • RackService.update_rack(rack_id, org, data) — aplica setattr si el campo está en data.
    • 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)

ComponenteQué hace
RackSchemaExpone max_power_w / max_weight_kg en GET.
RackInputSchemaDefine max_power_w / max_weight_kg como float | None (opcional en PUT).
RackServiceValida/asigna límites al crear/actualizar.
update_rack()Protege límites con exclude_unset (no pisa anteriores si no vienen en payload).
templates/editor.htmlInputs en el modal con data-max-power-w / data-max-weight-kg.
ui_panels.jsLee/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