Skip to content

Commit

Permalink
Merge branch 'main' into #2577-asset-view
Browse files Browse the repository at this point in the history
  • Loading branch information
JacobCoffee authored Sep 20, 2024
2 parents bfc2b2c + fa18e78 commit a30673a
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 60 deletions.
4 changes: 2 additions & 2 deletions base-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
dj-database-url==0.5.0
django-pipeline==3.0.0 # 3.0.0 is first version that supports Django 4.2
django-pipeline==3.1.0 # 3.0.0 is first version that supports Django 4.2
django-sitetree==1.18.0 # >=1.17.1 is (?) first version that supports Django 4.2
django-apptemplates==1.5
django-admin-interface==0.24.2
django-admin-interface==0.28.9
django-translation-aliases==0.1.0
Django==4.2.16
docutils==0.21.2
Expand Down
2 changes: 1 addition & 1 deletion dev-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# Required for running tests

factory-boy==3.2.1
factory-boy==3.3.1
Faker==0.8.1
tblib==1.7.0
responses==0.13.3
Expand Down
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 %}

0 comments on commit a30673a

Please sign in to comment.