from typing import Any from .models import BanEvent def event_payload(instance: BanEvent, node_alias: str | None = None) -> dict[str, Any]: """Représentation JSON-sérialisable d'un BanEvent, partagée par le WebSocket temps réel et le bootstrap initial du tableau de bord. node_alias : alias lisible du noeud (NodeRegistry.display_name), résolu par l'appelant plutôt qu'ici pour ne pas cacher une requête DB par événement (voir views.py, qui résout tous les alias en une seule requête avant d'appeler cette fonction en boucle).""" return { 'id': instance.pk, 'received_at': instance.received_at.isoformat(), 'node': instance.node, 'node_alias': node_alias or instance.node, 'jail_name': instance.jail_name, 'action': instance.action, 'ip_address': instance.ip_address, 'port': instance.port, 'protocol': instance.protocol, 'bantime': instance.bantime, 'latitude': instance.latitude, 'longitude': instance.longitude, 'country': instance.country, 'country_code': instance.country_code, 'city': instance.city, }