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.conf import settings
from django.core.management import call_command
from django.core.management.base import BaseCommand 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 from ...signals import periodic_task
@@ -9,12 +14,27 @@ class Command(BaseCommand):
help = "Run periodic tasks" help = "Run periodic tasks"
def handle(self, *args, **options): def handle(self, *args, **options):
for recv, resp in periodic_task.send_robust(self): verbosity = int(options['verbosity'])
if isinstance(resp, Exception):
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: if settings.SENTRY_ENABLED:
from sentry_sdk import capture_exception from sentry_sdk import capture_exception
capture_exception(resp) capture_exception(err)
else: else:
raise resp self.stdout.write(self.style.ERROR(f'FAIL: {str(err)}\n'))
traceback.print_exc()
call_command('clearsessions') 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 datetime import timedelta
from django.conf import settings from django.conf import settings
from django.core.management import call_command
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.timezone import now from django.utils.timezone import now
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
@@ -40,3 +41,9 @@ def clean_cached_tickets(sender, **kwargs):
cf.delete() cf.delete()
for cf in CachedCombinedTicket.objects.filter(created__lte=now() - timedelta(minutes=30), file__isnull=True): for cf in CachedCombinedTicket.objects.filter(created__lte=now() - timedelta(minutes=30), file__isnull=True):
cf.delete() 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__) logger = logging.getLogger(__name__)
SKIPPED = object()
def minimum_interval(minutes_after_success, minutes_after_error=0, minutes_running_timeout=30): 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) running_val = cache.get(key_running)
if running_val: if running_val:
# Currently running # Currently running
return return SKIPPED
result_val = cache.get(key_result) result_val = cache.get(key_result)
if result_val: if result_val:
# Has run recently # Has run recently
return return SKIPPED
uniqid = str(uuid.uuid4()) uniqid = str(uuid.uuid4())
cache.set(key_running, uniqid, timeout=minutes_running_timeout * 60) cache.set(key_running, uniqid, timeout=minutes_running_timeout * 60)