CreaRack-SL

resolve_signage_adapter — Resolución de adapter de marca en Digital Signage

Firma y ubicación

def resolve_signage_adapter(profile, adapters=None):
    """Resuelve el SignageVendorAdapter de un dispositivo por su vendor (auto-match).
    
    profile: SignageProfile (monitoringTarget.signage_profile)
    adapters: Optional[List[SignageVendorAdapter]] — adapters enabled precargados
    returns: SignageVendorAdapter | None
    """

Ubicación: monitoring/services/signage_service.py:97–127

Propósito

Espejo de resolve_signage_credential_id() (línea 65): implementa el matching entre el vendor del dispositivo y el registro de adapters para determinar qué API de despliegue (si alguna) está disponible.

Es el componente central que sustenta la honestidad en marcas: determina si push_implemented es verdad o la marca solo soporta monitorización.

Comportamiento

  1. Entrada: perfil de monitoreo (SignageProfile) + vendor string.
  2. Lógica de match:
    • Slug exacto: adapter.slug == vendor_slug (vendor normalizado con slugify()).
    • Nombre exacto: adapter.name.lower().strip() == vendor.lower().
    • Match parcial: vendor en nombre del adapter O slug en vendor O viceversa.
  3. Estrategia:
    • Primero match exacto (1 resultado).
    • Si hay match exacto: devolverlo.
    • Si hay match parcial: devolverlo si es único; si hay múltiples → None (no adivina).
    • Sin match: None (no fuerza).
  4. Restricción: solo adapters con enabled=True.

Cambio v1.64.0: parámetro adapters opcional

Antes: cada llamada hacía query SignageVendorAdapter.objects.filter(enabled=True).

Ahora:

  • Si se pasa adapters (precargado): úsalos directamente → evita N queries en listados.
  • Si adapters=None: comportamiento original (query única).

Impacto:

  • Vista signage_view() carga adapters una sola vez, pasa el mismo array a todos los resolver.
  • De ~500 dispositivos × 1 query cada uno → 1 query total (en el listado).
  • Tests: 5 casos de resolución verdes (sin regresión).

Consumidores

ConsumidorUbicaciónPropósito
signage_view()monitoring/views.py:445Calcula badge push/monitor en listado.
deploy logic (vía supports_real_push())signage.services.adapters.registryValida capacidad de despliegue antes de enviar contenido.
Posibles workflows internosTBDAuditoría, logs, scheduling.

Datos de origen

  • Fuente de adapters: tabla signage_vendoradapter en DB.
  • Fuente de vendor en perfil: SignageProfile.vendor (string, no FK — permite valores arbitrarios sin definición previa de adapter).
  • Regla de honestidad: si no hay adapter resuelto, el dispositivo queda sin información de capacidad (no se adivina).

Flujo típico en signage_view()

enabled_adapters = list(SignageVendorAdapter.objects.filter(enabled=True))

for profile in profiles:
    adapter = resolve_signage_adapter(profile, adapters=enabled_adapters)
    push_state = "" if adapter is None else ("push" if supports_real_push(adapter.slug) else "monitor")
    device_dict["push_state"] = push_state

Testing

  • 5 tests de resolución en monitoring/tests/test_signage_service.py (sin cambios, todos verdes).
  • Cubre: match exacto, parcial, sin match, múltiples candidatos, sin adapters enabled.

Véase también

  • [[feature—signage—etiqueta-honesta-push-v164]]
  • [[entity—signage—model—signage-vendor-adapter]]
  • [[entity—monitoring—view—signage-view]]
  • [[entity—signage—service—supports-real-push]]
  • [[concept—signage—vendor-matching]]