mirror of
https://github.com/pretix/pretix.git
synced 2026-05-06 15:24:02 +00:00
37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
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()
|