Volver a la wiki

Schema: PlacementInputSchema — parámetros de creación/actualización de placements

Identificación

Módulo: blueprints/api/schemas.py
Clase: PlacementInputSchema
Frameworkw: Ninja (Django REST framework compatible)
Versión introducida: v1.0.0
Última modificación: v1.48.0 (2026-07-10)

Descripción

Schema (Data Transfer Object) que valida y serializa los parámetros de entrada para operaciones sobre BlueprintPlacement (colocación de objetos en el mapa). Se usa en endpoints como:

Estructura

class PlacementInputSchema(Schema):
    x: float                   # Coordenada X en el canvas
    y: float                   # Coordenada Y en el canvas
    rotation: int | None = 0   # Rotación en grados (0–360). Default: 0
    style_props: str | None = "{}"
                               # JSON string con propiedades visuales (color, tamaño, etc.)
                               # Ej: '{"color": "#ff9900", "width": 120, "height": 35}'
    
    # v1.48.0 (NEW)
    name: str | None = None    # Nombre inicial del objeto (para racks) o etiqueta
                               # Máx 100 caracteres tras limpieza
                               # Si se omite: default depende del endpoint

Campos

x: float (requerido)

y: float (requerido)

rotation: int | None (opcional)

style_props: str | None (opcional)

Nota importante: se almacena como string en la BD (campo style_props: CharField en BlueprintPlacement), no como JSON serializado. El frontend es responsable de hacer JSON.stringify() antes de enviar.

name: str | None (v1.48.0 — nuevo)

Validación

La validación ocurre en dos capas:

Capa Ninja/OpenAPI

Capa de controlador

Ejemplos de uso

Crear un rack con stencil (v1.48.0)

POST /api/blueprints/5/rack
Content-Type: application/json

{
  "x": 100.5,
  "y": 250.0,
  "rotation": 0,
  "name": "42U Rack Custom",
  "style_props": "{\"stencil\": {\"shapeId\": \"42u-rack-19-standard\", \"svg\": \"<svg>...</svg>\"}, \"width\": 40, \"height\": 150}"
}

Crear un rack clásico (rect)

POST /api/blueprints/5/rack
Content-Type: application/json

{
  "x": 300.0,
  "y": 400.0,
  "name": "Rack 2",
  "style_props": "{}"
}

→ Sin stencil, el endpoint crea el rack y el frontend lo pinta como rectángulo clásico.

Crear un placement genérico (dibujo)

POST /api/blueprints/5/placements
Content-Type: application/json

{
  "x": 50.0,
  "y": 100.0,
  "rotation": 45,
  "style_props": "{\"color\": \"#ff9900\", \"width\": 120, \"height\": 35}"
}

Cambios en v1.48.0

Lo nuevo: campo name

Motivación: El endpoint POST /api/blueprints/{bp_id}/rack necesitaba una forma de especificar el nombre inicial del rack sin hacer una llamada adicional de rename.

Impacto:

Flujo del Map Editor (v1.48.0)

  1. Usuario suelta un stencil de rack (ej: 42u-rack-19-standard)
  2. Frontend: StencilRenderer.insertRackStencil() → construye payload con:
    • name: shape.name (del catálogo de stencils)
    • x, y: posición del drop
    • style_props: JSON con stencil: { shapeId, svg }
  3. POST /api/blueprints/{bp_id}/rack con este payload
  4. Backend: crea Rack con nombre limpio (máx 100 chars) + almacena stencil en style_props
  5. Frontend: recibe la respuesta y pinta el visual con MapRacks.createRackNode()

Ubicación y referencias

Testing

Notas

Véase también

Subir