Preview for ticket outputs

This commit is contained in:
Raphael Michel
2016-10-20 20:43:31 +02:00
parent d6478e66de
commit 39e940da5e
5 changed files with 85 additions and 14 deletions
+43 -8
View File
@@ -1,9 +1,14 @@
from datetime import timedelta from datetime import timedelta
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.db import transaction
from django.utils.timezone import now 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.base.signals import register_ticket_outputs
from pretix.celery import app from pretix.celery import app
@@ -20,10 +25,40 @@ def generate(order: str, provider: str):
ct.cachedfile = cf ct.cachedfile = cf
ct.save() ct.save()
responses = register_ticket_outputs.send(order.event) with language(order.locale):
for receiver, response in responses: responses = register_ticket_outputs.send(order.event)
prov = response(order.event) for receiver, response in responses:
if prov.identifier == provider: prov = response(order.event)
ct.cachedfile.filename, ct.cachedfile.type, data = prov.generate(order) if prov.identifier == provider:
ct.cachedfile.file.save(cachedfile_name(ct.cachedfile, ct.cachedfile.filename), ContentFile(data)) ct.cachedfile.filename, ct.cachedfile.type, data = prov.generate(order)
ct.cachedfile.save() 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.')
@@ -10,13 +10,14 @@
{% bootstrap_field form.ticket_download layout="horizontal" %} {% bootstrap_field form.ticket_download layout="horizontal" %}
{% bootstrap_field form.ticket_download_date layout="horizontal" %} {% bootstrap_field form.ticket_download_date layout="horizontal" %}
{% for provider in providers %} {% for provider in providers %}
<div class="panel panel-default"> <div class="panel panel-default ticketoutput-panel">
<div class="panel-heading"> <div class="panel-heading">
<div class="row"> <a href="{% url "control:event.settings.tickets.preview" event=request.event.slug organizer=request.organizer.slug output=provider.identifier %}"
<div class="col-sm-10"> class="btn btn-default btn-sm pull-right" target="_blank">
<h3 class="panel-title">{{ provider.verbose_name }}</h3> {% trans "Preview" %}
</div> </a>
</div> <h3 class="panel-title">{{ provider.verbose_name }}</h3>
<div class="clear"></div>
</div> </div>
<div class="panel-body"> <div class="panel-body">
{% bootstrap_form provider.form layout='horizontal' %} {% bootstrap_form provider.form layout='horizontal' %}
+2
View File
@@ -42,6 +42,8 @@ urlpatterns = [
url(r'^settings/permissions$', event.EventPermissions.as_view(), name='event.settings.permissions'), url(r'^settings/permissions$', event.EventPermissions.as_view(), name='event.settings.permissions'),
url(r'^settings/payment$', event.PaymentSettings.as_view(), name='event.settings.payment'), url(r'^settings/payment$', event.PaymentSettings.as_view(), name='event.settings.payment'),
url(r'^settings/tickets$', event.TicketSettings.as_view(), name='event.settings.tickets'), url(r'^settings/tickets$', event.TicketSettings.as_view(), name='event.settings.tickets'),
url(r'^settings/tickets/preview/(?P<output>[^/]+)$', event.TicketSettingsPreview.as_view(),
name='event.settings.tickets.preview'),
url(r'^settings/email$', event.MailSettings.as_view(), name='event.settings.mail'), url(r'^settings/email$', event.MailSettings.as_view(), name='event.settings.mail'),
url(r'^settings/invoice$', event.InvoiceSettings.as_view(), name='event.settings.invoice'), url(r'^settings/invoice$', event.InvoiceSettings.as_view(), name='event.settings.invoice'),
url(r'^settings/invoice/preview$', event.InvoicePreview.as_view(), name='event.settings.invoice.preview'), url(r'^settings/invoice/preview$', event.InvoicePreview.as_view(), name='event.settings.invoice.preview'),
+30
View File
@@ -18,6 +18,7 @@ from pretix.base.forms import I18nModelForm
from pretix.base.models import ( from pretix.base.models import (
Event, EventPermission, Item, ItemVariation, User, Event, EventPermission, Item, ItemVariation, User,
) )
from pretix.base.services import tickets
from pretix.base.services.invoices import build_preview_invoice_pdf from pretix.base.services.invoices import build_preview_invoice_pdf
from pretix.base.signals import ( from pretix.base.signals import (
register_payment_providers, register_ticket_outputs, register_payment_providers, register_ticket_outputs,
@@ -378,6 +379,35 @@ class MailSettings(EventSettingsFormView):
return self.get(request) return self.get(request)
class TicketSettingsPreview(EventPermissionRequiredMixin, View):
permission = 'can_change_settings'
@cached_property
def output(self):
responses = register_ticket_outputs.send(self.request.event)
for receiver, response in responses:
provider = response(self.request.event)
if provider.identifier == self.kwargs.get('output'):
return provider
def get(self, request, *args, **kwargs):
if not self.output:
messages.error(request, _('You requested an invalid ticket output type.'))
return redirect(self.get_error_url())
fname, mimet, data = tickets.preview(self.request.event.pk, self.output.identifier)
resp = HttpResponse(data, content_type=mimet)
ftype = fname.split(".")[-1]
resp['Content-Disposition'] = 'attachment; filename="ticket-preview.{}"'.format(ftype)
return resp
def get_error_url(self) -> str:
return reverse('control:event.settings.tickets', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug
})
class TicketSettings(EventPermissionRequiredMixin, FormView): class TicketSettings(EventPermissionRequiredMixin, FormView):
model = Event model = Event
form_class = TicketSettingsForm form_class = TicketSettingsForm
@@ -114,3 +114,6 @@ div[data-formset-body], div[data-formset-form], div[data-nested-formset-form], d
} }
} }
} }
.ticketoutput-panel .panel-title {
line-height: 30px;
}