Skip to content

Commit f408252

Browse files
committed
fix: order events properly
1 parent 2074f18 commit f408252

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

events/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,15 @@ def get_absolute_url(self):
8787

8888
class EventManager(models.Manager):
8989
def for_datetime(self, dt=None):
90+
"""Returns all events that are scheduled to START AFTER the given datetime."""
9091
if dt is None:
9192
dt = timezone.now()
9293
else:
9394
dt = convert_dt_to_aware(dt)
9495
return self.filter(Q(occurring_rule__dt_start__gt=dt) | Q(recurring_rules__finish__gt=dt))
9596

9697
def until_datetime(self, dt=None):
98+
"""Returns all events that are scheduled to END BEFORE the given datetime."""
9799
if dt is None:
98100
dt = timezone.now()
99101
else:

events/views.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,26 @@ class EventHomepage(ListView):
4444

4545
def get_queryset(self) -> Event:
4646
"""Queryset to return all events, ordered by START date."""
47-
return Event.objects.all().order_by("-occurring_rule__dt_start")
47+
return Event.objects.all().order_by("occurring_rule__dt_start")
4848

4949
def get_context_data(self, **kwargs: dict) -> dict:
5050
"""Add more ctx, specifically events that are happening now, just missed, and upcoming."""
5151
context = super().get_context_data(**kwargs)
52-
context["events_just_missed"] = Event.objects.until_datetime(timezone.now())[:2]
53-
context["upcoming_events"] = Event.objects.for_datetime(timezone.now())
52+
53+
# past events, most recent first
54+
past_events = list(Event.objects.until_datetime(timezone.now()))
55+
past_events.sort(key=lambda e: e.previous_time.dt_start if e.previous_time else timezone.now(), reverse=True)
56+
context["events_just_missed"] = past_events[:2]
57+
58+
# upcoming events, soonest first
59+
upcoming = list(Event.objects.for_datetime(timezone.now()))
60+
upcoming.sort(key=lambda e: e.next_time.dt_start if e.next_time else timezone.now())
61+
context["upcoming_events"] = upcoming
62+
63+
# right now, soonest first
5464
context["events_now"] = Event.objects.filter(
5565
occurring_rule__dt_start__lte=timezone.now(),
56-
occurring_rule__dt_end__gte=timezone.now())[:2]
66+
occurring_rule__dt_end__gte=timezone.now()).order_by('occurring_rule__dt_start')[:2]
5767
return context
5868

5969

@@ -79,15 +89,24 @@ def get_context_data(self, **kwargs):
7989
class EventList(EventListBase):
8090

8191
def get_queryset(self):
82-
return Event.objects.for_datetime(timezone.now()).filter(calendar__slug=self.kwargs['calendar_slug']).order_by(
83-
'occurring_rule__dt_start')
92+
return Event.objects.for_datetime(timezone.now()).filter(calendar__slug=self.kwargs['calendar_slug'])
8493

8594
def get_context_data(self, **kwargs):
8695
context = super().get_context_data(**kwargs)
87-
context['events_today'] = Event.objects.until_datetime(timezone.now()).filter(
88-
calendar__slug=self.kwargs['calendar_slug'])[:2]
96+
97+
# Get today's events sorted by most recent
98+
today_events = list(Event.objects.until_datetime(timezone.now()).filter(
99+
calendar__slug=self.kwargs['calendar_slug']))
100+
today_events.sort(key=lambda e: e.previous_time.dt_start if e.previous_time else timezone.now(), reverse=True)
101+
context['events_today'] = today_events[:2]
102+
89103
context['calendar'] = get_object_or_404(Calendar, slug=self.kwargs['calendar_slug'])
90-
context['upcoming_events'] = self.get_queryset()
104+
105+
# Get upcoming events sorted by nearest first
106+
upcoming = list(self.get_queryset())
107+
upcoming.sort(key=lambda e: e.next_time.dt_start if e.next_time else timezone.now())
108+
context['upcoming_events'] = upcoming
109+
91110
return context
92111

93112

0 commit comments

Comments
 (0)