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
- Entrada: perfil de monitoreo (
SignageProfile) + vendor string. - Lógica de match:
- Slug exacto:
adapter.slug == vendor_slug(vendor normalizado conslugify()). - Nombre exacto:
adapter.name.lower().strip() == vendor.lower(). - Match parcial: vendor en nombre del adapter O slug en vendor O viceversa.
- Slug exacto:
- 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).
- 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
| Consumidor | Ubicación | Propósito |
|---|---|---|
| signage_view() | monitoring/views.py:445 | Calcula badge push/monitor en listado. |
deploy logic (vía supports_real_push()) | signage.services.adapters.registry | Valida capacidad de despliegue antes de enviar contenido. |
| Posibles workflows internos | TBD | Auditoría, logs, scheduling. |
Datos de origen
- Fuente de adapters: tabla
signage_vendoradapteren 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]]