From d064a7affa0f350a3ecd4686317a911d6f5c7e8b Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sun, 6 Sep 2020 22:34:40 +0200 Subject: [PATCH] Add verbose output to runperiodic management command --- .../base/management/commands/runperiodic.py | 34 +++++++++++++++---- src/pretix/base/services/cleanup.py | 7 ++++ src/pretix/helpers/periodic.py | 6 ++-- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/pretix/base/management/commands/runperiodic.py b/src/pretix/base/management/commands/runperiodic.py index 037b4e6f86..6777a6478b 100644 --- a/src/pretix/base/management/commands/runperiodic.py +++ b/src/pretix/base/management/commands/runperiodic.py @@ -1,6 +1,11 @@ +import time +import traceback + from django.conf import settings -from django.core.management import call_command from django.core.management.base import BaseCommand +from django.dispatch.dispatcher import NO_RECEIVERS + +from pretix.helpers.periodic import SKIPPED from ...signals import periodic_task @@ -9,12 +14,27 @@ class Command(BaseCommand): help = "Run periodic tasks" def handle(self, *args, **options): - for recv, resp in periodic_task.send_robust(self): - if isinstance(resp, Exception): + verbosity = int(options['verbosity']) + + if not periodic_task.receivers or periodic_task.sender_receivers_cache.get(self) is NO_RECEIVERS: + return + + for receiver in periodic_task._live_receivers(self): + if verbosity > 1: + self.stdout.write(f'Running {receiver.__module__}.{receiver.__name__}…') + t0 = time.time() + try: + r = receiver(signal=periodic_task, sender=self) + except Exception as err: if settings.SENTRY_ENABLED: from sentry_sdk import capture_exception - capture_exception(resp) + capture_exception(err) else: - raise resp - - call_command('clearsessions') + self.stdout.write(self.style.ERROR(f'FAIL: {str(err)}\n')) + traceback.print_exc() + else: + if options.get('verbosity') > 1: + if r is SKIPPED: + self.stdout.write(self.style.SUCCESS(f'Skipped {receiver.__module__}.{receiver.__name__}')) + else: + self.stdout.write(self.style.SUCCESS(f'Completed {receiver.__module__}.{receiver.__name__} in {round(time.time() - t0, 3)}s')) diff --git a/src/pretix/base/services/cleanup.py b/src/pretix/base/services/cleanup.py index 62d2e7381b..549d26b179 100644 --- a/src/pretix/base/services/cleanup.py +++ b/src/pretix/base/services/cleanup.py @@ -1,6 +1,7 @@ from datetime import timedelta from django.conf import settings +from django.core.management import call_command from django.dispatch import receiver from django.utils.timezone import now from django_scopes import scopes_disabled @@ -40,3 +41,9 @@ def clean_cached_tickets(sender, **kwargs): cf.delete() for cf in CachedCombinedTicket.objects.filter(created__lte=now() - timedelta(minutes=30), file__isnull=True): cf.delete() + + +@receiver(signal=periodic_task) +@scopes_disabled() +def clearsessions(sender, **kwargs): + call_command('clearsessions') diff --git a/src/pretix/helpers/periodic.py b/src/pretix/helpers/periodic.py index 6263e086e9..daba53651d 100644 --- a/src/pretix/helpers/periodic.py +++ b/src/pretix/helpers/periodic.py @@ -6,6 +6,8 @@ from django.core.cache import cache logger = logging.getLogger(__name__) +SKIPPED = object() + def minimum_interval(minutes_after_success, minutes_after_error=0, minutes_running_timeout=30): """ @@ -26,12 +28,12 @@ def minimum_interval(minutes_after_success, minutes_after_error=0, minutes_runni running_val = cache.get(key_running) if running_val: # Currently running - return + return SKIPPED result_val = cache.get(key_result) if result_val: # Has run recently - return + return SKIPPED uniqid = str(uuid.uuid4()) cache.set(key_running, uniqid, timeout=minutes_running_timeout * 60)