Volver a la wiki

Endpoint: POST /auto-provision/assign-types

Descripción general

Endpoint que materializa la asignación de destino de dispositivos desde el Step 2 del wizard de Auto-Provision. Persiste el campo device_type en lote sobre varios DeviceProfile de una org.

POST /api/network/auto-provision/assign-types

Funcionalidad clave: permite cambiar en una pasada el destino (p.ej. de “router” a “wireless_controller”) de múltiples perfiles descobertos, consolidando toda la intención en un único request.

Parámetros

Request

Headers requeridos:

Authorization: Bearer <token>
Content-Type: application/json

Body (JSON):

{
  "assignments": [
    {
      "profile_id": 42,
      "device_type": "wireless_controller"
    },
    {
      "profile_id": 43,
      "device_type": "access_point"
    },
    {
      "profile_id": 44,
      "device_type": "ups"
    }
  ]
}

Tipos válidos (ASSIGNABLE_TYPES):

El endpoint no valida contra DeviceProfile.DEVICE_TYPE_CHOICES porque Django no lo hace en .update(), y el discovery ya usa estos valores. Validación en cliente (wizard).

Response

HTTP 200 — Éxito:

{
  "updated": 3
}

HTTP 400 — Error (tipos inválidos, org no encontrada):

{
  "error": "Invalid device_type(s): fake_type, another_bad"
}

o

{
  "error": "No organization found"
}

Seguridad & Multi-tenancy

Lógica interna

  1. Valida que todas las device_type estén en ASSIGNABLE_TYPES.
  2. Agrupa assignments por device_type.
  3. Un UPDATE por tipo (no per-profile, para eficiencia):
    DeviceProfile.objects.filter(organization=org, id__in=ids).update(device_type=device_type)
  4. Anota la acción en el log: "NETWORK" / "auto_provision.assign_types" / "N profiles".
  5. Retorna count de filas actualizadas.

Impacto aguas abajo

Una vez actualizado el device_type:

Ejemplos de uso

Caso 1: Asignar varios switches de golpe

POST /api/network/auto-provision/assign-types
{
  "assignments": [
    {"profile_id": 10, "device_type": "switch"},
    {"profile_id": 11, "device_type": "switch"},
    {"profile_id": 12, "device_type": "switch"}
  ]
}
→ 200 OK: {"updated": 3}

Caso 2: Mezcla de tipos

{
  "assignments": [
    {"profile_id": 20, "device_type": "wireless_controller"},
    {"profile_id": 21, "device_type": "access_point"},
    {"profile_id": 22, "device_type": "ups"}
  ]
}
→ 200 OK: {"updated": 3}

Caso 3: Tipo inválido

{
  "assignments": [
    {"profile_id": 30, "device_type": "invalid_type"}
  ]
}
→ 400: {"error": "Invalid device_type(s): invalid_type"}

Esquemas Pydantic

class TypeAssignment(Schema):
    profile_id: int
    device_type: str

class AssignTypesRequest(Schema):
    assignments: list[TypeAssignment]

Tests

test_network_assign_types.py — 5 tests:

  1. Asignación simple (1 perfil, 1 tipo).
  2. Asignación masiva (múltiples perfiles, múltiples tipos).
  3. Validación de tipo inválido.
  4. RLS: usuario no puede tocar otros perfiles de org ajena.
  5. Sin org → 400.

Notas de implementación

Véase también

Subir