diff --git a/src/pretix/base/exporters/answers.py b/src/pretix/base/exporters/answers.py index decb75a22..36f6f6171 100644 --- a/src/pretix/base/exporters/answers.py +++ b/src/pretix/base/exporters/answers.py @@ -40,6 +40,7 @@ class AnswerFilesExporter(BaseExporter): if form_data.get('questions'): qs = qs.filter(question__in=form_data['questions']) with tempfile.TemporaryDirectory() as d: + any = False with ZipFile(os.path.join(d, 'tmp.zip'), 'w') as zipf: for i in qs: if i.file: @@ -51,9 +52,12 @@ class AnswerFilesExporter(BaseExporter): i.question.pk, os.path.basename(i.file.name).split('.', 1)[1] ) + any = True zipf.writestr(fname, i.file.read()) i.file.close() + if not any: + return None with open(os.path.join(d, 'tmp.zip'), 'rb') as zipf: return '{}_answers.zip'.format(self.event.slug), 'application/zip', zipf.read() diff --git a/src/pretix/base/exporters/invoices.py b/src/pretix/base/exporters/invoices.py index e6b9bedfb..08ee71e08 100644 --- a/src/pretix/base/exporters/invoices.py +++ b/src/pretix/base/exporters/invoices.py @@ -46,6 +46,7 @@ class InvoiceExporter(BaseExporter): qs = qs.filter(date__lte=date_value) with tempfile.TemporaryDirectory() as d: + any = False with ZipFile(os.path.join(d, 'tmp.zip'), 'w') as zipf: for i in qs: try: @@ -54,14 +55,19 @@ class InvoiceExporter(BaseExporter): i.refresh_from_db() i.file.open('rb') zipf.writestr('{}.pdf'.format(i.number), i.file.read()) + any = True 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()) + any = True i.file.close() + if not any: + return None + 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/base/services/export.py b/src/pretix/base/services/export.py index 4ee65230e..60ee1015e 100644 --- a/src/pretix/base/services/export.py +++ b/src/pretix/base/services/export.py @@ -2,15 +2,20 @@ from typing import Any, Dict from django.core.files.base import ContentFile from django.utils.timezone import override +from django.utils.translation import ugettext -from pretix.base.i18n import language +from pretix.base.i18n import LazyLocaleException, language from pretix.base.models import CachedFile, Event, cachedfile_name from pretix.base.services.tasks import ProfiledTask from pretix.base.signals import register_data_exporters from pretix.celery_app import app -@app.task(base=ProfiledTask) +class ExportError(LazyLocaleException): + pass + + +@app.task(base=ProfiledTask, throws=(ExportError,)) def export(event: str, fileid: str, provider: str, form_data: Dict[str, Any]) -> None: event = Event.objects.get(id=event) file = CachedFile.objects.get(id=fileid) @@ -19,7 +24,12 @@ def export(event: str, fileid: str, provider: str, form_data: Dict[str, Any]) -> for receiver, response in responses: ex = response(event) if ex.identifier == provider: - file.filename, file.type, data = ex.render(form_data) + d = ex.render(form_data) + if d is None: + raise ExportError( + ugettext('Your export did not contain any data.') + ) + file.filename, file.type, data = d file.file.save(cachedfile_name(file, file.filename), ContentFile(data)) file.save() return file.pk diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 0d20681ce..e6a2af036 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -1655,6 +1655,7 @@ class ExportMixin: class ExportDoView(EventPermissionRequiredMixin, ExportMixin, AsyncAction, View): permission = 'can_view_orders' + known_errortypes = ['ExportError'] task = export def get_success_message(self, value):