Refs #44 -- Added background queue support for ticket output

This commit is contained in:
Raphael Michel
2015-09-16 11:18:18 +02:00
parent 9ecd16c19c
commit 1a463dd5b1
6 changed files with 65 additions and 13 deletions

View File

@@ -8,7 +8,7 @@ class PretixBaseConfig(AppConfig):
def ready(self):
from . import exporter # NOQA
from . import payment # NOQA
from .services import export, mail # NOQA
from .services import export, mail, tickets # NOQA
try:
from .celery import app as celery_app # NOQA

View File

@@ -14,6 +14,7 @@ def export(event, fileid, provider, form_data):
if ex.identifier == provider:
file.filename, file.type, data = ex.render(form_data)
file.file.save(cachedfile_name(file, file.filename), ContentFile(data))
file.save()
if settings.HAS_CELERY:

View File

@@ -0,0 +1,34 @@
from datetime import timedelta
from django.conf import settings
from django.core.files.base import ContentFile
from django.utils.timezone import now
from pretix.base.models import CachedFile, cachedfile_name, Order, CachedTicket
from pretix.base.signals import register_ticket_outputs
def generate(order, provider):
order = Order.objects.current.select_related('event').get(identity=order)
ct = CachedTicket.objects.get_or_create(order=order, provider=provider)[0]
if not ct.cachedfile:
cf = CachedFile()
cf.date = now()
cf.expires = order.event.date_from + timedelta(days=30)
cf.save()
ct.cachedfile = cf
ct.save()
responses = register_ticket_outputs.send(order.event)
for receiver, response in responses:
prov = response(order.event)
if prov.identifier == provider:
ct.cachedfile.filename, ct.cachedfile.type, data = prov.generate(order)
ct.cachedfile.file.save(cachedfile_name(ct.cachedfile, ct.cachedfile.filename), ContentFile(data))
ct.cachedfile.save()
if settings.HAS_CELERY:
from pretix.celery import app
generate_task = app.task(generate)
generate = lambda *args, **kwargs: generate_task.apply_async(args=args, kwargs=kwargs)

View File

@@ -28,9 +28,10 @@ class BaseTicketOutput:
"""
return self.settings.get('_enabled', as_type=bool)
def generate(self, request: HttpRequest, order: Order) -> HttpResponse:
def generate(self, order: Order) -> tuple:
"""
This method should generate the download file and return it to the user.
This method should generate the download file and return a tuple consisting of a
filename, a file type and file content.
"""
raise NotImplementedError()