From 74e7725ced262835f04d5056838bc115f0b70f12 Mon Sep 17 00:00:00 2001 From: adinhodovic Date: Mon, 13 Mar 2023 20:48:14 +0100 Subject: [PATCH] fix: Change retry logic to extract next run from traceback `task_meta.result` is an Exception for me with Celery v5.2.5, I can't grasp where result.when would come from. The retry logic simply does not work as the result is an Exception and does not have any fields indicating when the next run is. Still kept it in and checked if it's iterable, maybe it works for others. Here's a PR that works for me, if there's other solutions let me know. But atm retries are causing 500 errors. --- celery_progress/backend.py | 27 ++++++++++++++++--- .../static/celery_progress/celery_progress.js | 5 ++-- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/celery_progress/backend.py b/celery_progress/backend.py index 9cc1fbe..f8f4183 100644 --- a/celery_progress/backend.py +++ b/celery_progress/backend.py @@ -1,5 +1,6 @@ import datetime import logging +import re from abc import ABCMeta, abstractmethod from decimal import Decimal @@ -76,9 +77,29 @@ def get_info(self): elif state in ['RETRY', 'REVOKED']: if state == 'RETRY': retry = info - when = str(retry.when) if isinstance(retry.when, datetime.datetime) else str( - datetime.datetime.now() + datetime.timedelta(seconds=retry.when)) - result = {'when': when, 'message': retry.message or str(retry.exc)} + try: + iter(retry) + when = ( + str(retry.when) + if isinstance(retry.when, datetime.datetime) + else str( + datetime.datetime.now() + + datetime.timedelta(seconds=retry.when) + ) + ) + result = {"when": when, "message": retry.message or str(retry.exc)} + except: + traceback = task_meta.get("traceback") + seconds = re.search("\d{1,10}s", traceback) + if seconds: + when = str( + task_meta["date_done"] + + datetime.timedelta(seconds=int(seconds.group()[:-1])) + ) + else: + when = "Unknown" # Can't find the retry time + + result = {"when": when, "message": f"{str(task_meta['result'])[0:50]}..."} else: result = 'Task ' + str(info) response.update({ diff --git a/celery_progress/static/celery_progress/celery_progress.js b/celery_progress/static/celery_progress/celery_progress.js index 7c659d5..54f137c 100644 --- a/celery_progress/static/celery_progress/celery_progress.js +++ b/celery_progress/static/celery_progress/celery_progress.js @@ -65,7 +65,8 @@ class CeleryProgressBar { onRetryDefault(progressBarElement, progressBarMessageElement, excMessage, retryWhen) { retryWhen = new Date(retryWhen); let message = 'Retrying in ' + Math.round((retryWhen.getTime() - Date.now())/1000) + 's: ' + excMessage; - this.onError(progressBarElement, progressBarMessageElement, message); + progressBarElement.style.backgroundColor = this.barColors.error; + progressBarMessageElement.textContent = message; } onIgnoredDefault(progressBarElement, progressBarMessageElement, result) { @@ -163,7 +164,7 @@ class CeleryProgressBar { this.onHttpError(this.progressBarElement, this.progressBarMessageElement, "HTTP Code " + response.status, response); } } - + static getBarColorsDefault() { return { success: '#76ce60',