From: Chris Fulljames Date: Sat, 12 Apr 2025 19:11:54 +0000 (-0400) Subject: Implement jam event lists X-Git-Url: https://littlesong.place/gitweb/?a=commitdiff_plain;h=75598b67314048f50e0fbb6183ddf62d6c03859c;p=littlesongplace.git Implement jam event lists --- diff --git a/src/littlesongplace/jams.py b/src/littlesongplace/jams.py index 96dd6d5..ad136c1 100644 --- a/src/littlesongplace/jams.py +++ b/src/littlesongplace/jams.py @@ -22,6 +22,14 @@ def jam_owner_only(f): return f(jamid, *args, **kwargs) return _wrapper +def _sort_events(events): + now = datetime.now(timezone.utc) + # Only show events with valid timestamps + events = [e for e in events if e.startdate and e.enddate] + ongoing_events = [e for e in events if e.startdate <= now and e.enddate >= now] + upcoming_events = [e for e in events if e.startdate > now] + past_events = [e for e in events if e.enddate < now] + return ongoing_events, upcoming_events, past_events @bp.get("") def jams(): @@ -33,8 +41,23 @@ def jams(): """) jams = [Jam.from_row(r) for r in rows] + all_events = [] + for j in jams: + all_events.extend(j.events) + + # Only show events with valid timestamps + all_events = [e for e in all_events if e.startdate and e.enddate] + + ongoing_events, upcoming_events, past_events = _sort_events(all_events) + past_events = past_events[-5:] # Only show 5 most recent events + # TODO: Sort into groups based on start/end dates - return render_template("jams-main.html", ongoing=jams, upcoming=[], past=[]) + return render_template( + "jams-main.html", + ongoing=ongoing_events, + upcoming=upcoming_events, + past=past_events, + jams=jams) @bp.get("/create") @@ -56,8 +79,14 @@ def create(): @bp.get("/") def jam(jamid): jam = _get_jam_by_id(jamid) + ongoing_events, upcoming_events, past_events = _sort_events(jam.events) # Show the main jam page - return render_template("jam.html", jam=jam) + return render_template( + "jam.html", + jam=jam, + ongoing=ongoing_events, + upcoming=upcoming_events, + past=past_events) @bp.post("//update") diff --git a/src/littlesongplace/templates/jam-event.html b/src/littlesongplace/templates/jam-event.html index d67660e..b001ce6 100644 --- a/src/littlesongplace/templates/jam-event.html +++ b/src/littlesongplace/templates/jam-event.html @@ -12,12 +12,12 @@
{% if event.startdate %} Start Date: - {{ event.startdate.astimezone().strftime("%Y-%m-%d @ %I:%M%p") }} + {{ event.startdate.astimezone().strftime("%Y-%m-%d %I:%M%p") }}
{% endif %} {% if event.enddate %} End Date: - {{ event.enddate.astimezone().strftime("%Y-%m-%d @ %I:%M%p") }} + {{ event.enddate.astimezone().strftime("%Y-%m-%d %I:%M%p") }} {% endif %} diff --git a/src/littlesongplace/templates/jams-main.html b/src/littlesongplace/templates/jams-main.html index 1bcf7c4..397d357 100644 --- a/src/littlesongplace/templates/jams-main.html +++ b/src/littlesongplace/templates/jams-main.html @@ -9,7 +9,7 @@ {% from "jam-event-list.html" import jam_event_list %} {{ jam_event_list("Ongoing Events", ongoing) }} {{ jam_event_list("Upcoming Events", upcoming) }} -{{ jam_event_list("Recent Events", recent) }} +{{ jam_event_list("Recent Events", past) }}

All Jams

diff --git a/test/test_jams.py b/test/test_jams.py index 46daefa..c3f2f26 100644 --- a/test/test_jams.py +++ b/test/test_jams.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import datetime, timedelta, timezone import pytest @@ -202,3 +202,72 @@ def test_delete_event_other_users_jam(client, user, jam, event): response = client.get(f"/jams/{jam}/events/{event}/delete", follow_redirects=True) assert response.status_code == 403 +def _create_event(client, jam, title, startdate, enddate): + response = client.get(f"/jams/{jam}/events/create", follow_redirects=True) + eventid = int(response.request.path[-1]) + client.post( + f"/jams/{jam}/events/{eventid}/update", + data=_get_event_data(title=title, startdate=startdate, enddate=enddate)) + +def _assert_appear_in_order(page, values): + last_index = 0 + for v in values: + assert v in page + index = page.index(v, last_index+1) + assert index > last_index + last_index = index + +def _create_past_present_future_events(client, jam): + today = datetime.now(timezone.utc) + yesterday = (today - timedelta(days=1)).isoformat() + tomorrow = (today + timedelta(days=1)).isoformat() + + _create_event(client, jam, "PastJam", yesterday, yesterday) + _create_event(client, jam, "OngoingJam", yesterday, tomorrow) + _create_event(client, jam, "UpcomingJam", tomorrow, tomorrow) + + response = client.get("/jams/create", follow_redirects=True) + otherjam = int(response.request.path[-1]) + _create_event(client, otherjam, "OtherJam", tomorrow, tomorrow) + +def test_jam_events_sorted_on_jams_page(client, user, jam): + _create_past_present_future_events(client, jam) + + response = client.get("/jams") + _assert_appear_in_order( + response.data, + [ + b"Ongoing Events", + b"OngoingJam", + + b"Upcoming Events", + b"UpcomingJam", + b"OtherJam", + + b"Recent Events", + b"PastJam", + + b"All Jams", + b"New Jam", + b"New Jam", + ]) + +def test_jam_events_sorted_on_jam_info_page(client, user, jam): + _create_past_present_future_events(client, jam) + + response = client.get(f"/jams/{jam}") + assert b"OtherJam" not in response.data # Only events for this jam + + _assert_appear_in_order( + response.data, + [ + b"Ongoing Events", + b"OngoingJam", + + b"Upcoming Events", + b"UpcomingJam", + + b"Past Events", + b"PastJam", + ]) +