mirror of
https://git.vectorsigma.ru/public/tubearchivist.git
synced 2026-08-04 21:29:36 +00:00
Add test notification button (#996)
* Add api to test notifications before you save * Add button to UI * Inspect apprise logs to get errors * Better formatting around errors coming back from the test notification endpoint * Use apprise's built in log capture * Instruct the user to get error from container log instead of intercepting and parsing apprise logs * refac move to test method on notification class --------- Co-authored-by: Simon <simobilleter@gmail.com>
This commit is contained in:
@@ -329,3 +329,21 @@ SPECTACULAR_SETTINGS = {
|
||||
"VERSION": TA_VERSION,
|
||||
"SERVE_INCLUDE_SCHEMA": False,
|
||||
}
|
||||
|
||||
# Logging configuration
|
||||
LOGGING = {
|
||||
"version": 1,
|
||||
"disable_existing_loggers": False,
|
||||
"handlers": {
|
||||
"console": {
|
||||
"class": "logging.StreamHandler",
|
||||
},
|
||||
},
|
||||
"loggers": {
|
||||
"apprise": {
|
||||
"handlers": ["console"],
|
||||
"level": "DEBUG",
|
||||
"propagate": True,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -91,3 +91,12 @@ class TaskNotificationPostSerializer(serializers.Serializer):
|
||||
|
||||
task_name = serializers.ChoiceField(choices=list(TASK_CONFIG))
|
||||
url = serializers.CharField(required=False)
|
||||
|
||||
|
||||
class TaskNotificationTestSerializer(serializers.Serializer):
|
||||
"""serialize task notification test POST"""
|
||||
|
||||
url = serializers.CharField()
|
||||
task_name = serializers.ChoiceField(
|
||||
choices=list(TASK_CONFIG), required=False
|
||||
)
|
||||
|
||||
@@ -32,6 +32,38 @@ class Notifications:
|
||||
|
||||
apobj.notify(body=body, title=title)
|
||||
|
||||
def test(self, url) -> tuple[bool, str]:
|
||||
"""send test notification"""
|
||||
try:
|
||||
apobj = apprise.Apprise()
|
||||
|
||||
if not apobj.add(url):
|
||||
success = False
|
||||
message = f"Invalid notification URL format: {url}"
|
||||
return success, message
|
||||
|
||||
title = f"[TA] {self.task_name} process ended with SUCCESS"
|
||||
body = "This is a test notification. Task completed successfully."
|
||||
|
||||
result = apobj.notify(body=body, title=title)
|
||||
|
||||
if result:
|
||||
success = True
|
||||
message = "Test notification sent successfully"
|
||||
return success, message
|
||||
|
||||
success = False
|
||||
message = (
|
||||
"Notification failed. "
|
||||
"Please check container logs for more information."
|
||||
)
|
||||
return success, message
|
||||
|
||||
except Exception as err: # pylint: disable=broad-exception-caught
|
||||
success = False
|
||||
message = f"Notification error: {str(err)}"
|
||||
return success, message
|
||||
|
||||
def _build_message(
|
||||
self, task_id: str, task_title: str
|
||||
) -> tuple[str, str | None]:
|
||||
|
||||
@@ -34,4 +34,9 @@ urlpatterns = [
|
||||
views.ScheduleNotification.as_view(),
|
||||
name="api-schedule-notification",
|
||||
),
|
||||
path(
|
||||
"notification/test/",
|
||||
views.NotificationTestView.as_view(),
|
||||
name="api-schedule-notification-test",
|
||||
),
|
||||
]
|
||||
|
||||
@@ -15,6 +15,7 @@ from task.serializers import (
|
||||
TaskIDDataSerializer,
|
||||
TaskNotificationPostSerializer,
|
||||
TaskNotificationSerializer,
|
||||
TaskNotificationTestSerializer,
|
||||
TaskResultSerializer,
|
||||
)
|
||||
from task.src.config_schedule import CrontabValidator, ScheduleBuilder
|
||||
@@ -343,3 +344,34 @@ class ScheduleNotification(ApiBaseView):
|
||||
Notifications(task_name).remove_task()
|
||||
|
||||
return Response(status=204)
|
||||
|
||||
|
||||
class NotificationTestView(ApiBaseView):
|
||||
"""resolves to /api/task/notification/test/
|
||||
POST: test notification url
|
||||
"""
|
||||
|
||||
@extend_schema(
|
||||
request=TaskNotificationTestSerializer(),
|
||||
responses={
|
||||
200: OpenApiResponse(description="test notification sent"),
|
||||
400: OpenApiResponse(
|
||||
ErrorResponseSerializer(), description="bad request"
|
||||
),
|
||||
},
|
||||
)
|
||||
def post(self, request):
|
||||
"""test notification"""
|
||||
data_serializer = TaskNotificationTestSerializer(data=request.data)
|
||||
data_serializer.is_valid(raise_exception=True)
|
||||
validated_data = data_serializer.validated_data
|
||||
|
||||
url = validated_data["url"]
|
||||
task_name = validated_data.get("task_name", "manual_test")
|
||||
|
||||
success, message = Notifications(task_name).test(url)
|
||||
|
||||
status = 200 if success else 400
|
||||
return Response(
|
||||
{"success": success, "message": message}, status=status
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user