diff --git a/src/pretix/helpers/daterange.py b/src/pretix/helpers/daterange.py
index 3003f3a4b4..edd9d7ab31 100644
--- a/src/pretix/helpers/daterange.py
+++ b/src/pretix/helpers/daterange.py
@@ -33,7 +33,10 @@
# License for the specific language governing permissions and limitations under the License.
from django.utils.html import format_html
-from django.utils.translation import get_language, gettext_lazy as _
+from django.utils.safestring import mark_safe
+from django.utils.translation import (
+ get_language, gettext_lazy as _, pgettext_lazy,
+)
from pretix.helpers.templatetags.date_fast import date_fast as _date
@@ -48,23 +51,28 @@ def daterange(df, dt, as_html=False):
else:
if as_html:
base_format = format_html("{{}}", _date(df, "Y-m-d"), _date(dt, "Y-m-d"))
+ until = format_html(
+ " – {until} ",
+ until=pgettext_lazy("timerange", "until")
+ )
else:
base_format = "{}{}{}"
+ until = " – "
if lng.startswith("de"):
if df.year == dt.year and df.month == dt.month and df.day == dt.day:
return format_html(base_format, _date(df, "D, j. F Y"))
elif df.year == dt.year and df.month == dt.month:
- return format_html(base_format, _date(df, "j."), "–", _date(dt, "j. F Y"))
+ return format_html(base_format, _date(df, "j."), mark_safe(until.strip()), _date(dt, "j. F Y"))
elif df.year == dt.year:
- return format_html(base_format, _date(df, "j. F"), " – ", _date(dt, "j. F Y"))
+ return format_html(base_format, _date(df, "j. F"), until, _date(dt, "j. F Y"))
elif lng.startswith("en"):
if df.year == dt.year and df.month == dt.month and df.day == dt.day:
return format_html(base_format, _date(df, "D, N jS, Y"))
elif df.year == dt.year and df.month == dt.month:
- return format_html(base_format, _date(df, "N jS"), " – ", _date(dt, "jS, Y"))
+ return format_html(base_format, _date(df, "N jS"), until, _date(dt, "jS, Y"))
elif df.year == dt.year:
- return format_html(base_format, _date(df, "N jS"), " – ", _date(dt, "N jS, Y"))
+ return format_html(base_format, _date(df, "N jS"), until, _date(dt, "N jS, Y"))
elif lng.startswith("es"):
if df.year == dt.year and df.month == dt.month and df.day == dt.day:
return format_html(base_format, _date(df, "DATE_FORMAT"))
@@ -72,14 +80,14 @@ def daterange(df, dt, as_html=False):
return format_html(
base_format,
_date(df, "j"),
- " - ",
+ until,
"{} de {} de {}".format(_date(dt, "j"), _date(dt, "F"), _date(dt, "Y"))
)
elif df.year == dt.year:
return format_html(
base_format,
"{} de {}".format(_date(df, "j"), _date(df, "F")),
- " - ",
+ until,
"{} de {} de {}".format(_date(dt, "j"), _date(dt, "F"), _date(dt, "Y"))
)
@@ -89,24 +97,31 @@ def daterange(df, dt, as_html=False):
if as_html:
base_format = ""
return format_html(
- "{date_from} – {date_to}",
+ "{date_from}{until}{date_to}",
date_from=format_html(base_format, _date(df, "Y-m-d"), _date(df, "DATE_FORMAT")),
date_to=format_html(base_format, _date(dt, "Y-m-d"), _date(dt, "DATE_FORMAT")),
+ until=until,
)
- return _("{date_from} – {date_to}").format(
+ return _("{date_from}{until}{date_to}").format(
date_from=_date(df, "DATE_FORMAT"),
date_to=_date(dt, "DATE_FORMAT"),
+ until=until,
)
def datetimerange(df, dt, as_html=False):
if as_html:
base_format = format_html("{{}}", _date(df, "Y-m-d H:i"), _date(dt, "Y-m-d H:i"))
+ until = format_html(
+ " – {until} ",
+ until=pgettext_lazy("timerange", "until")
+ )
else:
base_format = "{}{}{}"
+ until = " – "
if df.year == dt.year and df.month == dt.month and df.day == dt.day:
- return format_html(base_format, _date(df, "SHORT_DATE_FORMAT") + " " + _date(df, "TIME_FORMAT"), " – ", _date(dt, "TIME_FORMAT"))
+ return format_html(base_format, _date(df, "SHORT_DATE_FORMAT") + " " + _date(df, "TIME_FORMAT"), until, _date(dt, "TIME_FORMAT"))
else:
- return format_html(base_format, _date(df, "SHORT_DATETIME_FORMAT"), " – ", _date(dt, "SHORT_DATETIME_FORMAT"))
+ return format_html(base_format, _date(df, "SHORT_DATETIME_FORMAT"), until, _date(dt, "SHORT_DATETIME_FORMAT"))
diff --git a/src/pretix/presale/templates/pretixpresale/organizers/index.html b/src/pretix/presale/templates/pretixpresale/organizers/index.html
index 4a7bb82242..4deb234f5f 100644
--- a/src/pretix/presale/templates/pretixpresale/organizers/index.html
+++ b/src/pretix/presale/templates/pretixpresale/organizers/index.html
@@ -1,5 +1,6 @@
{% extends "pretixpresale/organizers/base.html" %}
{% load i18n %}
+{% load date_fast %}
{% load icon %}
{% load rich_text %}
{% load tz %}
@@ -68,9 +69,10 @@
{% icon "clock-o" %}
- {{ e.date_from|date:"TIME_FORMAT" }}
+
{% if e.settings.show_date_to and e.date_to and e.date_to.date == e.date_from.date %}
- – {{ e.date_to|date:"TIME_FORMAT" }}
+ –{% trans "until" context "timerange" %}
+
{% endif %}
{% endtimezone %}
diff --git a/src/pretix/presale/views/organizer.py b/src/pretix/presale/views/organizer.py
index 89a1a2070f..b0098ee6b5 100644
--- a/src/pretix/presale/views/organizer.py
+++ b/src/pretix/presale/views/organizer.py
@@ -479,7 +479,8 @@ class OrganizerIndex(OrganizerViewMixin, EventListMixin, ListView):
if event.has_subevents:
event.daterange = daterange(
event.min_from.astimezone(event.tzname),
- (event.max_fromto or event.max_to or event.max_from).astimezone(event.tzname)
+ (event.max_fromto or event.max_to or event.max_from).astimezone(event.tzname),
+ as_html=True,
)
query_data = self.request.GET.copy()
diff --git a/src/tests/base/test_models.py b/src/tests/base/test_models.py
index b68d5b977f..a98eca66d7 100644
--- a/src/tests/base/test_models.py
+++ b/src/tests/base/test_models.py
@@ -2476,18 +2476,26 @@ class EventTest(TestCase):
datetime.datetime(2025, 3, 9, 21, 0, 0, tzinfo=tz),
datetime.datetime(2025, 3, 10, 3, 0, 0, tzinfo=tz),
'March 9th – 10th, 2025',
- ' – ',
+ ' '
+ '– until '
+ '',
'March 9th – 10th, 2025 20:00–02:00',
- ' – '
+ ' '
+ '– until '
+ ' '
''
),
(
datetime.datetime(2025, 3, 9, 21, 0, 0, tzinfo=tz),
datetime.datetime(2025, 3, 12, 14, 0, 0, tzinfo=tz),
'March 9th – 12th, 2025',
- ' – ',
+ ' '
+ '– until '
+ '',
'March 9th – 12th, 2025',
- ' – ',
+ ' '
+ '– until '
+ '',
),
(
datetime.datetime(2025, 3, 9, 21, 0, 0, tzinfo=tz),
diff --git a/src/tests/helpers/test_daterange.py b/src/tests/helpers/test_daterange.py
index 9fc4934505..8acd607166 100644
--- a/src/tests/helpers/test_daterange.py
+++ b/src/tests/helpers/test_daterange.py
@@ -73,7 +73,9 @@ def test_same_month_german():
df = date(2003, 2, 1)
dt = date(2003, 2, 3)
assert daterange(df, dt) == "1.–3. Februar 2003"
- assert daterange(df, dt, as_html=True) == '–'
+ assert daterange(df, dt, as_html=True) == '' \
+ '– bis ' \
+ ''
def test_same_month_english():
@@ -81,15 +83,19 @@ def test_same_month_english():
df = date(2003, 2, 1)
dt = date(2003, 2, 3)
assert daterange(df, dt) == "Feb. 1st – 3rd, 2003"
- assert daterange(df, dt, as_html=True) == ' – '
+ assert daterange(df, dt, as_html=True) == ' ' \
+ '– until ' \
+ ''
def test_same_month_spanish():
with translation.override('es'):
df = date(2003, 2, 1)
dt = date(2003, 2, 3)
- assert daterange(df, dt) == "1 - 3 de febrero de 2003"
- assert daterange(df, dt, as_html=True) == ' - '
+ assert daterange(df, dt) == "1 – 3 de febrero de 2003"
+ assert daterange(df, dt, as_html=True) == ' ' \
+ '– hasta ' \
+ ''
def test_same_year_german():
@@ -97,7 +103,9 @@ def test_same_year_german():
df = date(2003, 2, 1)
dt = date(2003, 4, 3)
assert daterange(df, dt) == "1. Februar – 3. April 2003"
- assert daterange(df, dt, as_html=True) == ' – '
+ assert daterange(df, dt, as_html=True) == ' ' \
+ '– bis ' \
+ ''
def test_same_year_english():
@@ -105,15 +113,19 @@ def test_same_year_english():
df = date(2003, 2, 1)
dt = date(2003, 4, 3)
assert daterange(df, dt) == "Feb. 1st – April 3rd, 2003"
- assert daterange(df, dt, as_html=True) == ' – '
+ assert daterange(df, dt, as_html=True) == ' ' \
+ '– until ' \
+ ''
def test_same_year_spanish():
with translation.override('es'):
df = date(2003, 2, 1)
dt = date(2003, 4, 3)
- assert daterange(df, dt) == "1 de febrero - 3 de abril de 2003"
- assert daterange(df, dt, as_html=True) == ' - '
+ assert daterange(df, dt) == "1 de febrero – 3 de abril de 2003"
+ assert daterange(df, dt, as_html=True) == ' ' \
+ '– hasta ' \
+ ''
def test_different_dates_german():
@@ -121,7 +133,9 @@ def test_different_dates_german():
df = date(2003, 2, 1)
dt = date(2005, 4, 3)
assert daterange(df, dt) == "1. Februar 2003 – 3. April 2005"
- assert daterange(df, dt, as_html=True) == ' – '
+ assert daterange(df, dt, as_html=True) == ' ' \
+ '– bis ' \
+ ''
def test_different_dates_english():
@@ -129,7 +143,9 @@ def test_different_dates_english():
df = date(2003, 2, 1)
dt = date(2005, 4, 3)
assert daterange(df, dt) == "Feb. 1, 2003 – April 3, 2005"
- assert daterange(df, dt, as_html=True) == ' – '
+ assert daterange(df, dt, as_html=True) == ' ' \
+ '– until ' \
+ ''
def test_different_dates_spanish():
@@ -137,7 +153,8 @@ def test_different_dates_spanish():
df = date(2003, 2, 1)
dt = date(2005, 4, 3)
assert daterange(df, dt) == "1 de febrero de 2003 – 3 de abril de 2005"
- assert daterange(df, dt, as_html=True) == ' – ' \
+ assert daterange(df, dt, as_html=True) == ' ' \
+ '– hasta ' \
''
@@ -146,7 +163,8 @@ def test_different_dates_other_lang():
df = date(2003, 2, 1)
dt = date(2005, 4, 3)
assert daterange(df, dt) == "01 Şubat 2003 – 03 Nisan 2005"
- assert daterange(df, dt, as_html=True) == ' – ' \
+ assert daterange(df, dt, as_html=True) == ' ' \
+ '– until ' \
''
@@ -155,13 +173,15 @@ def test_datetime_same_day():
df = datetime(2003, 2, 1, 9, 0)
dt = datetime(2003, 2, 1, 10, 0)
assert datetimerange(df, dt) == "01.02.2003 09:00 – 10:00"
- assert datetimerange(df, dt, as_html=True) == ' – ' \
+ assert datetimerange(df, dt, as_html=True) == ' ' \
+ '– bis ' \
''
with language('en', 'US'):
df = datetime(2003, 2, 1, 9, 0)
dt = datetime(2003, 2, 1, 10, 0)
assert datetimerange(df, dt) == "02/01/2003 9 a.m. – 10 a.m."
- assert datetimerange(df, dt, as_html=True) == ' – ' \
+ assert datetimerange(df, dt, as_html=True) == ' ' \
+ '– until ' \
''
@@ -170,11 +190,13 @@ def test_datetime_different_day():
df = datetime(2003, 2, 1, 9, 0)
dt = datetime(2003, 2, 2, 10, 0)
assert datetimerange(df, dt) == "01.02.2003 09:00 – 02.02.2003 10:00"
- assert datetimerange(df, dt, as_html=True) == ' – ' \
+ assert datetimerange(df, dt, as_html=True) == ' ' \
+ '– bis ' \
''
with language('en', 'US'):
df = datetime(2003, 2, 1, 9, 0)
dt = datetime(2003, 2, 2, 10, 0)
assert datetimerange(df, dt) == "02/01/2003 9 a.m. – 02/02/2003 10 a.m."
- assert datetimerange(df, dt, as_html=True) == ' – ' \
+ assert datetimerange(df, dt, as_html=True) == ' ' \
+ '– until ' \
''