From 13cf6db1f96bd41f2d706ea8ca24d2af8bbbef7e Mon Sep 17 00:00:00 2001 From: Helge Jung <hej@c3pb.de> Date: Mon, 23 Dec 2024 13:25:29 +0100 Subject: [PATCH] plainui: use Conference.days for day selection instead of custom logic The previous logic used the conference start as basis instead of the already existing proper logic. Likewise, the UI iterated in a custom logic as well instead of just using the existing enumeration of days. --- src/core/models/conference.py | 9 ++++++++- src/plainui/jinja2/plainui/fahrplan.html.j2 | 6 +++--- src/plainui/views/fahrplan.py | 15 ++++----------- src/plainui/views/utils.py | 8 ++++++-- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/core/models/conference.py b/src/core/models/conference.py index b84c50cb0..737006da6 100644 --- a/src/core/models/conference.py +++ b/src/core/models/conference.py @@ -440,6 +440,13 @@ class Conference(models.Model): days[-1].end = end return days + def day(self, official_number: int) -> 'ConferenceDay': + """Returns the n-th day of the conference, starting with 1.""" + for day in self.days: + if day.index == official_number: + return day + return None + @cached_property def _day0(self) -> datetime: if self.start is None: @@ -681,7 +688,7 @@ class ConferenceDay: return self.index == value.index and self.start == value.start and self.end == value.end def __repr__(self): - return f'{self.index} ({self.start.date()} - {self.end.date()})' + return f'{self.index} ({self.start} - {self.end})' class ConferenceExportCache(models.Model): diff --git a/src/plainui/jinja2/plainui/fahrplan.html.j2 b/src/plainui/jinja2/plainui/fahrplan.html.j2 index 68955ffcb..1e2b05bfc 100644 --- a/src/plainui/jinja2/plainui/fahrplan.html.j2 +++ b/src/plainui/jinja2/plainui/fahrplan.html.j2 @@ -40,7 +40,7 @@ <form method="get" action="#now" class="hub-card mb-2"> <input type="hidden" name="mode" value="{{ mode }}"> {% if show_assembly_filters %}<input type="hidden" name="show_assembly_filters" value="y">{% endif %} - {% if day %}<input type="hidden" name="day" value="{{ day }}">{% endif %} + {% if day %}<input type="hidden" name="day" value="{{ day.index }}">{% endif %} {% if kind %}<input type="hidden" name="kind" value="{{ kind }}">{% endif %} {% if assembly %}<input type="hidden" name="assembly" value="{{ assembly.slug }}">{% endif %} {% if track %}<input type="hidden" name="track" value="{{ track.slug }}">{% endif %} @@ -78,8 +78,8 @@ </div> <div class="hub-tags mb-2"> - {% for n in range(days) %} - {{ filter_button('d' ~ (n if n != day else '') , n == day, _("Day %(n)s", n=n + 1)) }} + {% for d in days %} + {{ filter_button('d' ~ (d.index if d != day else '') , d == day, _("Day %(n)s", n=d.index)) }} {%- endfor %} <div class="hub-tag-divider"></div> diff --git a/src/plainui/views/fahrplan.py b/src/plainui/views/fahrplan.py index a1b79f94b..39b247bbc 100644 --- a/src/plainui/views/fahrplan.py +++ b/src/plainui/views/fahrplan.py @@ -3,7 +3,7 @@ __all__ = ( 'PublicFahrplanView', ) -from datetime import datetime, timedelta +from datetime import datetime from django.http import Http404 from django.utils import timezone @@ -37,15 +37,10 @@ class FahrplanView(ConferenceRequiredMixin, TemplateView): context['my_favorite_events'] = session_get_favorite_events(self.request.session, self.request.user) - min_date = self.conf.start - max_date = self.conf.end - if min_date is None or max_date is None: + if self.conf.days_count == 0: raise Http404 - n_days = (max_date - min_date).days - if (max_date - min_date) != timedelta(n_days): - n_days += 1 - context['days'] = n_days + context['days'] = self.conf.days mode = self.request.GET.get('mode', 'calendar') day = self.request.GET.get('day', None) kind = self.request.GET.get('kind', 'official') @@ -100,13 +95,11 @@ class FahrplanView(ConferenceRequiredMixin, TemplateView): if day: try: day = int(day) - if day < 0 or day >= n_days: - day = None except ValueError: day = None else: day = None - context['day'] = day + context['day'] = self.conf.day(day) if day else None if kind == 'all': public_fahrplan = None diff --git a/src/plainui/views/utils.py b/src/plainui/views/utils.py index df4f9decf..6e19387ae 100644 --- a/src/plainui/views/utils.py +++ b/src/plainui/views/utils.py @@ -198,8 +198,12 @@ def event_filter( filters = {} if day is not None: - filters['schedule_start__gte'] = min_date + timedelta(day) - filters['schedule_start__lt'] = min_date + timedelta(day + 1) + if conf_day := conf.day(day): + filters['schedule_start__gte'] = conf_day.start + filters['schedule_start__lt'] = conf_day.end + else: + # an invalid day has been specified so there can't be any events by definition + return Event.objects.none() if kinds is not None: filters['kind__in'] = kinds if assembly: -- GitLab