diff --git a/src/pretix/base/migrations/0281_event_is_remote.py b/src/pretix/base/migrations/0281_event_is_remote.py new file mode 100644 index 000000000..57c49e365 --- /dev/null +++ b/src/pretix/base/migrations/0281_event_is_remote.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.16 on 2025-05-20 11:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0280_cartposition_max_extend"), + ] + + operations = [ + migrations.AddField( + model_name="event", + name="is_remote", + field=models.BooleanField(default=False), + ), + ] diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index db687f248..5267073b5 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -616,6 +616,11 @@ class Event(EventMixin, LoggedModel): max_length=200, verbose_name=_("Location"), ) + is_remote = models.BooleanField( + default=False, + verbose_name=_("This event is remote or partially remote."), + help_text=_("This will be used to let users know if the event is in a different timezone and let’s us calculate users’ local times."), + ) geo_lat = models.FloatField( verbose_name=_("Latitude"), null=True, blank=True, diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index f94763816..7e5b59468 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -175,6 +175,7 @@ class EventWizardBasicsForm(I18nModelForm): 'presale_start', 'presale_end', 'location', + 'is_remote', 'geo_lat', 'geo_lon', ] @@ -448,6 +449,7 @@ class EventUpdateForm(I18nModelForm): 'presale_start', 'presale_end', 'location', + 'is_remote', 'geo_lat', 'geo_lon', 'all_sales_channels', diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html index f701872c0..c736b3722 100644 --- a/src/pretix/control/templates/pretixcontrol/event/settings.html +++ b/src/pretix/control/templates/pretixcontrol/event/settings.html @@ -61,6 +61,7 @@ {% bootstrap_field sform.locale layout="control" %} {% bootstrap_field sform.timezone layout="control" %} {% bootstrap_field sform.region layout="control" %} + {% bootstrap_field form.is_remote layout="control" %}
{% trans "Customer and attendee data" %} diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index 026e87f38..bdf15927e 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -175,7 +175,7 @@ {% endif %} {% if not cart_namespace or subevent %} -
+ {% include "pretixpresale/event/fragment_event_info.html" with event=request.event subevent=subevent ev=ev show_location=True %}
{% eventsignal event "pretix.presale.signals.front_page_top" request=request subevent=subevent %} diff --git a/src/pretix/presale/templates/pretixpresale/organizers/index.html b/src/pretix/presale/templates/pretixpresale/organizers/index.html index df8553744..7013b5693 100644 --- a/src/pretix/presale/templates/pretixpresale/organizers/index.html +++ b/src/pretix/presale/templates/pretixpresale/organizers/index.html @@ -50,7 +50,7 @@ {% for e in events %}{% eventurl e "presale:event.index" as url %}

{{ e.name }}

-

+

{% if e.settings.show_dates_on_frontpage %} {% if e.has_subevents %} {% icon "calendar" %} {% trans "Multiple dates" context "subevent" %} diff --git a/src/pretix/static/pretixpresale/js/ui/main.js b/src/pretix/static/pretixpresale/js/ui/main.js index e4b892f84..ed4ec1c0e 100644 --- a/src/pretix/static/pretixpresale/js/ui/main.js +++ b/src/pretix/static/pretixpresale/js/ui/main.js @@ -572,35 +572,17 @@ $(function () { form_handlers($("body")); var local_tz = moment.tz.guess() - $("span[data-timezone], small[data-timezone], time[data-timezone]").each(function() { + $(".event-is-remote span[data-timezone]").each(function() { var t = moment.tz($(this).attr("datetime") || $(this).attr("data-time"), $(this).attr("data-timezone")) var tz = moment.tz.zone($(this).attr("data-timezone")) - var tpl = '

'; - $(this).tooltip({ - "title": gettext("Time zone:") + " " + tz.abbr(t), - "template": tpl - }); if (t.tz(tz.name).format() !== t.tz(local_tz).format()) { - var $add = $("") - $add.append(" ") - $add.append($("").addClass("fa fa-globe")) - if ($(this).is("[data-time-short]")) { - $add.append($("").text(" " + t.tz(local_tz).format($("body").attr("data-timeformat")))) - } else { - $add.addClass("text-muted") - $add.append(" " + gettext("Your local time:") + " ") - if (t.tz(tz.name).format("YYYY-MM-DD") != t.tz(local_tz).format("YYYY-MM-DD")) { - $add.append(t.tz(local_tz).format($("body").attr("data-datetimeformat"))) - } else { - $add.append(t.tz(local_tz).format($("body").attr("data-timeformat"))) - } - } + var format = t.tz(tz.name).format("YYYY-MM-DD") != t.tz(local_tz).format("YYYY-MM-DD") ? "datetimeformat" : "timeformat"; + var time_str = t.tz(local_tz).format($("body").data(format)); + var $add = $("").addClass("text-muted").append(" (" + gettext("Your local time:") + " ") + $add.append($('