Add verbose output to runperiodic management command

This commit is contained in:
Raphael Michel
2020-09-06 22:34:40 +02:00
parent 4b894eb433
commit d064a7affa
3 changed files with 38 additions and 9 deletions

View File

@@ -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'))

View File

@@ -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')

View File

@@ -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)