From 64582b72f85bacf44cf100d3db163e899801275a Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Mon, 8 Mar 2021 12:18:08 +0100
Subject: [PATCH 1/2] Make data checks compatible with non-optional Celery

---
 aleksis/core/views.py | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index f1bc04013..b2642e20e 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -750,16 +750,14 @@ class RunDataChecks(PermissionRequiredMixin, View):
     permission_required = "core.run_data_checks"
 
     def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
-        if not check_data()[1]:
-            messages.success(
-                request,
-                _(
-                    "The data check has been started. Please note that it may take "
-                    "a while before you are able to fetch the data on this page."
-                ),
-            )
-        else:
-            messages.success(request, _("The data check has finished."))
+        check_data.delay()
+        messages.success(
+            request,
+            _(
+                "The data check has been started. Please note that it may take "
+                "a while before you are able to fetch the data on this page."
+            ),
+        )
         return redirect("check_data")
 
 
-- 
GitLab


From ddc1b47de08620ca39a824d1aea3649180312928 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 14 Mar 2021 12:16:58 +0100
Subject: [PATCH 2/2] Use celery progress recorder for running data checks in
 the frontend

---
 aleksis/core/data_checks.py |  8 ++++----
 aleksis/core/views.py       | 24 ++++++++++++++----------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/aleksis/core/data_checks.py b/aleksis/core/data_checks.py
index f7152686f..a7d43d293 100644
--- a/aleksis/core/data_checks.py
+++ b/aleksis/core/data_checks.py
@@ -9,7 +9,7 @@ import reversion
 from reversion import set_comment
 from templated_email import send_templated_mail
 
-from .celery import app
+from .util.celery_progress import ProgressRecorder, recorded_task
 from .util.core_helpers import get_site_preferences
 
 
@@ -208,10 +208,10 @@ class DataCheckRegistry:
         return [(check.name, check.verbose_name) for check in cls.data_checks]
 
 
-@app.task
-def check_data():
+@recorded_task
+def check_data(recorder: ProgressRecorder):
     """Execute all registered data checks and send email if activated."""
-    for check in DataCheckRegistry.data_checks:
+    for check in recorder.iterate(DataCheckRegistry.data_checks):
         logging.info(f"Run check: {check.verbose_name}")
         check.check_data()
 
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index 5b040e013..0eb64c62c 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -8,7 +8,7 @@ from django.db.models import QuerySet
 from django.forms.models import BaseModelForm, modelform_factory
 from django.http import HttpRequest, HttpResponse, HttpResponseNotFound
 from django.shortcuts import get_object_or_404, redirect, render
-from django.urls import reverse_lazy
+from django.urls import reverse, reverse_lazy
 from django.utils.decorators import method_decorator
 from django.utils.translation import gettext_lazy as _
 from django.views.decorators.cache import never_cache
@@ -756,15 +756,19 @@ class RunDataChecks(PermissionRequiredMixin, View):
     permission_required = "core.run_data_checks"
 
     def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
-        check_data.delay()
-        messages.success(
-            request,
-            _(
-                "The data check has been started. Please note that it may take "
-                "a while before you are able to fetch the data on this page."
-            ),
-        )
-        return redirect("check_data")
+        result = check_data.delay()
+
+        context = {
+            "title": _("Progress: Run data checks"),
+            "back_url": reverse("check_data"),
+            "progress": {
+                "task_id": result.task_id,
+                "title": _("Run data checks …"),
+                "success": _("The data checks were run successfully."),
+                "error": _("There was a problem while running data checks."),
+            },
+        }
+        return render(request, "core/pages/progress.html", context)
 
 
 class SolveDataCheckView(PermissionRequiredMixin, RevisionMixin, DetailView):
-- 
GitLab