From 6d85bec0099b3f9d31a885b9ad7d3fe84942bb07 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Wed, 20 Jul 2022 14:44:55 +0200
Subject: [PATCH] Ensure that all status messages are shown on progress page

---
 CHANGELOG.rst                        |  5 +++++
 aleksis/core/static/js/progress.js   | 32 ++++++++++++++++++----------
 aleksis/core/util/celery_progress.py |  3 ++-
 3 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 55be8df79..80d1702c0 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,6 +9,11 @@ and this project adheres to `Semantic Versioning`_.
 Unreleased
 ----------
 
+Fixed
+~~~~~
+
+* The progress page for background tasks didn't show all status messages.
+
 `2.10`_ - 2022-06-25
 --------------------
 
diff --git a/aleksis/core/static/js/progress.js b/aleksis/core/static/js/progress.js
index 5fa0213f8..8a97577e9 100644
--- a/aleksis/core/static/js/progress.js
+++ b/aleksis/core/static/js/progress.js
@@ -24,25 +24,32 @@ function renderMessageBox(level, text) {
     return '<div class="alert ' + STYLE_CLASSES[level] + '"><p><i class="material-icons iconify left" data-icon="' + ICONS[level] + '"></i>' + text + '</p></div>';
 }
 
+function updateMessages(messages) {
+    const messagesBox = $("#messages");
+
+    // Clear container
+    messagesBox.html("");
+
+    // Render message boxes
+    $.each(messages, function (i, message) {
+        messagesBox.append(renderMessageBox(message[0], message[1]));
+    });
+}
+
 function customProgress(progressBarElement, progressBarMessageElement, progress) {
     setProgress(progress.percent);
 
     if (progress.hasOwnProperty("messages")) {
-        const messagesBox = $("#messages");
-
-        // Clear container
-        messagesBox.html("")
-
-        // Render message boxes
-        $.each(progress.messages, function (i, message) {
-            messagesBox.append(renderMessageBox(message[0], message[1]));
-        })
+        updateMessages(progress.messages);
     }
 }
 
 
-function customSuccess(progressBarElement, progressBarMessageElement) {
+function customSuccess(progressBarElement, progressBarMessageElement, result) {
     setProgress(100);
+    if (result) {
+        updateMessages(result);
+    }
     $("#result-alert").addClass("success");
     $("#result-icon").attr("data-icon", "mdi:check-circle-outline");
     $("#result-text").text(OPTIONS.success);
@@ -54,8 +61,11 @@ function customSuccess(progressBarElement, progressBarMessageElement) {
     }
 }
 
-function customError(progressBarElement, progressBarMessageElement) {
+function customError(progressBarElement, progressBarMessageElement, excMessage) {
     setProgress(100);
+    if (excMessage) {
+        updateMessages([40, excMessage]);
+    }
     $("#result-alert").addClass("error");
     $("#result-icon").attr("data-icon", "mdi:alert-octagon-outline");
     $("#result-text").text(OPTIONS.error);
diff --git a/aleksis/core/util/celery_progress.py b/aleksis/core/util/celery_progress.py
index ef42f1692..91b5b7168 100644
--- a/aleksis/core/util/celery_progress.py
+++ b/aleksis/core/util/celery_progress.py
@@ -155,7 +155,8 @@ def recorded_task(orig: Optional[Callable] = None, **kwargs) -> Union[Callable,
         @wraps(orig)
         def _inject_recorder(task, *args, **kwargs):
             recorder = ProgressRecorder(task)
-            return orig(*args, **kwargs, recorder=recorder)
+            orig(*args, **kwargs, recorder=recorder)
+            return recorder._messages
 
         # Force bind to True because _inject_recorder needs the Task object
         kwargs["bind"] = True
-- 
GitLab