From 2d988406e38ec523a50d01affe7100e62198dea7 Mon Sep 17 00:00:00 2001 From: Richard Schreiber Date: Mon, 16 Mar 2026 14:38:36 +0100 Subject: [PATCH] Display invoice and tickets inline in browser (Z#23225892) --- src/pretix/presale/views/order.py | 37 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 73817f97c5..1cc731c479 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -1220,28 +1220,25 @@ class OrderDownloadMixin: resp = HttpResponseRedirect(value.file.file.read()) return resp else: - resp = FileResponse(value.file.file, content_type=value.type) - if self.order_position.subevent: - # Subevent date in filename improves accessibility e.g. for screen reader users - resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}-{}-{}{}"'.format( - self.request.event.slug.upper(), self.order.code, self.order_position.positionid, - self.order_position.subevent.date_from.strftime('%Y_%m_%d'), - self.output.identifier, value.extension - ) - else: - resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}-{}{}"'.format( - self.request.event.slug.upper(), self.order.code, self.order_position.positionid, - self.output.identifier, value.extension - ) + name_parts = ( + self.request.event.slug.upper(), + self.order.code, + self.order_position.positionid, + self.order_position.subevent.date_from.strftime('%Y_%m_%d') if self.order_position.subevent else None, + self.output.identifier + ) + filename = "-".join(filter(None, name_parts)) + value.extension + resp = FileResponse(value.file.file, filename=filename, content_type=value.type) return resp elif isinstance(value, CachedCombinedTicket): if value.type == 'text/uri-list': resp = HttpResponseRedirect(value.file.file.read()) return resp else: - resp = FileResponse(value.file.file, content_type=value.type) - resp['Content-Disposition'] = 'attachment; filename="{}-{}-{}{}"'.format( - self.request.event.slug.upper(), self.order.code, self.output.identifier, value.extension + resp = FileResponse( + value.file.file, + filename="-".join(self.request.event.slug.upper(), self.order.code, self.output.identifier) + value.extension, + content_type=value.type ) return resp else: @@ -1383,12 +1380,14 @@ class InvoiceDownload(EventViewMixin, OrderDetailMixin, View): return redirect(self.get_order_url()) try: - resp = FileResponse(invoice.file.file, content_type='application/pdf') + resp = FileResponse( + invoice.file.file, + filename='{}.pdf'.format(re.sub("[^a-zA-Z0-9-_.]+", "_", invoice.number)), + content_type='application/pdf' + ) except FileNotFoundError: invoice_pdf_task.apply(args=(invoice.pk,)) return self.get(request, *args, **kwargs) - resp['Content-Disposition'] = 'inline; filename="{}.pdf"'.format(re.sub("[^a-zA-Z0-9-_.]+", "_", invoice.number)) - resp._csp_ignore = True # Some browser's PDF readers do not work with CSP return resp