Prototype for PDF generation

This commit is contained in:
Raphael Michel
2015-03-22 00:06:35 +01:00
parent 93d53b52ca
commit e774c7b7d5
4 changed files with 77 additions and 5 deletions

View File

@@ -22,6 +22,8 @@ urlpatterns = [
name='event.order.cancel'),
url(r'^order/(?P<order>[^/]+)/modify$', pretix.presale.views.order.OrderModify.as_view(),
name='event.order.modify'),
url(r'^order/(?P<order>[^/]+)/download$', pretix.presale.views.order.OrderDownload.as_view(),
name='event.order.download'),
url(r'^login$', pretix.presale.views.event.EventLogin.as_view(), name='event.checkout.login'),
url(r'^logout$', pretix.presale.views.event.EventLogout.as_view(), name='event.logout'),
url(r'^orders$', pretix.presale.views.event.EventOrders.as_view(), name='event.orders'),

View File

@@ -1,17 +1,22 @@
from datetime import datetime
from itertools import groupby
from io import StringIO, BytesIO
from django.contrib import messages
from django.core.urlresolvers import reverse
from django.shortcuts import redirect
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django.utils.functional import cached_property
from django.views.generic import TemplateView
from django.http import HttpResponseNotFound, HttpResponseForbidden
from django.views.generic import TemplateView, View
from django.http import HttpResponseNotFound, HttpResponseForbidden, HttpResponse
from pretix.base.models import Order, OrderPosition
from pretix.base.signals import register_payment_providers
from pretix.presale.views import EventViewMixin, EventLoginRequiredMixin, CartDisplayMixin
from pretix.presale.views.checkout import QuestionsViewMixin
from reportlab.graphics.shapes import Drawing
from reportlab.pdfgen import canvas
from reportlab.lib import pagesizes, units
from reportlab.graphics.barcode.qr import QrCodeWidget
from reportlab.graphics import renderPDF
from PyPDF2 import PdfFileWriter, PdfFileReader
from django.contrib.staticfiles import finders
class OrderDetailMixin:
@@ -140,3 +145,66 @@ class OrderCancel(EventViewMixin, EventLoginRequiredMixin, OrderDetailMixin,
ctx = super().get_context_data(**kwargs)
ctx['order'] = self.order
return ctx
class OrderDownload(EventViewMixin, EventLoginRequiredMixin, OrderDetailMixin,
View):
def get(self, request, *args, **kwargs):
if self.order.status != Order.STATUS_PAID:
return HttpResponseForbidden(_('Order is not paid'))
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'inline; filename="order%s%s.pdf"' % (request.event.slug, self.order.code)
pagesize = request.event.settings.get('ticketpdf_pagesize', default='A4')
if hasattr(pagesizes, pagesize):
pagesize = getattr(pagesizes, pagesize)
else:
pagesize = pagesizes.A4
defaultfname = finders.find('pretixpresale/pdf/ticket_default_a4.pdf')
fname = request.event.settings.get('ticketpdf_background', default=defaultfname)
# TODO: Handle file objects
buffer = BytesIO()
p = canvas.Canvas(buffer, pagesize=pagesize)
for op in self.order.positions.all().select_related('item', 'variation'):
p.setFont("Helvetica", 22)
p.drawString(15 * units.mm, 235 * units.mm, request.event.name)
p.setFont("Helvetica", 17)
item = op.item.name
if op.variation:
item += " " + str(op.variation)
p.drawString(15 * units.mm, 220 * units.mm, item)
p.setFont("Helvetica", 17)
p.drawString(15 * units.mm, 210 * units.mm, "%s %s" % (str(op.price), request.event.currency))
reqs = 80 * units.mm
qrw = QrCodeWidget(op.identity, barLevel='H')
b = qrw.getBounds()
w = b[2] - b[0]
h = b[3] - b[1]
d = Drawing(reqs, reqs, transform=[reqs / w, 0, 0, reqs / h, 0, 0])
d.add(qrw)
renderPDF.draw(d, p, 10 * units.mm, 130 * units.mm)
p.setFont("Helvetica", 11)
p.drawString(15 * units.mm, 130 * units.mm, op.identity)
p.showPage()
p.save()
buffer.seek(0)
new_pdf = PdfFileReader(buffer)
output = PdfFileWriter()
for page in new_pdf.pages:
bg_pdf = PdfFileReader(open(fname, "rb"))
bg_page = bg_pdf.getPage(0)
bg_page.mergePage(page)
output.addPage(bg_page)
output.write(response)
return response