diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py
index 191f07dcf2..68f4ec80ec 100644
--- a/src/pretix/base/pdf.py
+++ b/src/pretix/base/pdf.py
@@ -285,7 +285,7 @@ DEFAULT_VARIABLES = OrderedDict((
("telephone", {
"label": _("Phone number"),
"editor_sample": "+01 1234 567890",
- "evaluate": lambda op, order, ev: phone_format(order.phone)
+ "evaluate": lambda op, order, ev: phone_format(order.phone, html=False)
}),
("email", {
"label": _("Email"),
diff --git a/src/pretix/base/templatetags/phone_format.py b/src/pretix/base/templatetags/phone_format.py
index 0a4b0180c2..c38ff75613 100644
--- a/src/pretix/base/templatetags/phone_format.py
+++ b/src/pretix/base/templatetags/phone_format.py
@@ -20,6 +20,8 @@
# .
#
from django import template
+from django.utils.html import escape
+from django.utils.safestring import mark_safe
from phonenumber_field.phonenumber import PhoneNumber
from phonenumbers import NumberParseException
@@ -27,17 +29,20 @@ register = template.Library()
@register.filter("phone_format")
-def phone_format(value: str):
+def phone_format(value: str, html=True):
if not value:
- return ""
-
- if isinstance(value, str):
+ v = ""
+ elif isinstance(value, str):
try:
- return PhoneNumber.from_string(value).as_international
+ v = PhoneNumber.from_string(value).as_international
except NumberParseException:
- return value
+ v = value
+ elif isinstance(value, PhoneNumber) and value.national_number:
+ v = value.as_international
+ else:
+ v = str(value)
- if isinstance(value, PhoneNumber) and value.national_number:
- return value.as_international
+ if html:
+ v = mark_safe('' + escape(v) + '')
- return str(value)
+ return v
diff --git a/src/pretix/presale/checkoutflow.py b/src/pretix/presale/checkoutflow.py
index bc4008776b..a9cc5bd498 100644
--- a/src/pretix/presale/checkoutflow.py
+++ b/src/pretix/presale/checkoutflow.py
@@ -60,6 +60,7 @@ from pretix.base.services.cart import (
from pretix.base.services.memberships import validate_memberships_in_order
from pretix.base.services.orders import perform_order
from pretix.base.signals import validate_cart_addons
+from pretix.base.templatetags.phone_format import phone_format
from pretix.base.templatetags.rich_text import rich_text_snippet
from pretix.base.views.tasks import AsyncAction
from pretix.multidomain.urlreverse import eventreverse
@@ -1088,7 +1089,7 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep):
ctx['contact_info'] = []
phone = self.cart_session.get('contact_form_data', {}).get('phone')
if phone:
- ctx['contact_info'].append((_('Phone number'), phone))
+ ctx['contact_info'].append((_('Phone number'), phone_format(phone)))
responses = contact_form_fields.send(self.event, request=self.request)
for r, response in sorted(responses, key=lambda r: str(r[0])):
for key, value in response.items():
diff --git a/src/pretix/static/pretixbase/scss/_rtl.scss b/src/pretix/static/pretixbase/scss/_rtl.scss
index c20634a1ff..75b4c66c23 100644
--- a/src/pretix/static/pretixbase/scss/_rtl.scss
+++ b/src/pretix/static/pretixbase/scss/_rtl.scss
@@ -20,6 +20,11 @@ html.rtl {
}
}
+.force-ltr {
+ direction: ltr !important;
+ unicode-bidi: embed;
+}
+
@media(min-width: $screen-sm-min) {
html.rtl .nameparts-form-group {
input, select {