From f0da2b7233f1c6cdf709e90932ac77da44a539ea Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 8 Mar 2021 16:31:34 +0100 Subject: [PATCH] E-mails: add additional information on order positions --- src/pretix/base/email.py | 14 ++ .../base/templates/pretixbase/email/base.html | 25 +++ .../pretixbase/email/order_details.html | 158 ++++++++++++++++++ .../pretixbase/email/plainwrapper.html | 18 +- .../pretixbase/email/simple_logo.html | 43 +++-- src/pretix/control/views/event.py | 6 +- 6 files changed, 227 insertions(+), 37 deletions(-) create mode 100644 src/pretix/base/templates/pretixbase/email/order_details.html diff --git a/src/pretix/base/email.py b/src/pretix/base/email.py index 5b252dc9d2..ee5a19caf0 100644 --- a/src/pretix/base/email.py +++ b/src/pretix/base/email.py @@ -2,10 +2,12 @@ import inspect import logging from datetime import timedelta from decimal import Decimal +from itertools import groupby from smtplib import SMTPResponseException from django.conf import settings from django.core.mail.backends.smtp import EmailBackend +from django.db.models import Count from django.dispatch import receiver from django.template.loader import get_template from django.utils.timezone import now @@ -128,9 +130,21 @@ class TemplateBasedMailRenderer(BaseHTMLMailRenderer): if order: htmlctx['order'] = order + positions = list(order.positions.select_related( + 'item', 'variation', 'subevent', 'addon_to' + ).annotate( + has_addons=Count('addons') + )) + htmlctx['cart'] = [(k, list(v)) for k, v in groupby( + positions, key=lambda op: ( + op.item, op.variation, op.subevent, op.attendee_name, + (op.pk if op.addon_to_id else None), (op.pk if op.has_addons else None) + ) + )] if position: htmlctx['position'] = position + htmlctx['ev'] = position.subevent or self.event tpl = get_template(self.template_name) body_html = inline_css(tpl.render(htmlctx)) diff --git a/src/pretix/base/templates/pretixbase/email/base.html b/src/pretix/base/templates/pretixbase/email/base.html index ff17e64891..4f622691ca 100644 --- a/src/pretix/base/templates/pretixbase/email/base.html +++ b/src/pretix/base/templates/pretixbase/email/base.html @@ -136,6 +136,31 @@ text-decoration: none; color: {{ color }}; } + + .order-button { + padding-top: 5px + } + .order-button a.button { + font-size: 12px; + } + .order-info { + padding-bottom: 5px + } + + .order { + font-size: 12px; + } + + .cart-table > tr > td:first-child { + width: 40px; + } + .order-details > tr > td:first-child { + width: 20%; + } + .order-details td { + font-size: 12px; + } + {% if rtl %} body { direction: rtl; diff --git a/src/pretix/base/templates/pretixbase/email/order_details.html b/src/pretix/base/templates/pretixbase/email/order_details.html new file mode 100644 index 0000000000..1f672e7819 --- /dev/null +++ b/src/pretix/base/templates/pretixbase/email/order_details.html @@ -0,0 +1,158 @@ +{% load eventurl %} +{% load i18n %} + +{% if position %} +
+ {% trans "You are receiving this email because someone signed you up for the following event:" %} +
+ + + + + + + + + + + + + + + + + +
+ {% trans "Event:" %} + + {{ event.name }} +
+ {% if event.has_subevents and ev.name|upper != event.name|upper %}{{ ev.name }}
{% endif %} + {{ ev.get_date_range_display }} + {% if event.settings.show_times %} + {{ ev.date_from|date:"TIME_FORMAT" }} + {% endif %} +
+ {% trans "Order code:" %} + + {{ order.code }} ({{ order.datetime|date:"SHORT_DATE_FORMAT" }})
+ {% if order.email %} + {% trans "created by" %} {{ order.email }} + {% endif %} +
+ {% trans "Order status:" %} + + {% include "pretixpresale/event/fragment_order_status.html" with order=order %} +
+ {% trans "Organizer:" %} + + {{ event.organizer }} + {% if event.settings.contact_mail %} +
+ + {{ event.settings.contact_mail }} + + {% endif %} +
+
+ + {% trans "View registration details" %} + +
+{% else %} +
+ {% trans "You are receiving this email because you placed an order for the following event:" %} +
+ + + + + + + + + + + + + + {% if cart %} + + + + + {% endif %} + + + + +
+ {% trans "Event:" %} + + {{ event.name }} + {% if not event.has_subevents and event.settings.show_dates_on_frontpage %} +
+ {{ event.get_date_range_display }} + {% if event.settings.show_times %} + {{ event.date_from|date:"TIME_FORMAT" }} + {% endif %} + {% endif %} +
+ {% trans "Order code:" %} + + {{ order.code }} ({{ order.datetime|date:"SHORT_DATE_FORMAT" }}) +
+ {% trans "Order status:" %} + + {% include "pretixpresale/event/fragment_order_status.html" with order=order %} +
+ {% trans "Details:" %} + + + {% for groupkey, positions in cart %} + + + + + {% endfor %} +
+ {% if not groupkey.4 %} {# is addon #} + {{ positions|length }}x + {% endif %} + + {% if groupkey.4 %} {# is addon #} + + + {% endif %} + {{ groupkey.0.name }}{% if groupkey.1 %} – {{ groupkey.1.value }}{% endif %} + {% if groupkey.2 %} {# subevent #} +
+ {% if groupkey.2.name|upper != event.name|upper %} + {{ groupkey.2.name }} · + {% endif %} + {{ groupkey.2.get_date_range_display }} + {% if event.settings.show_times %} + {{ groupkey.2.date_from|date:"TIME_FORMAT" }} + {% endif %} + {% endif %} + {% if groupkey.3 %} {# attendee name #} +
+ {{ groupkey.3.name }} + {% endif %} +
+
+ {% trans "Organizer:" %} + + {{ event.organizer }} + {% if event.settings.contact_mail %} +
+ + {{ event.settings.contact_mail }} + + {% endif %} +
+
+ + {% trans "View order details" %} + +
+{% endif %} diff --git a/src/pretix/base/templates/pretixbase/email/plainwrapper.html b/src/pretix/base/templates/pretixbase/email/plainwrapper.html index 95a6333644..f7e1b0d876 100644 --- a/src/pretix/base/templates/pretixbase/email/plainwrapper.html +++ b/src/pretix/base/templates/pretixbase/email/plainwrapper.html @@ -23,23 +23,7 @@
- {% if position %} - {% trans "You are receiving this email because someone signed you up for the following event:" %}
- {% trans "Event:" %} {{ event.name }}
- {% trans "Order code:" %} {{ order.code }}
- {% trans "Order date:" %} {{ order.datetime|date:"SHORT_DATE_FORMAT" }}
- - {% trans "View registration details" %} - - {% else %} - {% trans "You are receiving this email because you placed an order for the following event:" %}
- {% trans "Event:" %} {{ event.name }}
- {% trans "Order code:" %} {{ order.code }}
- {% trans "Order date:" %} {{ order.datetime|date:"SHORT_DATE_FORMAT" }}
- - {% trans "View order details" %} - - {% endif %} + {% include "pretixbase/email/order_details.html" %}
- {% if position %} - {% trans "You are receiving this email because someone signed you up for the following event:" %}
- {% trans "Event:" %} {{ event.name }}
- {% trans "Order code:" %} {{ order.code }}
- {% trans "Order date:" %} {{ order.datetime|date:"SHORT_DATE_FORMAT" }}
- - {% trans "View registration details" %} - - {% else %} - {% trans "You are receiving this email because you placed an order for the following event:" %}
- {% trans "Event:" %} {{ event.name }}
- {% trans "Order code:" %} {{ order.code }}
- {% trans "Order date:" %} {{ order.datetime|date:"SHORT_DATE_FORMAT" }}
- - {% trans "View order details" %} - - {% endif %} + {% include "pretixbase/email/order_details.html" %}