Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: display active events, fix time not displaying for some events #2556

Merged
merged 7 commits into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,15 @@ def previous_time(self):
return None

@property
def next_or_previous_time(self):
return self.next_time or self.previous_time
def next_or_previous_time(self) -> models.Model:
"""Return the next or previous time of the event OR the occurring rule."""
if next_time := self.next_time:
return next_time

if previous_time := self.previous_time:
return previous_time

return self.occurring_rule if hasattr(self, "occurring_rule") else None

@property
def is_past(self):
Expand Down
61 changes: 54 additions & 7 deletions events/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,50 @@ def setUpTestData(cls):
finish=cls.now - datetime.timedelta(days=1),
)

# Future event
cls.future_event = Event.objects.create(title='Future Event', creator=cls.user, calendar=cls.calendar, featured=True)
RecurringRule.objects.create(
event=cls.future_event,
begin=cls.now + datetime.timedelta(days=1),
finish=cls.now + datetime.timedelta(days=2),
)

# Happening now event
cls.current_event = Event.objects.create(title='Current Event', creator=cls.user, calendar=cls.calendar)
RecurringRule.objects.create(
event=cls.current_event,
begin=cls.now - datetime.timedelta(hours=1),
finish=cls.now + datetime.timedelta(hours=1),
)

# Just missed event
cls.just_missed_event = Event.objects.create(title='Just Missed Event', creator=cls.user, calendar=cls.calendar)
RecurringRule.objects.create(
event=cls.just_missed_event,
begin=cls.now - datetime.timedelta(hours=3),
finish=cls.now - datetime.timedelta(hours=1),
)

# Past event
cls.past_event = Event.objects.create(title='Past Event', creator=cls.user, calendar=cls.calendar)
RecurringRule.objects.create(
event=cls.past_event,
begin=cls.now - datetime.timedelta(days=2),
finish=cls.now - datetime.timedelta(days=1),
)

def test_events_homepage(self):
url = reverse('events:events')
response = self.client.get(url)
events = response.context['object_list']
event_titles = [event.title for event in events]

self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.context['object_list']), 1)
self.assertEqual(len(events), 6)

self.assertIn('Future Event', event_titles)
self.assertIn('Current Event', event_titles)
self.assertIn('Past Event', event_titles)

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

self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.context['object_list']), 1)
self.assertEqual(len(response.context['object_list']), 3)

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

self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.context['object_list']), 1)
self.assertEqual(len(response.context['object_list']), 4)

def test_event_list_category(self):
category = EventCategory.objects.create(
Expand Down Expand Up @@ -114,7 +153,7 @@ def test_event_list_date(self):
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['object'], dt.date())
self.assertEqual(len(response.context['object_list']), 2)
self.assertEqual(len(response.context['object_list']), 6)

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

def test_upcoming_tag(self):
self.assertEqual(len(get_events_upcoming()), 1)
self.assertEqual(len(get_events_upcoming(only_featured=True)), 0)
self.assertEqual(len(get_events_upcoming()), 3)
self.assertEqual(len(get_events_upcoming(only_featured=True)), 1)
self.rule.begin = self.now - datetime.timedelta(days=3)
self.rule.finish = self.now - datetime.timedelta(days=2)
self.rule.save()
self.assertEqual(len(get_events_upcoming()), 0)
self.assertEqual(len(get_events_upcoming()), 2)

def test_context_data(self):
url = reverse("events:events")
response = self.client.get(url)

self.assertIn("events_just_missed", response.context)
self.assertIn("upcoming_events", response.context)
self.assertIn("events_now", response.context)


class EventSubmitTests(TestCase):
Expand Down
23 changes: 18 additions & 5 deletions events/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,21 @@ def get_context_data(self, **kwargs):

class EventHomepage(ListView):
""" Main Event Landing Page """
template_name = 'events/event_list.html'
template_name = "events/event_list.html"

def get_queryset(self):
return Event.objects.for_datetime(timezone.now()).order_by('occurring_rule__dt_start')
def get_queryset(self) -> Event:
"""Queryset to return all events, ordered by START date."""
return Event.objects.all().order_by("-occurring_rule__dt_start")

def get_context_data(self, **kwargs: dict) -> dict:
"""Add more ctx, specifically events that are happening now, just missed, and upcoming."""
context = super().get_context_data(**kwargs)
context["events_just_missed"] = Event.objects.until_datetime(timezone.now())[:2]
context["upcoming_events"] = Event.objects.for_datetime(timezone.now())
context["events_now"] = Event.objects.filter(
occurring_rule__dt_start__lte=timezone.now(),
occurring_rule__dt_end__gte=timezone.now())[:2]
return context


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

def get_queryset(self):
return Event.objects.for_datetime(timezone.now()).filter(calendar__slug=self.kwargs['calendar_slug']).order_by('occurring_rule__dt_start')
return Event.objects.for_datetime(timezone.now()).filter(calendar__slug=self.kwargs['calendar_slug']).order_by(
'occurring_rule__dt_start')

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['events_today'] = Event.objects.until_datetime(timezone.now()).filter(calendar__slug=self.kwargs['calendar_slug'])[:2]
context['events_today'] = Event.objects.until_datetime(timezone.now()).filter(
calendar__slug=self.kwargs['calendar_slug'])[:2]
context['calendar'] = get_object_or_404(Calendar, slug=self.kwargs['calendar_slug'])
return context

Expand Down
123 changes: 80 additions & 43 deletions templates/events/event_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,73 +8,110 @@

{% block header_content %}
{% if featured %}
<div class="featured-event">
<div class="featured-event">

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

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

<p class="event-date"><time datetime="{{ featured.next_datetime.dt_start|date:'c' }}">
{{ featured.next_datetime.dt_start|date:"l, F d, Y" }}
</time></p>
<p class="excerpt">{{ featured.description.rendered|striptags|truncatewords:"60" }} <a class="readmore" href="{{ featured.get_absolute_url }}">Read more</a></p>
</div>
<p class="event-date">
<time datetime="{{ featured.next_datetime.dt_start|date:'c' }}">
{{ featured.next_datetime.dt_start|date:"l, F d, Y" }}
</time>
</p>
<p class="excerpt">{{ featured.description.rendered|striptags|truncatewords:"60" }} <a class="readmore"
href="{{ featured.get_absolute_url }}">Read
more</a></p>
</div>
{% endif %}
{% endblock header_content %}


{# Based on python/events.html #}

{% block content %}

{% if calendar %}
{% if calendar %}
<header class="article-header">
<h3>from the {{ calendar.name }}</h3>
</header>
{% endif %}
{% endif %}

<div class="most-recent-events">
<div class="most-recent-events">
{% if events_now %}
<div class="shrubbery">
<h2 class="widget-title"><span aria-hidden="true" class="icon-calendar"></span>Upcoming Events</h2>
{% if page_obj.has_next %}
<p class="give-me-more"><a href="?page={{ page_obj.next_page_number }}" title="More Events">More</a></p>
{% endif %}
<h2 class="widget-title"><span aria-hidden="true" class="icon-alert"></span>Happening Now</h2>
<ul class="list-recent-events menu">
{% for object in object_list %}
{% for object in events_now %}
<li>
<h3 class="event-title"><a
href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a></h3>
<p>
{% with object.occurring_rule as next_time %}
{% include "events/includes/time_tag.html" %}
{% endwith %}

{% if object.venue %}
<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>
{% endif %}
</p>
</li>
{% endfor %}
</ul>
</div>
{% endif %}

<div class="shrubbery">
<h2 class="widget-title"><span aria-hidden="true" class="icon-calendar"></span>Upcoming Events</h2>
{% if page_obj.has_next %}
<p class="give-me-more"><a href="?page={{ page_obj.next_page_number }}" title="More Events">More</a></p>
{% endif %}
<ul class="list-recent-events menu">
{% for object in upcoming_events %}
<li>
<h3 class="event-title"><a href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a></h3>
<h3 class="event-title"><a href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a>
</h3>
<p>
{% with object.next_time as next_time %}
{% include "events/includes/time_tag.html" %}
{% include "events/includes/time_tag.html" %}
{% endwith %}

{% if object.venue %}
<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>
<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>
{% endif %}
</p>
</li>
{% endfor %}
</ul>
</div>

{% if events_today %}
<h3 class="widget-title just-missed">You just missed...</h3>
<ul class="list-recent-events menu">
{% for object in events_today %}
<li>
<h3 class="event-title"><a href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a></h3>
<p>
{% with object.previous_time as next_time %}
{% include "events/includes/time_tag.html" %}
{% endwith %}

{% if object.venue %}
<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>
{% endif %}
</p>
</li>
{% endfor %}
</ul>
{% endif %}
</div>

{% if events_just_missed %}
<div class="shrubbery">
<h3 class="widget-title just-missed">You just missed...</h3>
<ul class="list-recent-events menu">
{% for object in events_just_missed %}
<li>
<h3 class="event-title"><a
href="{{ object.get_absolute_url }}">{{ object.title|striptags }}</a></h3>
<p>
{% with object.previous_time as next_time %}
{% include "events/includes/time_tag.html" %}
{% endwith %}

{% if object.venue %}
<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>
{% endif %}
</p>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
</div>
{% endblock content %}