diff --git a/allianceauth/authentication/tests/test_views.py b/allianceauth/authentication/tests/test_views.py index ec7601a9..d96d8469 100644 --- a/allianceauth/authentication/tests/test_views.py +++ b/allianceauth/authentication/tests/test_views.py @@ -9,6 +9,7 @@ from allianceauth.tests.auth_utils import AuthUtils from allianceauth.authentication.constants import ESI_ERROR_MESSAGE_OVERRIDES MODULE_PATH = "allianceauth.authentication.views" +TEMPLATETAGS_PATH = "allianceauth.templatetags.admin_status" def jsonresponse_to_dict(response) -> dict: @@ -17,6 +18,7 @@ def jsonresponse_to_dict(response) -> dict: @patch(MODULE_PATH + ".queued_tasks_count") @patch(MODULE_PATH + ".active_tasks_count") +@patch(MODULE_PATH + "._celery_stats") class TestRunningTasksCount(TestCase): @classmethod def setUpClass(cls) -> None: @@ -26,36 +28,64 @@ class TestRunningTasksCount(TestCase): cls.user.is_superuser = True cls.user.save() - def test_should_return_data( - self, mock_active_tasks_count, mock_queued_tasks_count - ): + def test_should_return_data(self, mock_celery_stats, mock_tasks_queued, mock_tasks_running): # given - mock_active_tasks_count.return_value = 2 - mock_queued_tasks_count.return_value = 3 + mock_tasks_running.return_value = 2 + mock_tasks_queued.return_value = 3 + mock_celery_stats.return_value = { + "tasks_succeeded": 5, + "tasks_retried": 1, + "tasks_failed": 4, + "tasks_total": 11, + "tasks_hours": 24, + "earliest_task": "2025-08-14T22:47:54.853Z", + } + request = self.factory.get("/") request.user = self.user + # when response = task_counts(request) + # then self.assertEqual(response.status_code, 200) self.assertDictEqual( - jsonresponse_to_dict(response), { - "tasks_running": 2, "tasks_queued": 3} + jsonresponse_to_dict(response), + { + "tasks_succeeded": 5, + "tasks_retried": 1, + "tasks_failed": 4, + "tasks_total": 11, + "tasks_hours": 24, + "earliest_task": "2025-08-14T22:47:54.853Z", + "tasks_running": 3, + "tasks_queued": 2, + } ) - def test_su_only( - self, mock_active_tasks_count, mock_queued_tasks_count - ): + def test_su_only(self, mock_celery_stats, mock_tasks_queued, mock_tasks_running): self.user.is_superuser = False self.user.save() self.user.refresh_from_db() + # given - mock_active_tasks_count.return_value = 2 - mock_queued_tasks_count.return_value = 3 + mock_tasks_running.return_value = 2 + mock_tasks_queued.return_value = 3 + mock_celery_stats.return_value = { + "tasks_succeeded": 5, + "tasks_retried": 1, + "tasks_failed": 4, + "tasks_total": 11, + "tasks_hours": 24, + "earliest_task": "2025-08-14T22:47:54.853Z", + } + request = self.factory.get("/") request.user = self.user + # when response = task_counts(request) + # then self.assertEqual(response.status_code, 302) diff --git a/allianceauth/authentication/views.py b/allianceauth/authentication/views.py index 2e8f4e2c..9a15041f 100644 --- a/allianceauth/authentication/views.py +++ b/allianceauth/authentication/views.py @@ -27,6 +27,7 @@ from allianceauth.hooks import get_hooks from .constants import ESI_ERROR_MESSAGE_OVERRIDES from .core.celery_workers import active_tasks_count, queued_tasks_count +from allianceauth.templatetags.admin_status import _celery_stats from .forms import RegistrationForm from .models import CharacterOwnership @@ -370,10 +371,10 @@ def registration_closed(request): @user_passes_test(lambda u: u.is_superuser) def task_counts(request) -> JsonResponse: """Return task counts as JSON for an AJAX call.""" - data = { - "tasks_running": active_tasks_count(), - "tasks_queued": queued_tasks_count() - } + data = _celery_stats() + data.update( + {"tasks_running": active_tasks_count(), "tasks_queued": queued_tasks_count()} + ) return JsonResponse(data) diff --git a/allianceauth/templates/allianceauth/admin-status/celery_bar_partial.html b/allianceauth/templates/allianceauth/admin-status/celery_bar_partial.html index b926917f..7af2712f 100644 --- a/allianceauth/templates/allianceauth/admin-status/celery_bar_partial.html +++ b/allianceauth/templates/allianceauth/admin-status/celery_bar_partial.html @@ -2,6 +2,7 @@ {% load admin_status %}
diff --git a/allianceauth/templates/allianceauth/admin-status/overview.html b/allianceauth/templates/allianceauth/admin-status/overview.html index 690e01a9..4b637bb7 100644 --- a/allianceauth/templates/allianceauth/admin-status/overview.html +++ b/allianceauth/templates/allianceauth/admin-status/overview.html @@ -1,6 +1,27 @@ {% load i18n %} {% load humanize %} +{% get_current_language as LANGUAGE_CODE %} + +{% comment %} +Some translations used in the HTML and JavaScript code below. +We define them here so that they can be used in the JavaScript code as well with +the escapejs filter without having to redefine them later. +{% endcomment %} +{% translate "second" as l10nSecondSingular %} +{% translate "seconds" as l10nSecondPlural %} +{% translate "minute" as l10nMinuteSingular %} +{% translate "minutes" as l10nMinutePlural %} +{% translate "hour" as l10nHourSingular %} +{% translate "hours" as l10nHourPlural %} +{% translate "N/A" as l10nNA %} +{% translate "ERROR" as l10nError %} +{% translate "running" as l10nRunning %} +{% translate "queued" as l10nQueued %} +{% translate "succeeded" as l10nSucceeded %} +{% translate "retried" as l10nRetried %} +{% translate "failed" as l10nFailed %} + {% if debug %}{% blocktranslate with total=tasks_total|intcomma latest=earliest_task|timesince|default:"?" %} - Status of {{ total }} processed tasks • last {{ latest }} + Status of ? processed tasks • last ? {% endblocktranslate %}
- ? {% translate 'running' %} | - ? {% translate 'queued' %} + ? {{ l10nRunning }} | + ? {{ l10nQueued }} | + ? {{ l10nSucceeded }} | + ? {{ l10nRetried }} | + ? {{ l10nFailed }}