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'), name='event.order.cancel'),
url(r'^order/(?P<order>[^/]+)/modify$', pretix.presale.views.order.OrderModify.as_view(), url(r'^order/(?P<order>[^/]+)/modify$', pretix.presale.views.order.OrderModify.as_view(),
name='event.order.modify'), 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'^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'^logout$', pretix.presale.views.event.EventLogout.as_view(), name='event.logout'),
url(r'^orders$', pretix.presale.views.event.EventOrders.as_view(), name='event.orders'), url(r'^orders$', pretix.presale.views.event.EventOrders.as_view(), name='event.orders'),

View File

@@ -1,17 +1,22 @@
from datetime import datetime from io import StringIO, BytesIO
from itertools import groupby
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.views.generic import TemplateView from django.views.generic import TemplateView, View
from django.http import HttpResponseNotFound, HttpResponseForbidden from django.http import HttpResponseNotFound, HttpResponseForbidden, HttpResponse
from pretix.base.models import Order, OrderPosition from pretix.base.models import Order, OrderPosition
from pretix.base.signals import register_payment_providers from pretix.base.signals import register_payment_providers
from pretix.presale.views import EventViewMixin, EventLoginRequiredMixin, CartDisplayMixin from pretix.presale.views import EventViewMixin, EventLoginRequiredMixin, CartDisplayMixin
from pretix.presale.views.checkout import QuestionsViewMixin 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: class OrderDetailMixin:
@@ -140,3 +145,66 @@ class OrderCancel(EventViewMixin, EventLoginRequiredMixin, OrderDetailMixin,
ctx = super().get_context_data(**kwargs) ctx = super().get_context_data(**kwargs)
ctx['order'] = self.order ctx['order'] = self.order
return ctx 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

View File

@@ -6,6 +6,8 @@ django-bootstrap3
-e git+https://github.com/pretix/django-formset-js.git@master#egg=django-formset-js -e git+https://github.com/pretix/django-formset-js.git@master#egg=django-formset-js
-e git+https://github.com/pretix/cleanerversion.git@pretix#egg=cleanerversion -e git+https://github.com/pretix/cleanerversion.git@pretix#egg=cleanerversion
django-compressor django-compressor
reportlab
-e git+https://github.com/pretix/PyPDF2.git@pretix#egg=PyPDF2
# Deployment / static file compilation requirements # Deployment / static file compilation requirements
BeautifulSoup4 BeautifulSoup4