From c030bd35ca1b1a07ecd3be83c9bf256b062db5f4 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 27 Sep 2017 18:24:11 +0200 Subject: [PATCH] Make PDF ticket cover more extensible --- .../pretixplugins/ticketoutputpdf/editor.js | 2 +- .../plugins/ticketoutputpdf/ticketoutput.py | 5 +- src/pretix/plugins/ticketoutputpdf/views.py | 46 +++++++++++-------- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/pretix/plugins/ticketoutputpdf/static/pretixplugins/ticketoutputpdf/editor.js b/src/pretix/plugins/ticketoutputpdf/static/pretixplugins/ticketoutputpdf/editor.js index c1cc5c97f5..e3342a88b2 100644 --- a/src/pretix/plugins/ticketoutputpdf/static/pretixplugins/ticketoutputpdf/editor.js +++ b/src/pretix/plugins/ticketoutputpdf/static/pretixplugins/ticketoutputpdf/editor.js @@ -162,7 +162,7 @@ var editor = { if (key.startsWith('meta:')) { return key.substr(5); } - return $('#toolbox-content option[value='+key+']').attr('data-sample'); + return $('#toolbox-content option[value='+key+']').attr('data-sample') || ''; }, _load_pdf: function (dump) { diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index 96c32cb5d3..cef841d009 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -281,6 +281,9 @@ class PdfTicketOutput(BaseTicketOutput): self._register_fonts() return canvas.Canvas(buffer, pagesize=pagesize) + def _get_default_background(self): + return open(finders.find('pretixpresale/pdf/ticket_default_a4.pdf'), "rb") + def _render_with_background(self, buffer, title=_('Ticket')): from PyPDF2 import PdfFileWriter, PdfFileReader buffer.seek(0) @@ -292,7 +295,7 @@ class PdfTicketOutput(BaseTicketOutput): elif isinstance(bg_file, File): bgf = default_storage.open(bg_file.name, "rb") else: - bgf = open(finders.find('pretixpresale/pdf/ticket_default_a4.pdf'), "rb") + bgf = self._get_default_background() bg_pdf = PdfFileReader(bgf) for page in new_pdf.pages: diff --git a/src/pretix/plugins/ticketoutputpdf/views.py b/src/pretix/plugins/ticketoutputpdf/views.py index ed9b5cf1a9..64f7dfe3a8 100644 --- a/src/pretix/plugins/ticketoutputpdf/views.py +++ b/src/pretix/plugins/ticketoutputpdf/views.py @@ -39,6 +39,9 @@ class EditorView(EventPermissionRequiredMixin, TemplateView): minfilesize = 10 identifier = 'pdf' + def get_output(self, *args, **kwargs): + return PdfTicketOutput(self.request.event, *args, **kwargs) + def get(self, request, *args, **kwargs): resp = super().get(request, *args, **kwargs) resp['Content-Security-Policy'] = "script-src 'unsafe-eval'; style-src 'unsafe-inline'; img-src blob:; font-src data: blob:" @@ -58,6 +61,23 @@ class EditorView(EventPermissionRequiredMixin, TemplateView): return error, None return None, f + def _get_preview_position(self): + item = self.request.event.items.create(name=_("Sample product"), default_price=42.23, + description=_("Sample product description")) + item2 = self.request.event.items.create(name=_("Sample workshop"), default_price=23.40) + + from pretix.base.models import Order + order = self.request.event.orders.create(status=Order.STATUS_PENDING, datetime=now(), + email='sample@pretix.eu', + expires=now(), code="PREVIEW1234", total=119) + + p = order.positions.create(item=item, attendee_name=_("John Doe"), price=item.default_price) + order.positions.create(item=item2, attendee_name=_("John Doe"), price=item.default_price, addon_to=p) + order.positions.create(item=item2, attendee_name=_("John Doe"), price=item.default_price, addon_to=p) + + InvoiceAddress.objects.create(order=order, name=_("John Doe"), company=_("Sample company")) + return p + def post(self, request, *args, **kwargs): if "background" in request.FILES: error, fileobj = self.process_upload() @@ -93,25 +113,13 @@ class EditorView(EventPermissionRequiredMixin, TemplateView): if "preview" in request.POST: with rolledback_transaction(), language(request.event.settings.locale): - item = request.event.items.create(name=_("Sample product"), default_price=42.23, - description=_("Sample product description")) - item2 = request.event.items.create(name=_("Sample workshop"), default_price=23.40) + p = self._get_preview_position() - from pretix.base.models import Order - order = request.event.orders.create(status=Order.STATUS_PENDING, datetime=now(), - email='sample@pretix.eu', - expires=now(), code="PREVIEW1234", total=119) - - p = order.positions.create(item=item, attendee_name=_("John Doe"), price=item.default_price) - order.positions.create(item=item2, attendee_name=_("John Doe"), price=item.default_price, addon_to=p) - order.positions.create(item=item2, attendee_name=_("John Doe"), price=item.default_price, addon_to=p) - - InvoiceAddress.objects.create(order=order, name=_("John Doe"), company=_("Sample company")) - - prov = PdfTicketOutput(request.event, - override_layout=(json.loads(request.POST.get("data")) - if request.POST.get("data") else None), - override_background=cf.file if cf else None) + prov = self.get_output( + override_layout=(json.loads(request.POST.get("data")) + if request.POST.get("data") else None), + override_background=cf.file if cf else None + ) fname, mimet, data = prov.generate(p) resp = HttpResponse(data, content_type=mimet) @@ -149,7 +157,7 @@ class EditorView(EventPermissionRequiredMixin, TemplateView): def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) - prov = PdfTicketOutput(self.request.event) + prov = self.get_output() ctx['fonts'] = get_fonts() ctx['pdf'] = ( self.request.event.settings.get('ticketoutput_{}_background'.format(self.identifier)).url