From 6ecddfc6c0059a4ffb7372a1753244b7d40104ad Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 28 May 2018 11:41:41 +0200 Subject: [PATCH] Automatically re-render PDF for files lost due to bug --- src/pretix/base/exporters/invoices.py | 15 +++++++++++---- src/pretix/control/views/orders.py | 11 ++++++++--- src/pretix/presale/views/order.py | 9 +++++++-- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/pretix/base/exporters/invoices.py b/src/pretix/base/exporters/invoices.py index 8dfd838375..6af2c22f1b 100644 --- a/src/pretix/base/exporters/invoices.py +++ b/src/pretix/base/exporters/invoices.py @@ -38,12 +38,19 @@ class InvoiceExporter(BaseExporter): with tempfile.TemporaryDirectory() as d: with ZipFile(os.path.join(d, 'tmp.zip'), 'w') as zipf: for i in qs: - if not i.file: + try: + if not i.file: + invoice_pdf_task.apply(args=(i.pk,)) + i.refresh_from_db() + i.file.open('rb') + zipf.writestr('{}.pdf'.format(i.number), i.file.read()) + i.file.close() + except FileNotFoundError: invoice_pdf_task.apply(args=(i.pk,)) i.refresh_from_db() - i.file.open('rb') - zipf.writestr('{}.pdf'.format(i.number), i.file.read()) - i.file.close() + i.file.open('rb') + zipf.writestr('{}.pdf'.format(i.number), i.file.read()) + i.file.close() with open(os.path.join(d, 'tmp.zip'), 'rb') as zipf: return '{}_invoices.zip'.format(self.event.slug), 'application/zip', zipf.read() diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 03df6638cf..170d0fd8f1 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -31,8 +31,8 @@ from pretix.base.models.orders import OrderFee from pretix.base.models.tax import EU_COUNTRIES from pretix.base.services.export import export from pretix.base.services.invoices import ( - generate_cancellation, generate_invoice, invoice_pdf, invoice_qualified, - regenerate_invoice, + generate_cancellation, generate_invoice, invoice_pdf, invoice_pdf_task, + invoice_qualified, regenerate_invoice, ) from pretix.base.services.locking import LockTimeoutException from pretix.base.services.mail import SendMailException, render_mail @@ -461,7 +461,12 @@ class InvoiceDownload(EventPermissionRequiredMixin, View): 'now. Please try again in a few seconds.')) return redirect(self.get_order_url()) - resp = FileResponse(self.invoice.file.file, content_type='application/pdf') + try: + resp = FileResponse(self.invoice.file.file, content_type='application/pdf') + except FileNotFoundError: + invoice_pdf_task.apply(args=(self.invoice.pk,)) + return self.get(request, *args, **kwargs) + resp['Content-Disposition'] = 'attachment; filename="{}.pdf"'.format(self.invoice.number) return resp diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 5cb06ab83a..a7895ae320 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -20,7 +20,8 @@ from pretix.base.models.orders import ( ) from pretix.base.payment import PaymentException from pretix.base.services.invoices import ( - generate_cancellation, generate_invoice, invoice_pdf, invoice_qualified, + generate_cancellation, generate_invoice, invoice_pdf, invoice_pdf_task, + invoice_qualified, ) from pretix.base.services.orders import cancel_order from pretix.base.services.tickets import ( @@ -673,6 +674,10 @@ class InvoiceDownload(EventViewMixin, OrderDetailMixin, View): 'now. Please try again in a few seconds.')) return redirect(self.get_order_url()) - resp = FileResponse(invoice.file.file, content_type='application/pdf') + try: + resp = FileResponse(invoice.file.file, content_type='application/pdf') + except FileNotFoundError: + invoice_pdf_task.apply(args=(invoice.pk,)) + return self.get(request, *args, **kwargs) resp['Content-Disposition'] = 'attachment; filename="{}.pdf"'.format(invoice.number) return resp