From 8369fa16aee349654a4815350eb152560990d3f2 Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Tue, 12 Jan 2021 21:48:39 +0100 Subject: [PATCH] events: add mode_verbose to transport, return string on send error --- authentik/events/api/notification_transport.py | 17 +++++++++++++++-- authentik/events/tasks.py | 2 +- swagger.yaml | 4 ++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/authentik/events/api/notification_transport.py b/authentik/events/api/notification_transport.py index 41a5e3bcf..b715285ad 100644 --- a/authentik/events/api/notification_transport.py +++ b/authentik/events/api/notification_transport.py @@ -2,6 +2,7 @@ from django.http.response import Http404 from guardian.shortcuts import get_objects_for_user from rest_framework.decorators import action +from rest_framework.fields import SerializerMethodField from rest_framework.request import Request from rest_framework.response import Response from rest_framework.serializers import ModelSerializer @@ -11,12 +12,20 @@ from authentik.events.models import ( Notification, NotificationSeverity, NotificationTransport, + NotificationTransportError, + TransportMode, ) class NotificationTransportSerializer(ModelSerializer): """NotificationTransport Serializer""" + mode_verbose = SerializerMethodField() + + def get_mode_verbose(self, instance: NotificationTransport): + """Return selected mode with a UI Label""" + return TransportMode(instance.mode).label + class Meta: model = NotificationTransport @@ -24,6 +33,7 @@ class NotificationTransportSerializer(ModelSerializer): "pk", "name", "mode", + "mode_verbose", "webhook_url", ] @@ -44,10 +54,13 @@ class NotificationTransportViewSet(ModelViewSet): ).filter(pk=pk) if not transports.exists(): raise Http404 - transport = transports.first() + transport: NotificationTransport = transports.first() notification = Notification( severity=NotificationSeverity.NOTICE, body=f"Test Notification from transport {transport.name}", user=request.user, ) - return Response(transport.send(notification)) + try: + return Response(transport.send(notification)) + except NotificationTransportError as exc: + return Response(str(exc.__cause__ or None), status=503) diff --git a/authentik/events/tasks.py b/authentik/events/tasks.py index 7700cb9e7..d86d16555 100644 --- a/authentik/events/tasks.py +++ b/authentik/events/tasks.py @@ -67,7 +67,7 @@ def event_trigger_handler(event_uuid: str, trigger_name: str): @CELERY_APP.task( bind=True, - autoretry_for=(NotificationTransportError), + autoretry_for=(NotificationTransportError,), retry_backoff=True, base=MonitoredTask, ) diff --git a/swagger.yaml b/swagger.yaml index 41339aa1f..e00524546 100755 --- a/swagger.yaml +++ b/swagger.yaml @@ -7676,6 +7676,10 @@ definitions: - webhook - webhook_slack - email + mode_verbose: + title: Mode verbose + type: string + readOnly: true webhook_url: title: Webhook url type: string