diff --git a/src/pretix/plugins/sendmail/forms.py b/src/pretix/plugins/sendmail/forms.py index 74d3d858fe..3bb809519a 100644 --- a/src/pretix/plugins/sendmail/forms.py +++ b/src/pretix/plugins/sendmail/forms.py @@ -12,11 +12,13 @@ class MailForm(forms.Form): sendto = forms.MultipleChoiceField() # overridden later subject = forms.CharField(label=_("Subject")) message = forms.CharField(label=_("Message")) - item = forms.ModelChoiceField( - Item.objects.none(), + items = forms.ModelMultipleChoiceField( + widget=forms.CheckboxSelectMultiple( + attrs={'class': 'scrolling-multiple-choice'} + ), label=_('Only send to people who bought'), - required=False, - empty_label=_('Any product') + required=True, + queryset=Item.objects.none() ) subevent = forms.ModelChoiceField( SubEvent.objects.none(), @@ -53,10 +55,18 @@ class MailForm(forms.Form): ) self.fields['sendto'] = forms.MultipleChoiceField( label=_("Send to customers with order status"), - widget=forms.CheckboxSelectMultiple, + widget=forms.CheckboxSelectMultiple( + attrs={'class': 'scrolling-multiple-choice'} + ), choices=choices ) - self.fields['item'].queryset = event.items.all() + if not self.initial.get('sendto'): + self.initial['sendto'] = ['p', 'n'] + + self.fields['items'].queryset = event.items.all() + if not self.initial.get('items'): + self.initial['items'] = event.items.all() + if event.has_subevents: self.fields['subevent'].queryset = event.subevents.all() self.fields['subevent'].widget = Select2( diff --git a/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html index fdfdf2c2e2..0c2f55d49b 100644 --- a/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html +++ b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html @@ -11,7 +11,7 @@ {% if form.subevent %} {% bootstrap_field form.subevent layout='horizontal' %} {% endif %} - {% bootstrap_field form.item layout='horizontal' %} + {% bootstrap_field form.items layout='horizontal' %} {% bootstrap_field form.subject layout='horizontal' %} {% bootstrap_field form.message layout='horizontal' %} {% if request.method == "POST" %} diff --git a/src/pretix/plugins/sendmail/views.py b/src/pretix/plugins/sendmail/views.py index f7ac1f5104..b1ca8b63c1 100644 --- a/src/pretix/plugins/sendmail/views.py +++ b/src/pretix/plugins/sendmail/views.py @@ -42,6 +42,7 @@ class SenderView(EventPermissionRequiredMixin, FormView): 'message': LazyI18nString(logentry.parsed_data['message']), 'subject': LazyI18nString(logentry.parsed_data['subject']), 'sendto': logentry.parsed_data['sendto'], + 'items': self.request.event.items.filter(id__in=[a['id'] for a in logentry.parsed_data['items']]), } if logentry.parsed_data.get('subevent'): try: @@ -64,9 +65,8 @@ class SenderView(EventPermissionRequiredMixin, FormView): if 'overdue' in form.cleaned_data['sendto']: statusq |= Q(status=Order.STATUS_PENDING, expires__lt=now()) orders = qs.filter(statusq) - if form.cleaned_data.get('item'): - orders = orders.filter(all_positions__item=form.cleaned_data.get('item'), - all_positions__canceled=False) + orders = orders.filter(all_positions__item_id__in=[i.pk for i in form.cleaned_data.get('items')], + all_positions__canceled=False) if form.cleaned_data.get('subevent'): orders = orders.filter(all_positions__subevent__in=(form.cleaned_data.get('subevent'),), all_positions__canceled=False) diff --git a/src/tests/plugins/test_sendmail.py b/src/tests/plugins/test_sendmail.py index c22a3fe67b..969bef9c6f 100644 --- a/src/tests/plugins/test_sendmail.py +++ b/src/tests/plugins/test_sendmail.py @@ -76,6 +76,7 @@ def test_sendmail_simple_case(logged_in_client, sendmail_url, event, order): djmail.outbox = [] response = logged_in_client.post(sendmail_url, {'sendto': 'n', + 'items': order.positions.first().item_id, 'subject_0': 'Test subject', 'message_0': 'This is a test file for sending mails.' }, @@ -100,6 +101,7 @@ def test_sendmail_email_not_sent_if_order_not_match(logged_in_client, sendmail_u djmail.outbox = [] response = logged_in_client.post(sendmail_url, {'sendto': 'p', + 'items': order.positions.first().item_id, 'subject_0': 'Test subject', 'message_0': 'This is a test file for sending mails.' }, @@ -114,6 +116,7 @@ def test_sendmail_preview(logged_in_client, sendmail_url, event, order): djmail.outbox = [] response = logged_in_client.post(sendmail_url, {'sendto': 'n', + 'items': order.positions.first().item_id, 'subject_0': 'Test subject', 'message_0': 'This is a test file for sending mails.', 'action': 'preview' @@ -130,6 +133,7 @@ def test_sendmail_invalid_data(logged_in_client, sendmail_url, event, order): djmail.outbox = [] response = logged_in_client.post(sendmail_url, {'sendto': 'n', + 'items': order.positions.first().item_id, 'subject_0': 'Test subject', }, follow=True) @@ -154,6 +158,7 @@ def test_sendmail_multi_locales(logged_in_client, sendmail_url, event, item): response = logged_in_client.post(sendmail_url, {'sendto': 'p', + 'items': item.pk, 'subject_0': 'Test subject', 'message_0': 'Test message', 'subject_1': 'Benutzer', @@ -189,6 +194,7 @@ def test_sendmail_subevents(logged_in_client, sendmail_url, event, order): djmail.outbox = [] response = logged_in_client.post(sendmail_url, {'sendto': 'n', + 'items': order.positions.first().item_id, 'subject_0': 'Test subject', 'message_0': 'This is a test file for sending mails.', 'subevent': se1.pk @@ -201,6 +207,7 @@ def test_sendmail_subevents(logged_in_client, sendmail_url, event, order): djmail.outbox = [] response = logged_in_client.post(sendmail_url, {'sendto': 'n', + 'items': order.positions.first().item_id, 'subject_0': 'Test subject', 'message_0': 'This is a test file for sending mails.', 'subevent': se2.pk @@ -220,6 +227,7 @@ def test_sendmail_placeholder(logged_in_client, sendmail_url, event, order): djmail.outbox = [] response = logged_in_client.post(sendmail_url, {'sendto': 'n', + 'items': order.positions.first().item_id, 'subject_0': '{code} Test subject', 'message_0': 'This is a test file for sending mails.', 'action': 'preview'