Make PDF ticket cover more extensible

This commit is contained in:
Raphael Michel
2017-09-27 18:24:11 +02:00
parent 06fe076ce2
commit c030bd35ca
3 changed files with 32 additions and 21 deletions

View File

@@ -162,7 +162,7 @@ var editor = {
if (key.startsWith('meta:')) { if (key.startsWith('meta:')) {
return key.substr(5); 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) { _load_pdf: function (dump) {

View File

@@ -281,6 +281,9 @@ class PdfTicketOutput(BaseTicketOutput):
self._register_fonts() self._register_fonts()
return canvas.Canvas(buffer, pagesize=pagesize) 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')): def _render_with_background(self, buffer, title=_('Ticket')):
from PyPDF2 import PdfFileWriter, PdfFileReader from PyPDF2 import PdfFileWriter, PdfFileReader
buffer.seek(0) buffer.seek(0)
@@ -292,7 +295,7 @@ class PdfTicketOutput(BaseTicketOutput):
elif isinstance(bg_file, File): elif isinstance(bg_file, File):
bgf = default_storage.open(bg_file.name, "rb") bgf = default_storage.open(bg_file.name, "rb")
else: else:
bgf = open(finders.find('pretixpresale/pdf/ticket_default_a4.pdf'), "rb") bgf = self._get_default_background()
bg_pdf = PdfFileReader(bgf) bg_pdf = PdfFileReader(bgf)
for page in new_pdf.pages: for page in new_pdf.pages:

View File

@@ -39,6 +39,9 @@ class EditorView(EventPermissionRequiredMixin, TemplateView):
minfilesize = 10 minfilesize = 10
identifier = 'pdf' identifier = 'pdf'
def get_output(self, *args, **kwargs):
return PdfTicketOutput(self.request.event, *args, **kwargs)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
resp = super().get(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:" 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 error, None
return None, f 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): def post(self, request, *args, **kwargs):
if "background" in request.FILES: if "background" in request.FILES:
error, fileobj = self.process_upload() error, fileobj = self.process_upload()
@@ -93,25 +113,13 @@ class EditorView(EventPermissionRequiredMixin, TemplateView):
if "preview" in request.POST: if "preview" in request.POST:
with rolledback_transaction(), language(request.event.settings.locale): with rolledback_transaction(), language(request.event.settings.locale):
item = request.event.items.create(name=_("Sample product"), default_price=42.23, p = self._get_preview_position()
description=_("Sample product description"))
item2 = request.event.items.create(name=_("Sample workshop"), default_price=23.40)
from pretix.base.models import Order prov = self.get_output(
order = request.event.orders.create(status=Order.STATUS_PENDING, datetime=now(), override_layout=(json.loads(request.POST.get("data"))
email='sample@pretix.eu', if request.POST.get("data") else None),
expires=now(), code="PREVIEW1234", total=119) override_background=cf.file if cf else None
)
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)
fname, mimet, data = prov.generate(p) fname, mimet, data = prov.generate(p)
resp = HttpResponse(data, content_type=mimet) resp = HttpResponse(data, content_type=mimet)
@@ -149,7 +157,7 @@ class EditorView(EventPermissionRequiredMixin, TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
prov = PdfTicketOutput(self.request.event) prov = self.get_output()
ctx['fonts'] = get_fonts() ctx['fonts'] = get_fonts()
ctx['pdf'] = ( ctx['pdf'] = (
self.request.event.settings.get('ticketoutput_{}_background'.format(self.identifier)).url self.request.event.settings.get('ticketoutput_{}_background'.format(self.identifier)).url