diff --git a/src/backoffice/templates/backoffice/event/components/list_content.html b/src/backoffice/templates/backoffice/event/components/list_content.html index 725a8ffd512136139afe8d4788b61bd29359ad8b..b43ba5382a133f5367a70f46f12cffafa676dd3e 100644 --- a/src/backoffice/templates/backoffice/event/components/list_content.html +++ b/src/backoffice/templates/backoffice/event/components/list_content.html @@ -36,8 +36,12 @@ <tbody> {% for event in events %} <tr class="{% if not event.is_public %}text-muted{% endif %}"> - <td>{{ event.schedule_start }}</td> - <td>{{ event.schedule_duration }}</td> + <td data-order="{{ event.schedule_start|date:"U" }}"> + <abbr title="{{ event.schedule_start|date:"c" }}">{{ event.schedule_start|conference_time:conference }}</abbr> + </td> + <td data-order="{{ event.schedule_duration.total_seconds|default:"0" }}"> + {{ event.schedule_duration|naturaltimespan }} + </td> <td> {% if user_list and event.kind == 'sos' %} <a href="{% url 'backoffice:sos-edit' pk=event.pk %}">{{ event.name }}</a> diff --git a/src/backoffice/templatetags/c3assemblies.py b/src/backoffice/templatetags/c3assemblies.py index 5539f5fcccb9e9e8faebc0e36a3687a9a089aa30..b18a74875547123857409042166018ec6e19ddd5 100644 --- a/src/backoffice/templatetags/c3assemblies.py +++ b/src/backoffice/templatetags/c3assemblies.py @@ -45,8 +45,11 @@ def get_language_item(dictionary): @register.filter -def naturaltimespan(x): - assert isinstance(x, timedelta), str.format('Expected a timedelta object: {0!r}', x) +def naturaltimespan(x: timedelta) -> str or None: + if x is None: + return '' + if not isinstance(x, timedelta): + raise ValueError('Expected a timedelta object.') seconds = x.total_seconds() diff --git a/src/core/locale/de/LC_MESSAGES/django.po b/src/core/locale/de/LC_MESSAGES/django.po index 2590c45300c4711618eb412bdc2876a9566d6292..c392c9da1a197f5fe2d341ec22000def4f12ade0 100644 --- a/src/core/locale/de/LC_MESSAGES/django.po +++ b/src/core/locale/de/LC_MESSAGES/django.po @@ -2466,6 +2466,9 @@ msgstr "" msgid "Activate your %(safe_site_name)s account" msgstr "Aktiviere dein %(safe_site_name)s Konto" +msgid "Conference-day" +msgstr "Tag" + #, python-format msgid "Validation__error_file_size_MB_exceeded %(max_size)d" msgstr "Die Datei darf nicht größer als %(max_size)dMb sein" diff --git a/src/core/locale/en/LC_MESSAGES/django.po b/src/core/locale/en/LC_MESSAGES/django.po index 608a666a79bb31b449a9466da58b8defb0ad87f2..95eeb5c3b21d076de54cc07009669a76e8f1bb63 100644 --- a/src/core/locale/en/LC_MESSAGES/django.po +++ b/src/core/locale/en/LC_MESSAGES/django.po @@ -2448,6 +2448,9 @@ msgstr "" msgid "Activate your %(safe_site_name)s account" msgstr "" +msgid "Conference-day" +msgstr "day" + #, python-format msgid "Validation__error_file_size_MB_exceeded %(max_size)d" msgstr "You aren't allowed to upload a file larger than %(max_size)dMb" diff --git a/src/core/templatetags/conference_time.py b/src/core/templatetags/conference_time.py new file mode 100644 index 0000000000000000000000000000000000000000..8bac3e6a1e157f85e5bbbbba6b363ece691e1efa --- /dev/null +++ b/src/core/templatetags/conference_time.py @@ -0,0 +1,29 @@ +from datetime import datetime + +from django.template.defaulttags import register +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + +from core.models import Conference + + +@register.filter +def conference_time(timestamp: datetime, conf: Conference): + if timestamp is None: + return '' + + # derive conference day from given timestamp + day = conf.get_conference_day(timestamp) + day_i18n = _('Conference-day') + + # convert timestamp to current timezone + local_ts = timezone.localtime(timestamp) + + # convert midnight to 24:00 + h = local_ts.hour + if h == 0: + h = 24 + m = local_ts.minute + + # return formatted string + return f'{day_i18n} {day} @ {h:02d}:{m:02d}' diff --git a/src/plainui/jinja2.py b/src/plainui/jinja2.py index 2677ce6ce025e927519f7457abe8663890209993..7365c3a327e7084da0485e6ecd2c0b994b94e0ca 100644 --- a/src/plainui/jinja2.py +++ b/src/plainui/jinja2.py @@ -22,6 +22,7 @@ from modeltranslation.fields import build_localized_fieldname from modeltranslation.settings import AVAILABLE_LANGUAGES from core.models import PlatformUser, UserBadge +from core.templatetags.conference_time import conference_time from core.templatetags.hub_absolute import hub_absolute, hub_absolute_self from core.templatetags.update_parameters import update_parameters @@ -302,6 +303,7 @@ def environment(**options): 'link_icon': link_icon, } ) + env.filters['conference_time'] = conference_time env.filters['strftdelta'] = custom_timedelta env.filters['strftdelta_short'] = custom_timedelta_short env.filters['strftimehm'] = custom_strftimehm diff --git a/src/plainui/views/general.py b/src/plainui/views/general.py index bf9e14f23aaaf45b55b8abdbb5bda015cfd68a02..bc3f1074e19ccc541411782fffbddfc26074fe79 100644 --- a/src/plainui/views/general.py +++ b/src/plainui/views/general.py @@ -126,10 +126,12 @@ class TagView(ConferenceRequiredMixin, TemplateView): context['tag'] = tag # TODO other types. What should we link here? + # TODO: consider using views.utils.event_filter() here context['events'] = ( Event.objects.conference_accessible(self.conf) .filter(id__in=TagItem.objects.filter(tag=tag, target_type=ContentType.objects.get_for_model(Event)).values_list('target_id')) .filter(schedule_start__isnull=False, schedule_end__isnull=False) + .order_by('schedule_start', 'schedule_end') ) context['my_favorite_events'] = session_get_favorite_events(self.request.session, self.request.user)