diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index 2e9cb1a4d1..ed7cc2f340 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -589,6 +589,7 @@ class EventSettingsSerializer(serializers.Serializer): 'ticket_download_addons', 'ticket_download_nonadm', 'ticket_download_pending', + 'ticket_download_require_validated_email', 'mail_prefix', 'mail_from', 'mail_from_name', diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index f892307aff..f02bff993e 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -2067,7 +2067,7 @@ class OrderPosition(AbstractPosition): user: User=None, headers: dict=None, sender: str=None, invoices: list=None, auth=None, attach_tickets=False): """ - Sends an email to the user that placed this order. Basically, this method does two things: + Sends an email to the attendee. Basically, this method does two things: * Call ``pretix.base.services.mail.mail`` with useful values for the ``event``, ``locale``, ``recipient`` and ``order`` parameters. diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index c96177b93c..fbbdb647fc 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -971,6 +971,19 @@ DEFAULTS = { 'data-checkbox-dependency-visual': 'on'}), ) }, + 'ticket_download_require_validated_email': { + 'default': 'False', + 'type': bool, + 'serializer_class': serializers.BooleanField, + 'form_class': forms.BooleanField, + 'form_kwargs': dict( + label=_("Do not issue ticket before email address is validated"), + help_text=_("If turned on, tickets will not be offered for download directly after purchase. They will " + "be attached to the payment confirmation email (if the file size is not too large), and the " + "customer will be able to download them from the page as soon as they clicked a link in " + "the email. Does not affect orders performed through other sales channels."), + ) + }, 'event_list_availability': { 'default': 'True', 'type': bool diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 1dba08019a..6fece0375a 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -1067,6 +1067,7 @@ class TicketSettingsForm(SettingsForm): 'ticket_download_addons', 'ticket_download_nonadm', 'ticket_download_pending', + 'ticket_download_require_validated_email', ] def prepare_fields(self): diff --git a/src/pretix/control/templates/pretixcontrol/event/tickets.html b/src/pretix/control/templates/pretixcontrol/event/tickets.html index 158d706a0e..9734b4c14a 100644 --- a/src/pretix/control/templates/pretixcontrol/event/tickets.html +++ b/src/pretix/control/templates/pretixcontrol/event/tickets.html @@ -22,6 +22,7 @@ {% bootstrap_field form.ticket_download_addons layout="control" horizontal_label_class='sr-only' horizontal_field_class='col-md-12' %} {% bootstrap_field form.ticket_download_nonadm layout="control" horizontal_label_class='sr-only' horizontal_field_class='col-md-12' %} {% bootstrap_field form.ticket_download_pending layout="control" horizontal_label_class='sr-only' horizontal_field_class='col-md-12' %} + {% bootstrap_field form.ticket_download_require_validated_email layout="control" horizontal_label_class='sr-only' horizontal_field_class='col-md-12' %}
{% trans "Download formats" %} diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_downloads.html b/src/pretix/presale/templates/pretixpresale/event/fragment_downloads.html index a35f4555ae..641417ab69 100644 --- a/src/pretix/presale/templates/pretixpresale/event/fragment_downloads.html +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_downloads.html @@ -1,6 +1,33 @@ {% load i18n %} {% load eventurl %} -{% if can_download and download_buttons and order.count_positions %} +{% if download_email_required %} +
+
+

+ {% trans "Ticket download" %} +

+
+
+

+

+ {% trans "Please check your email account, we've sent you your tickets." %} +

+

+ {% if scope == "position" %} + {% blocktrans trimmed %} + You can also download them right here as soon as the person who placed the order clicked the + link in the email they received to confirm the email address is valid. + {% endblocktrans %} + {% else %} + {% blocktrans trimmed %} + If the email has no attachment, click the link in our email and you will be able to download + them from here. + {% endblocktrans %} + {% endif %} +

+
+
+{% elif can_download and download_buttons and order.count_positions %}
{% if cart.positions|length > 1 and can_download_multi %} {% blocktrans trimmed %} @@ -14,7 +41,7 @@ {% for b in download_buttons %} {% if b.multi %}
+ method="post" data-asynctask data-asynctask-download class="download-btn-form"> {% csrf_token %}
-{% elif not download_buttons and ticket_download_date %} + {% elif not download_buttons and ticket_download_date %} {% if order.status == 'p' %}
{% blocktrans trimmed with date=ticket_download_date|date:"SHORT_DATE_FORMAT" %} diff --git a/src/pretix/presale/templates/pretixpresale/event/order.html b/src/pretix/presale/templates/pretixpresale/event/order.html index 2a62c3d90e..2e044801be 100644 --- a/src/pretix/presale/templates/pretixpresale/event/order.html +++ b/src/pretix/presale/templates/pretixpresale/event/order.html @@ -163,7 +163,7 @@
{% endif %} {% endif %} - {% include "pretixpresale/event/fragment_downloads.html" %} + {% include "pretixpresale/event/fragment_downloads.html" with scope="order" %}
{% if order.can_modify_answers %} diff --git a/src/pretix/presale/templates/pretixpresale/event/position.html b/src/pretix/presale/templates/pretixpresale/event/position.html index 247379d789..2a3fb95494 100644 --- a/src/pretix/presale/templates/pretixpresale/event/position.html +++ b/src/pretix/presale/templates/pretixpresale/event/position.html @@ -22,7 +22,7 @@
{% eventsignal event "pretix.presale.signals.position_info_top" order=order position=position request=request %} - {% include "pretixpresale/event/fragment_downloads.html" %} + {% include "pretixpresale/event/fragment_downloads.html" with scope="position" %}

diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 5f0f5be272..3c7a6b751a 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -134,10 +134,17 @@ class TicketPageMixin: can_download = all([r for rr, r in allow_ticket_download.send(self.request.event, order=self.order)]) if self.request.event.settings.ticket_download_date: ctx['ticket_download_date'] = self.order.ticket_download_date - ctx['can_download'] = ( + can_download = ( can_download and self.order.ticket_download_available and list(self.order.positions_with_tickets) ) + ctx['download_email_required'] = can_download and ( + self.request.event.settings.ticket_download_require_validated_email and + self.order.sales_channel == 'web' and + not self.order.email_known_to_work + ) + ctx['can_download'] = can_download and not ctx['download_email_required'] + ctx['download_buttons'] = self.download_buttons ctx['backend_user'] = ( @@ -874,6 +881,13 @@ class OrderDownloadMixin: if 'position' in kwargs and not self.order_position.generate_ticket: return self.error(OrderError(_('Ticket download is not enabled for this product.'))) + if ( + self.request.event.settings.ticket_download_require_validated_email and + self.order.sales_channel == 'web' and + not self.order.email_known_to_work + ): + return self.error(OrderError(_('Please click the link we sent you via email to download your tickets.'))) + ct = self.get_last_ct() if ct: return self.success(ct)