diff --git a/src/pretix/base/services/tickets.py b/src/pretix/base/services/tickets.py index f3b4d0c48..a24119811 100644 --- a/src/pretix/base/services/tickets.py +++ b/src/pretix/base/services/tickets.py @@ -1,9 +1,14 @@ from datetime import timedelta from django.core.files.base import ContentFile +from django.db import transaction from django.utils.timezone import now +from django.utils.translation import ugettext as _ -from pretix.base.models import CachedFile, CachedTicket, Order, cachedfile_name +from pretix.base.i18n import language +from pretix.base.models import ( + CachedFile, CachedTicket, Event, Order, cachedfile_name, +) from pretix.base.signals import register_ticket_outputs from pretix.celery import app @@ -20,10 +25,40 @@ def generate(order: str, provider: str): 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() + with language(order.locale): + 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() + + +class DummyRollbackException(Exception): + pass + + +def preview(event: int, provider: str): + event = Event.objects.get(id=event) + res = None + + try: + with transaction.atomic(), language(event.settings.locale): + item = event.items.create(name=_("Sample product"), default_price=42.23) + + order = event.orders.create(status=Order.STATUS_PENDING, datetime=now(), + expires=now(), code="PREVIEW1234", total=119) + + order.positions.create(item=item, attendee_name=_("John Doe"), price=item.default_price) + + responses = register_ticket_outputs.send(event) + for receiver, response in responses: + prov = response(event) + if prov.identifier == provider: + res = prov.generate(order) + raise DummyRollbackException() + except DummyRollbackException: + return res + else: + raise Exception('Invalid state, should have rolled back.') diff --git a/src/pretix/control/templates/pretixcontrol/event/tickets.html b/src/pretix/control/templates/pretixcontrol/event/tickets.html index cff15e567..6d4fbf011 100644 --- a/src/pretix/control/templates/pretixcontrol/event/tickets.html +++ b/src/pretix/control/templates/pretixcontrol/event/tickets.html @@ -10,13 +10,14 @@ {% bootstrap_field form.ticket_download layout="horizontal" %} {% bootstrap_field form.ticket_download_date layout="horizontal" %} {% for provider in providers %} -