forked from CGM_Public/pretix_original
Email preview: Include prefix in subject (#4395)
This commit is contained in:
@@ -58,6 +58,7 @@ from django.core.mail import (
|
|||||||
from django.core.mail.message import SafeMIMEText
|
from django.core.mail.message import SafeMIMEText
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.template.loader import get_template
|
from django.template.loader import get_template
|
||||||
|
from django.utils.html import escape
|
||||||
from django.utils.timezone import now, override
|
from django.utils.timezone import now, override
|
||||||
from django.utils.translation import gettext as _, pgettext
|
from django.utils.translation import gettext as _, pgettext
|
||||||
from django_scopes import scope, scopes_disabled
|
from django_scopes import scope, scopes_disabled
|
||||||
@@ -109,6 +110,22 @@ def clean_sender_name(sender_name: str) -> str:
|
|||||||
return sender_name
|
return sender_name
|
||||||
|
|
||||||
|
|
||||||
|
def prefix_subject(settings_holder, subject, highlight=False):
|
||||||
|
prefix = settings_holder.settings.get('mail_prefix')
|
||||||
|
if prefix and prefix.startswith('[') and prefix.endswith(']'):
|
||||||
|
prefix = prefix[1:-1]
|
||||||
|
if prefix:
|
||||||
|
prefix = f"[{prefix}]"
|
||||||
|
if highlight:
|
||||||
|
prefix = '<span class="placeholder" title="{}">{}</span>'.format(
|
||||||
|
_('This prefix has been set in your event or organizer settings.'),
|
||||||
|
escape(prefix)
|
||||||
|
)
|
||||||
|
|
||||||
|
subject = f"{prefix} {subject}"
|
||||||
|
return subject
|
||||||
|
|
||||||
|
|
||||||
def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, LazyI18nString],
|
def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, LazyI18nString],
|
||||||
context: Dict[str, Any] = None, event: Event = None, locale: str = None, order: Order = None,
|
context: Dict[str, Any] = None, event: Event = None, locale: str = None, order: Order = None,
|
||||||
position: OrderPosition = None, *, headers: dict = None, sender: str = None, organizer: Organizer = None,
|
position: OrderPosition = None, *, headers: dict = None, sender: str = None, organizer: Organizer = None,
|
||||||
@@ -240,11 +257,7 @@ def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, La
|
|||||||
and settings_holder.settings.contact_mail and not headers.get('Reply-To'):
|
and settings_holder.settings.contact_mail and not headers.get('Reply-To'):
|
||||||
headers['Reply-To'] = settings_holder.settings.contact_mail
|
headers['Reply-To'] = settings_holder.settings.contact_mail
|
||||||
|
|
||||||
prefix = settings_holder.settings.get('mail_prefix')
|
subject = prefix_subject(settings_holder, subject)
|
||||||
if prefix and prefix.startswith('[') and prefix.endswith(']'):
|
|
||||||
prefix = prefix[1:-1]
|
|
||||||
if prefix:
|
|
||||||
subject = "[%s] %s" % (prefix, subject)
|
|
||||||
|
|
||||||
body_plain += "\r\n\r\n-- \r\n"
|
body_plain += "\r\n\r\n-- \r\n"
|
||||||
|
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ from ...base.i18n import language
|
|||||||
from ...base.models.items import (
|
from ...base.models.items import (
|
||||||
Item, ItemCategory, ItemMetaProperty, Question, Quota,
|
Item, ItemCategory, ItemMetaProperty, Question, Quota,
|
||||||
)
|
)
|
||||||
|
from ...base.services.mail import prefix_subject
|
||||||
from ...base.settings import LazyI18nStringList
|
from ...base.settings import LazyI18nStringList
|
||||||
from ...helpers.compat import CompatDeleteView
|
from ...helpers.compat import CompatDeleteView
|
||||||
from ...helpers.format import format_map
|
from ...helpers.format import format_map
|
||||||
@@ -746,9 +747,9 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View):
|
|||||||
with language(self.supported_locale[idx], self.request.event.settings.region):
|
with language(self.supported_locale[idx], self.request.event.settings.region):
|
||||||
try:
|
try:
|
||||||
if k.startswith('mail_subject_'):
|
if k.startswith('mail_subject_'):
|
||||||
msgs[self.supported_locale[idx]] = format_map(
|
msgs[self.supported_locale[idx]] = prefix_subject(self.request.event, format_map(
|
||||||
bleach.clean(v), self.placeholders(preview_item), raise_on_missing=True
|
bleach.clean(v), self.placeholders(preview_item), raise_on_missing=True
|
||||||
)
|
), highlight=True)
|
||||||
else:
|
else:
|
||||||
msgs[self.supported_locale[idx]] = markdown_compile_email(
|
msgs[self.supported_locale[idx]] = markdown_compile_email(
|
||||||
format_map(v, self.placeholders(preview_item), raise_on_missing=True)
|
format_map(v, self.placeholders(preview_item), raise_on_missing=True)
|
||||||
|
|||||||
@@ -62,8 +62,9 @@ from django.urls import reverse
|
|||||||
from django.utils import formats
|
from django.utils import formats
|
||||||
from django.utils.formats import date_format, get_format
|
from django.utils.formats import date_format, get_format
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.html import conditional_escape
|
from django.utils.html import conditional_escape, escape
|
||||||
from django.utils.http import url_has_allowed_host_and_scheme
|
from django.utils.http import url_has_allowed_host_and_scheme
|
||||||
|
from django.utils.safestring import mark_safe
|
||||||
from django.utils.timezone import make_aware, now
|
from django.utils.timezone import make_aware, now
|
||||||
from django.utils.translation import gettext, gettext_lazy as _, ngettext
|
from django.utils.translation import gettext, gettext_lazy as _, ngettext
|
||||||
from django.views.generic import (
|
from django.views.generic import (
|
||||||
@@ -94,7 +95,9 @@ from pretix.base.services.invoices import (
|
|||||||
invoice_qualified, regenerate_invoice,
|
invoice_qualified, regenerate_invoice,
|
||||||
)
|
)
|
||||||
from pretix.base.services.locking import LockTimeoutException
|
from pretix.base.services.locking import LockTimeoutException
|
||||||
from pretix.base.services.mail import SendMailException, render_mail
|
from pretix.base.services.mail import (
|
||||||
|
SendMailException, prefix_subject, render_mail,
|
||||||
|
)
|
||||||
from pretix.base.services.orders import (
|
from pretix.base.services.orders import (
|
||||||
OrderChangeManager, OrderError, approve_order, cancel_order, deny_order,
|
OrderChangeManager, OrderError, approve_order, cancel_order, deny_order,
|
||||||
extend_order, mark_order_expired, mark_order_refunded,
|
extend_order, mark_order_expired, mark_order_refunded,
|
||||||
@@ -2304,7 +2307,9 @@ class OrderSendMail(EventPermissionRequiredMixin, OrderViewMixin, FormView):
|
|||||||
email_content = render_mail(email_template, email_context)
|
email_content = render_mail(email_template, email_context)
|
||||||
if self.request.POST.get('action') == 'preview':
|
if self.request.POST.get('action') == 'preview':
|
||||||
self.preview_output = {
|
self.preview_output = {
|
||||||
'subject': _('Subject: {subject}').format(subject=email_subject),
|
'subject': mark_safe(_('Subject: {subject}').format(
|
||||||
|
subject=prefix_subject(order.event, escape(email_subject), highlight=True)
|
||||||
|
)),
|
||||||
'html': markdown_compile_email(email_content)
|
'html': markdown_compile_email(email_content)
|
||||||
}
|
}
|
||||||
return self.get(self.request, *self.args, **self.kwargs)
|
return self.get(self.request, *self.args, **self.kwargs)
|
||||||
@@ -2369,7 +2374,9 @@ class OrderPositionSendMail(OrderSendMail):
|
|||||||
email_content = render_mail(email_template, email_context)
|
email_content = render_mail(email_template, email_context)
|
||||||
if self.request.POST.get('action') == 'preview':
|
if self.request.POST.get('action') == 'preview':
|
||||||
self.preview_output = {
|
self.preview_output = {
|
||||||
'subject': _('Subject: {subject}').format(subject=email_subject),
|
'subject': mark_safe(_('Subject: {subject}').format(
|
||||||
|
subject=prefix_subject(position.order.event, escape(email_subject), highlight=True))
|
||||||
|
),
|
||||||
'html': markdown_compile_email(email_content)
|
'html': markdown_compile_email(email_content)
|
||||||
}
|
}
|
||||||
return self.get(self.request, *self.args, **self.kwargs)
|
return self.get(self.request, *self.args, **self.kwargs)
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ from pretix.base.models.orders import CancellationRequest
|
|||||||
from pretix.base.models.organizer import SalesChannel, TeamAPIToken
|
from pretix.base.models.organizer import SalesChannel, TeamAPIToken
|
||||||
from pretix.base.payment import PaymentException
|
from pretix.base.payment import PaymentException
|
||||||
from pretix.base.services.export import multiexport, scheduled_organizer_export
|
from pretix.base.services.export import multiexport, scheduled_organizer_export
|
||||||
from pretix.base.services.mail import SendMailException, mail
|
from pretix.base.services.mail import SendMailException, mail, prefix_subject
|
||||||
from pretix.base.signals import register_multievent_data_exporters
|
from pretix.base.signals import register_multievent_data_exporters
|
||||||
from pretix.base.templatetags.rich_text import markdown_compile_email
|
from pretix.base.templatetags.rich_text import markdown_compile_email
|
||||||
from pretix.base.views.tasks import AsyncAction
|
from pretix.base.views.tasks import AsyncAction
|
||||||
@@ -351,8 +351,11 @@ class MailSettingsPreview(OrganizerPermissionRequiredMixin, View):
|
|||||||
if idx in self.supported_locale:
|
if idx in self.supported_locale:
|
||||||
with language(self.supported_locale[idx], self.request.organizer.settings.region):
|
with language(self.supported_locale[idx], self.request.organizer.settings.region):
|
||||||
if k.startswith('mail_subject_'):
|
if k.startswith('mail_subject_'):
|
||||||
msgs[self.supported_locale[idx]] = format_map(bleach.clean(v),
|
msgs[self.supported_locale[idx]] = prefix_subject(
|
||||||
self.placeholders(preview_item))
|
self.request.organizer,
|
||||||
|
format_map(bleach.clean(v), self.placeholders(preview_item)),
|
||||||
|
highlight=True,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
msgs[self.supported_locale[idx]] = markdown_compile_email(
|
msgs[self.supported_locale[idx]] = markdown_compile_email(
|
||||||
format_map(v, self.placeholders(preview_item))
|
format_map(v, self.placeholders(preview_item))
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ from pretix.base.models import (
|
|||||||
CartPosition, LogEntry, Voucher, WaitingListEntry,
|
CartPosition, LogEntry, Voucher, WaitingListEntry,
|
||||||
)
|
)
|
||||||
from pretix.base.models.vouchers import generate_codes
|
from pretix.base.models.vouchers import generate_codes
|
||||||
|
from pretix.base.services.mail import prefix_subject
|
||||||
from pretix.base.services.vouchers import vouchers_send
|
from pretix.base.services.vouchers import vouchers_send
|
||||||
from pretix.base.templatetags.rich_text import markdown_compile_email
|
from pretix.base.templatetags.rich_text import markdown_compile_email
|
||||||
from pretix.base.views.tasks import AsyncFormView
|
from pretix.base.views.tasks import AsyncFormView
|
||||||
@@ -572,7 +573,11 @@ class VoucherBulkMailPreview(EventPermissionRequiredMixin, View):
|
|||||||
return HttpResponseBadRequest(_('invalid item'))
|
return HttpResponseBadRequest(_('invalid item'))
|
||||||
msgs = {}
|
msgs = {}
|
||||||
if "subject" in preview_item:
|
if "subject" in preview_item:
|
||||||
msgs["all"] = format_map(bleach.clean(request.POST.get(preview_item, "")), self.placeholders(preview_item))
|
msgs["all"] = prefix_subject(
|
||||||
|
self.request.event,
|
||||||
|
format_map(bleach.clean(request.POST.get(preview_item, "")), self.placeholders(preview_item)),
|
||||||
|
highlight=True
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
msgs["all"] = markdown_compile_email(
|
msgs["all"] = markdown_compile_email(
|
||||||
format_map(request.POST.get(preview_item), self.placeholders(preview_item))
|
format_map(request.POST.get(preview_item), self.placeholders(preview_item))
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ from pretix.plugins.sendmail.tasks import (
|
|||||||
send_mails_to_orders, send_mails_to_waitinglist,
|
send_mails_to_orders, send_mails_to_waitinglist,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from ...base.services.mail import prefix_subject
|
||||||
from ...helpers.format import format_map
|
from ...helpers.format import format_map
|
||||||
from ...helpers.models import modelcopy
|
from ...helpers.models import modelcopy
|
||||||
from . import forms
|
from . import forms
|
||||||
@@ -197,7 +198,7 @@ class BaseSenderView(EventPermissionRequiredMixin, FormView):
|
|||||||
)
|
)
|
||||||
|
|
||||||
subject = bleach.clean(form.cleaned_data['subject'].localize(l), tags=[])
|
subject = bleach.clean(form.cleaned_data['subject'].localize(l), tags=[])
|
||||||
preview_subject = format_map(subject, context_dict)
|
preview_subject = prefix_subject(self.request.event, format_map(subject, context_dict), highlight=True)
|
||||||
message = form.cleaned_data['message'].localize(l)
|
message = form.cleaned_data['message'].localize(l)
|
||||||
preview_text = markdown_compile_email(format_map(message, context_dict))
|
preview_text = markdown_compile_email(format_map(message, context_dict))
|
||||||
|
|
||||||
@@ -612,7 +613,7 @@ class CreateRule(EventPermissionRequiredMixin, CreateView):
|
|||||||
)
|
)
|
||||||
|
|
||||||
subject = bleach.clean(form.cleaned_data['subject'].localize(l), tags=[])
|
subject = bleach.clean(form.cleaned_data['subject'].localize(l), tags=[])
|
||||||
preview_subject = format_map(subject, context_dict)
|
preview_subject = prefix_subject(self.request.event, format_map(subject, context_dict), highlight=True)
|
||||||
template = form.cleaned_data['template'].localize(l)
|
template = form.cleaned_data['template'].localize(l)
|
||||||
preview_text = markdown_compile_email(format_map(template, context_dict))
|
preview_text = markdown_compile_email(format_map(template, context_dict))
|
||||||
|
|
||||||
@@ -688,7 +689,7 @@ class UpdateRule(EventPermissionRequiredMixin, UpdateView):
|
|||||||
)
|
)
|
||||||
|
|
||||||
subject = bleach.clean(self.object.subject.localize(lang), tags=[])
|
subject = bleach.clean(self.object.subject.localize(lang), tags=[])
|
||||||
preview_subject = format_map(subject, placeholders)
|
preview_subject = prefix_subject(self.request.event, format_map(subject, placeholders), highlight=True)
|
||||||
template = self.object.template.localize(lang)
|
template = self.object.template.localize(lang)
|
||||||
preview_text = markdown_compile_email(format_map(template, placeholders))
|
preview_text = markdown_compile_email(format_map(template, placeholders))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user