From 53713acd9a0616e14a17814545e6c62f9ae53e53 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 13 Jan 2017 16:10:34 +0100 Subject: [PATCH] Refs #356 -- Multi-page PDFs --- src/pretix/base/models/orders.py | 8 ++- .../plugins/ticketoutputpdf/ticketoutput.py | 56 ++++++++++++------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 1e10059f0..0434dc08a 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -1,4 +1,5 @@ import copy +import os import string from datetime import datetime from decimal import Decimal @@ -565,19 +566,20 @@ class InvoiceAddress(models.Model): def cachedticket_name(instance, filename: str) -> str: secret = get_random_string(length=16, allowed_chars=string.ascii_letters + string.digits) - return 'tickets/{org}/{ev}/{code}-{no}-{prov}-{secret}.pdf'.format( + return 'tickets/{org}/{ev}/{code}-{no}-{prov}-{secret}.dat'.format( org=instance.order_position.order.event.organizer.slug, ev=instance.order_position.order.event.slug, prov=instance.provider, no=instance.order_position.positionid, code=instance.order_position.order.code, - secret=secret + secret=secret, + ext=os.path.splitext(filename)[1] ) def cachedcombinedticket_name(instance, filename: str) -> str: secret = get_random_string(length=16, allowed_chars=string.ascii_letters + string.digits) - return 'tickets/{org}/{ev}/{code}-{prov}-{secret}.pdf'.format( + return 'tickets/{org}/{ev}/{code}-{prov}-{secret}.dat'.format( org=instance.order.event.organizer.slug, ev=instance.order.event.slug, prov=instance.provider, diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index 99bfccf24..ebe19e066 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -9,6 +9,7 @@ from django.core.files import File from django.core.files.storage import default_storage from django.utils.translation import ugettext_lazy as _ +from pretix.base.models import Order from pretix.base.ticketoutput import BaseTicketOutput from pretix.control.forms import ExtFileField @@ -20,27 +21,11 @@ class PdfTicketOutput(BaseTicketOutput): verbose_name = _('PDF output') download_button_text = _('PDF') - def generate(self, op): + def _draw_page(self, p, op, order): from reportlab.graphics.shapes import Drawing - from reportlab.pdfgen import canvas - from reportlab.lib import pagesizes, units + from reportlab.lib import units from reportlab.graphics.barcode.qr import QrCodeWidget from reportlab.graphics import renderPDF - from PyPDF2 import PdfFileWriter, PdfFileReader - - order = op.order - - pagesize = self.settings.get('pagesize', default='A4') - if hasattr(pagesizes, pagesize): - pagesize = getattr(pagesizes, pagesize) - else: - pagesize = pagesizes.A4 - orientation = self.settings.get('orientation', default='portrait') - if hasattr(pagesizes, orientation): - pagesize = getattr(pagesizes, orientation)(pagesize) - - buffer = BytesIO() - p = canvas.Canvas(buffer, pagesize=pagesize) event_s = self.settings.get('event_s', default=22, as_type=float) if event_s: @@ -102,8 +87,41 @@ class PdfTicketOutput(BaseTicketOutput): p.showPage() + def generate_order(self, order: Order): + buffer = BytesIO() + p = self._create_canvas(buffer) + for op in order.positions.all(): + self._draw_page(p, op, order) p.save() + outbuffer = self._render_with_background(buffer) + return 'order%s%s.pdf' % (self.event.slug, order.code), 'application/pdf', outbuffer.read() + def generate(self, op): + buffer = BytesIO() + p = self._create_canvas(buffer) + order = op.order + self._draw_page(p, op, order) + p.save() + outbuffer = self._render_with_background(buffer) + return 'order%s%s.pdf' % (self.event.slug, order.code), 'application/pdf', outbuffer.read() + + def _create_canvas(self, buffer): + from reportlab.pdfgen import canvas + from reportlab.lib import pagesizes + + pagesize = self.settings.get('pagesize', default='A4') + if hasattr(pagesizes, pagesize): + pagesize = getattr(pagesizes, pagesize) + else: + pagesize = pagesizes.A4 + orientation = self.settings.get('orientation', default='portrait') + if hasattr(pagesizes, orientation): + pagesize = getattr(pagesizes, orientation)(pagesize) + + return canvas.Canvas(buffer, pagesize=pagesize) + + def _render_with_background(self, buffer): + from PyPDF2 import PdfFileWriter, PdfFileReader buffer.seek(0) new_pdf = PdfFileReader(buffer) output = PdfFileWriter() @@ -121,7 +139,7 @@ class PdfTicketOutput(BaseTicketOutput): outbuffer = BytesIO() output.write(outbuffer) outbuffer.seek(0) - return 'order%s%s.pdf' % (self.event.slug, order.code), 'application/pdf', outbuffer.read() + return outbuffer @property def settings_form_fields(self) -> dict: