Volver a la wiki

Servicio de secciones del Dashboard (drag&drop)

Ubicación

racks/services/dashboard_sections.py

Descripción

Lógica compartida de ordenamiento de las secciones del Dashboard (Rooms, Maps/Rows, No Map). Proporciona la lista tipada de secciones ordenadas, consumida tanto por el render completo (racks/views.index) como por el partial HTMX (core/htmx_views.racks_list).

El servicio abstrae los dos mecanismos de persistencia:

Introducido en: v1.51.0 (2026-07-13), como refactor de la lógica de reorden manual ({% regroup %} → lista tipada compartida).

Funciones públicas

build_sections(racks_by_group, group_rollups, org_id, rooms=None) → list[dict]

Construye la lista ordenada de secciones para los templates del Dashboard.

Parámetros:

Retorna: Lista de dicts tipados {"kind": str, "key": str, "sort": tuple, ...} ordenada por s["sort"].

Tipos de sección:

Orden de secciones: Determinado por el campo sort de cada sección, tupla (prioridad, índice_manual, aux, nombre):

int_pref(org_id: int, key: str) → int | None

Lee una preferencia de organización como entero, saltando el L1 (Valkey) si falla o corrupción.

Fuente de datos: OrgUIPreference.objects.filter(organization_id=org_id, user__isnull=True, key=key). Solo prefs de organización (no de usuario).

Retorna: Valor entero o None si no existe, no es parseable, u org_id es None.

section_sort_key(kind: str, sort_value: int | None, name: str = "") → tuple

Tupla de orden uniforme para los tres tipos de sección.

Parámetros:

Retorna: (prioridad, índice, secundaria, nombre_lower) para sort estable.

Constantes

Fuentes de datos

DatoOrigenModelo
Posición manual de blueprintsBlueprint.sort_orderblueprints.models.Blueprint
Posición manual de RoomsOrgUIPreference.value con key=dashboard_rooms_sortcore.models_prefs.OrgUIPreference
Posición manual de No MapOrgUIPreference.value con key=dashboard_nomap_sortcore.models_prefs.OrgUIPreference
Racks agrupadosParámetro racks_by_group (pre-filtrados y agrupados en la vista)racks.models.Rack
Salas (Rooms)Parámetro rooms (pre-filtradas por org)blueprints.models.Room (DCIM)
Métricas agregadasParámetro group_rollupsCálculo en racks/views.py → calculate_group_rollups()

Consumidores

Comportamiento por defecto (sin reorden previo)

Si una organización nunca ha arrastrado las secciones (no existen ui_prefs), el orden es:

  1. Rooms (si hay salas)
  2. Blueprints en orden manual (sort_order), y los sin ordenar alfabéticamente
  3. No Map (racks sin blueprint)

El servicio no crean ui_prefs automáticamente; el endpoint POST /api/blueprints/reorder es el que las escribe al arrastrar.

Detalles de implementación

build_sections() workflow

  1. Emite la sección Rooms (si rooms proporcionado).
  2. Itera racks_by_group, saltando la clave "" (No Map).
  3. Para cada grupo (blueprint):
    • Ordena internamente los racks por nombre.
    • Obtiene el primer rack para extraer blueprint_id, blueprint_sort, blueprint_mode.
    • Emite un dict de sección “bp”.
  4. Emite la sección No Map (con los racks de clave "").
  5. Ordena el listado por campo sort (tupla de orden).
  6. Retorna el resultado.

Caché en tests

Detalle cazado en tests: el L1 (Valkey) de ui_prefs sobrevive entre tests, y los ids de Organization se reutilizan al resetear la BD. Los asserts sobre prefs deben leer PostgreSQL directo (_pref_db helper) en lugar de get_ui_pref.

Véase también

Subir