diff --git a/src/pretix/base/exporters/json.py b/src/pretix/base/exporters/json.py
index fa361e818d..168a3e3319 100644
--- a/src/pretix/base/exporters/json.py
+++ b/src/pretix/base/exporters/json.py
@@ -68,6 +68,7 @@ class JSONExporter(BaseExporter):
'variation': position.variation_id,
'price': position.price,
'attendee_name': position.attendee_name,
+ 'attendee_email': position.attendee_email,
'secret': position.secret,
'answers': [
{
diff --git a/src/pretix/base/exporters/mail.py b/src/pretix/base/exporters/mail.py
index 1e4cbb3157..4afecaad63 100644
--- a/src/pretix/base/exporters/mail.py
+++ b/src/pretix/base/exporters/mail.py
@@ -4,6 +4,7 @@ from django import forms
from django.dispatch import receiver
from django.utils.translation import ugettext_lazy as _
+from pretix.base.models import OrderPosition
from ..exporter import BaseExporter
from ..models import Order
from ..signals import register_data_exporters
@@ -16,7 +17,11 @@ class MailExporter(BaseExporter):
def render(self, form_data: dict):
qs = self.event.orders.filter(status__in=form_data['status'])
addrs = qs.values('email')
- data = "\r\n".join(set(a['email'] for a in addrs))
+ pos = OrderPosition.objects.filter(
+ order__event=self.event, order__status__in=form_data['status']
+ ).values('attendee_email')
+ data = "\r\n".join(set(a['email'] for a in addrs)
+ | set(a['attendee_email'] for a in pos if a['attendee_email']))
return 'pretixemails.txt', 'text/plain', data.encode("utf-8")
@property
diff --git a/src/pretix/base/migrations/0055_auto_20170413_1537.py b/src/pretix/base/migrations/0055_auto_20170413_1537.py
new file mode 100644
index 0000000000..932fea27e3
--- /dev/null
+++ b/src/pretix/base/migrations/0055_auto_20170413_1537.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.7 on 2017-04-13 15:37
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pretixbase', '0054_auto_20170413_1050'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='cartposition',
+ name='attendee_email',
+ field=models.EmailField(blank=True, help_text='Empty, if this product is not an admission ticket', max_length=254, null=True, verbose_name='Attendee email'),
+ ),
+ migrations.AddField(
+ model_name='orderposition',
+ name='attendee_email',
+ field=models.EmailField(blank=True, help_text='Empty, if this product is not an admission ticket', max_length=254, null=True, verbose_name='Attendee email'),
+ ),
+ migrations.AlterField(
+ model_name='event_settingsstore',
+ name='key',
+ field=models.CharField(max_length=255),
+ ),
+ migrations.AlterField(
+ model_name='globalsettingsobject_settingsstore',
+ name='key',
+ field=models.CharField(max_length=255),
+ ),
+ migrations.AlterField(
+ model_name='organizer_settingsstore',
+ name='key',
+ field=models.CharField(max_length=255),
+ ),
+ ]
diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py
index fb3dec4fd7..f149001bc8 100644
--- a/src/pretix/base/models/orders.py
+++ b/src/pretix/base/models/orders.py
@@ -394,6 +394,8 @@ class AbstractPosition(models.Model):
:type price: decimal.Decimal
:param attendee_name: The attendee's name, if entered.
:type attendee_name: str
+ :param attendee_email: The attendee's email, if entered.
+ :type attendee_email: str
:param voucher: A voucher that has been applied to this sale
:type voucher: Voucher
"""
@@ -418,6 +420,11 @@ class AbstractPosition(models.Model):
blank=True, null=True,
help_text=_("Empty, if this product is not an admission ticket")
)
+ attendee_email = models.EmailField(
+ verbose_name=_("Attendee email"),
+ blank=True, null=True,
+ help_text=_("Empty, if this product is not an admission ticket")
+ )
voucher = models.ForeignKey(
'Voucher', null=True, blank=True
)
diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py
index 8649d768ac..60f8f24472 100644
--- a/src/pretix/base/settings.py
+++ b/src/pretix/base/settings.py
@@ -27,6 +27,14 @@ DEFAULTS = {
'default': 'False',
'type': bool
},
+ 'attendee_emails_asked': {
+ 'default': 'False',
+ 'type': bool
+ },
+ 'attendee_emails_required': {
+ 'default': 'False',
+ 'type': bool
+ },
'invoice_address_asked': {
'default': 'True',
'type': bool,
diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py
index 40c887ceea..76ef5a06f3 100644
--- a/src/pretix/control/forms/event.py
+++ b/src/pretix/control/forms/event.py
@@ -240,6 +240,21 @@ class EventSettingsForm(SettingsForm):
help_text=_("Require customers to fill in the names of all attendees."),
required=False
)
+ attendee_emails_asked = forms.BooleanField(
+ label=_("Ask for attendee e-mails"),
+ help_text=_("Ask for an e-mail address for all tickets which include admission to the event. Important: For "
+ "every order, an e-mail address needs to be provided, regardless of this setting. The order "
+ "confirmation which can be used to change the order will always only be sent to the e-mail "
+ "address provided for the order. Only check this box if you want to ask for additional e-mail "
+ "addresses for each attendee, e.g. in case of group orders."),
+ required=False
+ )
+ attendee_emails_required = forms.BooleanField(
+ label=_("Require attendee e-mails"),
+ help_text=_("Require customers to fill in the e-mail addresses of all attendees. See the above option for "
+ "more details."),
+ required=False
+ )
max_items_per_order = forms.IntegerField(
min_value=1,
label=_("Maximum number of items per order")
@@ -274,6 +289,11 @@ class EventSettingsForm(SettingsForm):
raise ValidationError({
'attendee_names_required': _('You cannot require specifying attendee names if you do not ask for them.')
})
+ if data['attendee_emails_required'] and not data['attendee_emails_asked']:
+ raise ValidationError({
+ 'attendee_emails_required': _('You cannot require specifying attendee emails if you do not ask for '
+ 'them.')
+ })
return data
diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html
index b48e57d63b..82019bcf63 100644
--- a/src/pretix/control/templates/pretixcontrol/event/settings.html
+++ b/src/pretix/control/templates/pretixcontrol/event/settings.html
@@ -41,6 +41,8 @@
{% bootstrap_field sform.max_items_per_order layout="horizontal" %}
{% bootstrap_field sform.attendee_names_asked layout="horizontal" %}
{% bootstrap_field sform.attendee_names_required layout="horizontal" %}
+ {% bootstrap_field sform.attendee_emails_asked layout="horizontal" %}
+ {% bootstrap_field sform.attendee_emails_required layout="horizontal" %}
{% bootstrap_field sform.cancel_allow_user layout="horizontal" %}