Add database cache for quotas

This commit is contained in:
Raphael Michel
2017-10-04 09:45:37 +02:00
parent 330fadbea9
commit b920efc955
5 changed files with 102 additions and 4 deletions

View File

@@ -0,0 +1,34 @@
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 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_cashes.apply_async()
@app.task
def refresh_quota_cashes():
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') - timedelta(hours=1))
)
for q in quotas:
q.availability()