From 4e7a56193406b1953789512bb25024b38886b36f Mon Sep 17 00:00:00 2001 From: Tom Teichler <tom.teichler@teckids.org> Date: Sun, 14 Jun 2020 00:13:52 +0200 Subject: [PATCH] Show health checks on system status page --- aleksis/core/settings.py | 10 +++--- .../templates/core/pages/system_status.html | 34 +++++++++++++++++++ aleksis/core/urls.py | 2 +- aleksis/core/views.py | 33 +++++++++++------- 4 files changed, 60 insertions(+), 19 deletions(-) diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py index abe81f2c5..22fa0ec43 100644 --- a/aleksis/core/settings.py +++ b/aleksis/core/settings.py @@ -63,11 +63,6 @@ INSTALLED_APPS = [ "polymorphic", "django_global_request", "dbbackup", - "health_check", - "health_check.db", - "health_check.cache", - "health_check.storage", - "health_check.contrib.psutil", "settings_context_processor", "sass_processor", "easyaudit", @@ -90,6 +85,11 @@ INSTALLED_APPS = [ "django_otp", "otp_yubikey", "aleksis.core", + "health_check", + "health_check.db", + "health_check.cache", + "health_check.storage", + "health_check.contrib.psutil", "dynamic_preferences", "dynamic_preferences.users.apps.UserPreferencesConfig", "impersonate", diff --git a/aleksis/core/templates/core/pages/system_status.html b/aleksis/core/templates/core/pages/system_status.html index a62d024cf..f2c3eda35 100644 --- a/aleksis/core/templates/core/pages/system_status.html +++ b/aleksis/core/templates/core/pages/system_status.html @@ -63,6 +63,40 @@ </div> </div> + <div class="card"> + <div class="card-content"> + <span class="card-title"> {% blocktrans %}System health checks{% endblocktrans %}</span> + + <table> + <thead> + <tr> + + <th colspan="2">{% trans "Service" %}</th> + <th>{% trans "Status" %}</th> + <th>{% trans "Time taken" %}</th> + </tr> + </thead> + <tbody> + {% for plugin in plugins %} + <tr> + <td> + {% if plugin.status %} + <i class="material-icons green-text" aria-hidden="true">check</i> + {% else %} + <i class="material-icons red-text" aria-hidden="true">warning</i> + {% endif %} + </td> + <td>{{ plugin.identifier }}</td> + <td> + {{ plugin.pretty_status }} + </td> + <td>{{ plugin.time_taken|floatformat:4 }} {% trans "seconds" %}</td> + </tr> + {% endfor %} + </tbody> + </table> + </div> + </div> {% if tasks %} <div class="card"> diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py index 373d35a8b..fb9c54d93 100644 --- a/aleksis/core/urls.py +++ b/aleksis/core/urls.py @@ -19,7 +19,7 @@ urlpatterns = [ path("about/", views.about, name="about_aleksis"), path("admin/", admin.site.urls), path("data_management/", views.data_management, name="data_management"), - path("status/", views.system_status, name="system_status"), + path("status/", views.SystemStatus.as_view(), name="system_status"), path("", include(tf_urls)), path("accounts/logout/", auth_views.LogoutView.as_view(), name="logout"), path("persons", views.persons, name="persons"), diff --git a/aleksis/core/views.py b/aleksis/core/views.py index 92f0bf2fc..e07450a13 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -15,6 +15,7 @@ from guardian.shortcuts import get_objects_for_user from haystack.inputs import AutoQuery from haystack.query import SearchQuerySet from haystack.views import SearchView +from health_check.views import MainView from rules.contrib.views import permission_required from .filters import GroupFilter @@ -300,22 +301,28 @@ def data_management(request: HttpRequest) -> HttpResponse: return render(request, "core/management/data_management.html", context) -@permission_required("core.view_system_status") -def system_status(request: HttpRequest) -> HttpResponse: +class SystemStatus(MainView, PermissionRequiredMixin): """View giving information about the system status.""" + + template_name = "core/pages/system_status.html" + permission_required = "core.view_system_status" context = {} - if "django_celery_results" in settings.INSTALLED_APPS: - from django_celery_results.models import TaskResult # noqa - from celery.task.control import inspect # noqa - if inspect().registered_tasks(): - job_list = list(inspect().registered_tasks().values())[0] - results = [] - for job in job_list: - results.append(TaskResult.objects.filter(task_name=job).last()) - context["tasks"] = results - - return render(request, "core/pages/system_status.html", context) + def get(self, request, *args, **kwargs): + status_code = 500 if self.errors else 200 + + if "django_celery_results" in settings.INSTALLED_APPS: + from django_celery_results.models import TaskResult # noqa + from celery.task.control import inspect # noqa + + if inspect().registered_tasks(): + job_list = list(inspect().registered_tasks().values())[0] + results = [] + for job in job_list: + results.append(TaskResult.objects.filter(task_name=job).last()) + + context = {"plugins": self.plugins, "status_code": status_code} + return self.render_to_response(context, status=status_code) @permission_required( -- GitLab