Skip to content

Commit 51c5b5d

Browse files
fix: display active events, fix time not displaying for some events (#2556)
* fix: display active events, fix time not displaying for some events * test: passing events view tests * style: different icon * Update views.py Co-authored-by: Ee Durbin <[email protected]> --------- Co-authored-by: Ee Durbin <[email protected]>
1 parent dc57cd2 commit 51c5b5d

File tree

4 files changed

+161
-57
lines changed

4 files changed

+161
-57
lines changed

events/models.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,15 @@ def previous_time(self):
211211
return None
212212

213213
@property
214-
def next_or_previous_time(self):
215-
return self.next_time or self.previous_time
214+
def next_or_previous_time(self) -> models.Model:
215+
"""Return the next or previous time of the event OR the occurring rule."""
216+
if next_time := self.next_time:
217+
return next_time
218+
219+
if previous_time := self.previous_time:
220+
return previous_time
221+
222+
return self.occurring_rule if hasattr(self, "occurring_rule") else None
216223

217224
@property
218225
def is_past(self):

events/tests/test_views.py

+54-7
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,50 @@ def setUpTestData(cls):
3535
finish=cls.now - datetime.timedelta(days=1),
3636
)
3737

38+
# Future event
39+
cls.future_event = Event.objects.create(title='Future Event', creator=cls.user, calendar=cls.calendar, featured=True)
40+
RecurringRule.objects.create(
41+
event=cls.future_event,
42+
begin=cls.now + datetime.timedelta(days=1),
43+
finish=cls.now + datetime.timedelta(days=2),
44+
)
45+
46+
# Happening now event
47+
cls.current_event = Event.objects.create(title='Current Event', creator=cls.user, calendar=cls.calendar)
48+
RecurringRule.objects.create(
49+
event=cls.current_event,
50+
begin=cls.now - datetime.timedelta(hours=1),
51+
finish=cls.now + datetime.timedelta(hours=1),
52+
)
53+
54+
# Just missed event
55+
cls.just_missed_event = Event.objects.create(title='Just Missed Event', creator=cls.user, calendar=cls.calendar)
56+
RecurringRule.objects.create(
57+
event=cls.just_missed_event,
58+
begin=cls.now - datetime.timedelta(hours=3),
59+
finish=cls.now - datetime.timedelta(hours=1),
60+
)
61+
62+
# Past event
63+
cls.past_event = Event.objects.create(title='Past Event', creator=cls.user, calendar=cls.calendar)
64+
RecurringRule.objects.create(
65+
event=cls.past_event,
66+
begin=cls.now - datetime.timedelta(days=2),
67+
finish=cls.now - datetime.timedelta(days=1),
68+
)
69+
3870
def test_events_homepage(self):
3971
url = reverse('events:events')
4072
response = self.client.get(url)
73+
events = response.context['object_list']
74+
event_titles = [event.title for event in events]
75+
4176
self.assertEqual(response.status_code, 200)
42-
self.assertEqual(len(response.context['object_list']), 1)
77+
self.assertEqual(len(events), 6)
78+
79+
self.assertIn('Future Event', event_titles)
80+
self.assertIn('Current Event', event_titles)
81+
self.assertIn('Past Event', event_titles)
4382

4483
def test_calendar_list(self):
4584
calendars_count = Calendar.objects.count()
@@ -54,7 +93,7 @@ def test_event_list(self):
5493
response = self.client.get(url)
5594

5695
self.assertEqual(response.status_code, 200)
57-
self.assertEqual(len(response.context['object_list']), 1)
96+
self.assertEqual(len(response.context['object_list']), 3)
5897

5998
url = reverse('events:event_list_past', kwargs={"calendar_slug": 'unexisting'})
6099
response = self.client.get(url)
@@ -66,7 +105,7 @@ def test_event_list_past(self):
66105
response = self.client.get(url)
67106

68107
self.assertEqual(response.status_code, 200)
69-
self.assertEqual(len(response.context['object_list']), 1)
108+
self.assertEqual(len(response.context['object_list']), 4)
70109

71110
def test_event_list_category(self):
72111
category = EventCategory.objects.create(
@@ -114,7 +153,7 @@ def test_event_list_date(self):
114153
response = self.client.get(url)
115154
self.assertEqual(response.status_code, 200)
116155
self.assertEqual(response.context['object'], dt.date())
117-
self.assertEqual(len(response.context['object_list']), 2)
156+
self.assertEqual(len(response.context['object_list']), 6)
118157

119158
def test_eventlocation_list(self):
120159
venue = EventLocation.objects.create(
@@ -150,12 +189,20 @@ def test_event_detail(self):
150189
self.assertEqual(self.event, response.context['object'])
151190

152191
def test_upcoming_tag(self):
153-
self.assertEqual(len(get_events_upcoming()), 1)
154-
self.assertEqual(len(get_events_upcoming(only_featured=True)), 0)
192+
self.assertEqual(len(get_events_upcoming()), 3)
193+
self.assertEqual(len(get_events_upcoming(only_featured=True)), 1)
155194
self.rule.begin = self.now - datetime.timedelta(days=3)
156195
self.rule.finish = self.now - datetime.timedelta(days=2)
157196
self.rule.save()
158-
self.assertEqual(len(get_events_upcoming()), 0)
197+
self.assertEqual(len(get_events_upcoming()), 2)
198+
199+
def test_context_data(self):
200+
url = reverse("events:events")
201+
response = self.client.get(url)
202+
203+
self.assertIn("events_just_missed", response.context)
204+
self.assertIn("upcoming_events", response.context)
205+
self.assertIn("events_now", response.context)
159206

160207

161208
class EventSubmitTests(TestCase):

events/views.py

+18-5
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,21 @@ def get_context_data(self, **kwargs):
4040

4141
class EventHomepage(ListView):
4242
""" Main Event Landing Page """
43-
template_name = 'events/event_list.html'
43+
template_name = "events/event_list.html"
4444

45-
def get_queryset(self):
46-
return Event.objects.for_datetime(timezone.now()).order_by('occurring_rule__dt_start')
45+
def get_queryset(self) -> Event:
46+
"""Queryset to return all events, ordered by START date."""
47+
return Event.objects.all().order_by("-occurring_rule__dt_start")
48+
49+
def get_context_data(self, **kwargs: dict) -> dict:
50+
"""Add more ctx, specifically events that are happening now, just missed, and upcoming."""
51+
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())
54+
context["events_now"] = Event.objects.filter(
55+
occurring_rule__dt_start__lte=timezone.now(),
56+
occurring_rule__dt_end__gte=timezone.now())[:2]
57+
return context
4758

4859

4960
class EventDetail(DetailView):
@@ -68,11 +79,13 @@ def get_context_data(self, **kwargs):
6879
class EventList(EventListBase):
6980

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

7385
def get_context_data(self, **kwargs):
7486
context = super().get_context_data(**kwargs)
75-
context['events_today'] = Event.objects.until_datetime(timezone.now()).filter(calendar__slug=self.kwargs['calendar_slug'])[:2]
87+
context['events_today'] = Event.objects.until_datetime(timezone.now()).filter(
88+
calendar__slug=self.kwargs['calendar_slug'])[:2]
7689
context['calendar'] = get_object_or_404(Calendar, slug=self.kwargs['calendar_slug'])
7790
return context
7891

templates/events/event_list.html

+80-43
Original file line numberDiff line numberDiff line change
@@ -8,73 +8,110 @@
88

99
{% block header_content %}
1010
{% if featured %}
11-
<div class="featured-event">
11+
<div class="featured-event">
1212

13-
<h2 class="welcome-message">Featured Python Event</h2>
13+
<h2 class="welcome-message">Featured Python Event</h2>
1414

15-
<h1 class="call-to-action">{{ featured.title|striptags }}</h1>
15+
<h1 class="call-to-action">{{ featured.title|striptags }}</h1>
1616

17-
<p class="event-date"><time datetime="{{ featured.next_datetime.dt_start|date:'c' }}">
18-
{{ featured.next_datetime.dt_start|date:"l, F d, Y" }}
19-
</time></p>
20-
<p class="excerpt">{{ featured.description.rendered|striptags|truncatewords:"60" }} <a class="readmore" href="{{ featured.get_absolute_url }}">Read more</a></p>
21-
</div>
17+
<p class="event-date">
18+
<time datetime="{{ featured.next_datetime.dt_start|date:'c' }}">
19+
{{ featured.next_datetime.dt_start|date:"l, F d, Y" }}
20+
</time>
21+
</p>
22+
<p class="excerpt">{{ featured.description.rendered|striptags|truncatewords:"60" }} <a class="readmore"
23+
href="{{ featured.get_absolute_url }}">Read
24+
more</a></p>
25+
</div>
2226
{% endif %}
2327
{% endblock header_content %}
2428

25-
26-
{# Based on python/events.html #}
27-
2829
{% block content %}
2930

30-
{% if calendar %}
31+
{% if calendar %}
3132
<header class="article-header">
3233
<h3>from the {{ calendar.name }}</h3>
3334
</header>
34-
{% endif %}
35+
{% endif %}
3536

36-
<div class="most-recent-events">
37+
<div class="most-recent-events">
38+
{% if events_now %}
3739
<div class="shrubbery">
38-
<h2 class="widget-title"><span aria-hidden="true" class="icon-calendar"></span>Upcoming Events</h2>
39-
{% if page_obj.has_next %}
40-
<p class="give-me-more"><a href="?page={{ page_obj.next_page_number }}" title="More Events">More</a></p>
41-
{% endif %}
40+
<h2 class="widget-title"><span aria-hidden="true" class="icon-alert"></span>Happening Now</h2>
4241
<ul class="list-recent-events menu">
43-
{% for object in object_list %}
42+
{% for object in events_now %}
43+
<li>
44+
<h3 class="event-title"><a
45+
href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a></h3>
46+
<p>
47+
{% with object.occurring_rule as next_time %}
48+
{% include "events/includes/time_tag.html" %}
49+
{% endwith %}
50+
51+
{% if object.venue %}
52+
<span class="event-location">{% if object.venue.url %}
53+
<a href="{{ object.venue.url }}">{% endif %}{{ object.venue.name }}
54+
{% if object.venue.url %}</a>{% endif %}{% if object.venue.address %},
55+
{{ object.venue.address }}{% endif %}</span>
56+
{% endif %}
57+
</p>
58+
</li>
59+
{% endfor %}
60+
</ul>
61+
</div>
62+
{% endif %}
63+
64+
<div class="shrubbery">
65+
<h2 class="widget-title"><span aria-hidden="true" class="icon-calendar"></span>Upcoming Events</h2>
66+
{% if page_obj.has_next %}
67+
<p class="give-me-more"><a href="?page={{ page_obj.next_page_number }}" title="More Events">More</a></p>
68+
{% endif %}
69+
<ul class="list-recent-events menu">
70+
{% for object in upcoming_events %}
4471
<li>
45-
<h3 class="event-title"><a href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a></h3>
72+
<h3 class="event-title"><a href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a>
73+
</h3>
4674
<p>
4775
{% with object.next_time as next_time %}
48-
{% include "events/includes/time_tag.html" %}
76+
{% include "events/includes/time_tag.html" %}
4977
{% endwith %}
5078

5179
{% if object.venue %}
52-
<span class="event-location">{% if object.venue.url %}<a href="{{ object.venue.url }}">{% endif %}{{ object.venue.name }}{% if object.venue.url %}</a>{% endif %}{% if object.venue.address %}, {{ object.venue.address }}{% endif %}</span>
80+
<span class="event-location">{% if object.venue.url %}
81+
<a href="{{ object.venue.url }}">{% endif %}{{ object.venue.name }}
82+
{% if object.venue.url %}</a>{% endif %}{% if object.venue.address %},
83+
{{ object.venue.address }}{% endif %}</span>
5384
{% endif %}
5485
</p>
5586
</li>
5687
{% endfor %}
57-
</ul>
58-
</div>
59-
60-
{% if events_today %}
61-
<h3 class="widget-title just-missed">You just missed...</h3>
62-
<ul class="list-recent-events menu">
63-
{% for object in events_today %}
64-
<li>
65-
<h3 class="event-title"><a href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a></h3>
66-
<p>
67-
{% with object.previous_time as next_time %}
68-
{% include "events/includes/time_tag.html" %}
69-
{% endwith %}
70-
71-
{% if object.venue %}
72-
<span class="event-location">{% if object.venue.url %}<a href="{{ object.venue.url }}">{% endif %}{{ object.venue.name }}{% if object.venue.url %}</a>{% endif %}{% if object.venue.address %}, {{ object.venue.address }}{% endif %}</span>
73-
{% endif %}
74-
</p>
75-
</li>
76-
{% endfor %}
7788
</ul>
78-
{% endif %}
7989
</div>
90+
91+
{% if events_just_missed %}
92+
<div class="shrubbery">
93+
<h3 class="widget-title just-missed">You just missed...</h3>
94+
<ul class="list-recent-events menu">
95+
{% for object in events_just_missed %}
96+
<li>
97+
<h3 class="event-title"><a
98+
href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a></h3>
99+
<p>
100+
{% with object.previous_time as next_time %}
101+
{% include "events/includes/time_tag.html" %}
102+
{% endwith %}
103+
104+
{% if object.venue %}
105+
<span class="event-location">{% if object.venue.url %}
106+
<a href="{{ object.venue.url }}">{% endif %}{{ object.venue.name }}
107+
{% if object.venue.url %}</a>{% endif %}{% if object.venue.address %},
108+
{{ object.venue.address }}{% endif %}</span>
109+
{% endif %}
110+
</p>
111+
</li>
112+
{% endfor %}
113+
</ul>
114+
</div>
115+
{% endif %}
116+
</div>
80117
{% endblock content %}

0 commit comments

Comments
 (0)