diff --git a/src/pretix/base/exporter.py b/src/pretix/base/exporter.py index 2424adfff..18f6cea95 100644 --- a/src/pretix/base/exporter.py +++ b/src/pretix/base/exporter.py @@ -68,6 +68,11 @@ class BaseExporter: :type form_data: dict :param form_data: The form data of the export details form + + Note: If you use a ``ModelChoiceField`` (or a ``ModelMultipleChoiceField``), the + ``form_data`` will not contain the model instance but only it's primary key (or + a list of primary keys) for reasons of internal serialization when using background + tasks. """ raise NotImplementedError() # NOQA diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 0706f7457..2b860b55e 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -1,3 +1,6 @@ +from django import forms +from django.db import models + from pretix.base.forms import I18nModelForm from pretix.base.models import Order @@ -6,3 +9,17 @@ class ExtendForm(I18nModelForm): class Meta: model = Order fields = ['expires'] + + +class ExporterForm(forms.Form): + + def clean(self): + data = super().clean() + + for k, v in data.items(): + if isinstance(v, models.Model): + data[k] = v.pk + elif isinstance(v, models.QuerySet): + data[k] = [m.pk for m in v] + + return data diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 1bf61ed37..396aacf6b 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -26,7 +26,7 @@ from pretix.base.signals import ( register_data_exporters, register_payment_providers, register_ticket_outputs, ) -from pretix.control.forms.orders import ExtendForm +from pretix.control.forms.orders import ExporterForm, ExtendForm from pretix.control.permissions import EventPermissionRequiredMixin from pretix.multidomain.urlreverse import build_absolute_uri @@ -391,7 +391,7 @@ class ExportView(EventPermissionRequiredMixin, TemplateView): responses = register_data_exporters.send(self.request.event) for receiver, response in responses: ex = response(self.request.event) - ex.form = forms.Form( + ex.form = ExporterForm( data=(self.request.POST if self.request.method == 'POST' else None) ) ex.form.fields = ex.export_form_fields diff --git a/src/pretix/plugins/checkinlists/exporters.py b/src/pretix/plugins/checkinlists/exporters.py index 7c9bd9840..4458524e5 100644 --- a/src/pretix/plugins/checkinlists/exporters.py +++ b/src/pretix/plugins/checkinlists/exporters.py @@ -6,7 +6,7 @@ from django import forms from django.utils.translation import ugettext as _ from pretix.base.exporter import BaseExporter -from pretix.base.models import Order, OrderPosition +from pretix.base.models import Order, OrderPosition, Question class BaseCheckinList(BaseExporter): @@ -65,9 +65,9 @@ class CSVCheckinList(BaseCheckinList): output = io.StringIO() writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC, delimiter=",") - questions = list(form_data['questions']) + questions = list(Question.objects.filter(event=self.event, id__in=form_data['questions'])) qs = OrderPosition.objects.filter( - order__event=self.event, item__in=form_data['items'] + order__event=self.event, item_id__in=form_data['items'] ).prefetch_related( 'answers', 'answers__question' ).select_related('order', 'item', 'variation')