from datetime import timedelta from django.db import models from django.db.models import F, Max, OuterRef, Q, Subquery from django.dispatch import receiver from django.utils.timezone import now from pretix.base.models import LogEntry, Quota from pretix.celery_app import app from ..signals import periodic_task @receiver(signal=periodic_task) def build_all_quota_caches(sender, **kwargs): refresh_quota_caches.apply_async() @app.task def refresh_quota_caches(): last_activity = LogEntry.objects.filter( event=OuterRef('event_id'), ).order_by().values('event').annotate( m=Max('datetime') ).values( 'm' ) quotas = Quota.objects.annotate( last_activity=Subquery(last_activity, output_field=models.DateTimeField()) ).filter( Q(cached_availability_time__isnull=True) | Q(cached_availability_time__lt=F('last_activity')) | Q(cached_availability_time__lt=now() - timedelta(hours=2), last_activity__gt=now() - timedelta(days=7)) ).select_related('subevent') for q in quotas: q.availability()