]> littlesong.place Git - littlesongplace.git/commitdiff
Implement jam event lists
authorChris Fulljames <christianfulljames@gmail.com>
Sat, 12 Apr 2025 19:11:54 +0000 (15:11 -0400)
committerChris Fulljames <christianfulljames@gmail.com>
Sat, 12 Apr 2025 19:11:54 +0000 (15:11 -0400)
src/littlesongplace/jams.py
src/littlesongplace/templates/jam-event.html
src/littlesongplace/templates/jams-main.html
test/test_jams.py

index 96dd6d5d8b3bf5182fdddbdc676853d23fede938..ad136c18a11f6d1b2443133c7f90a4883587f81b 100644 (file)
@@ -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("/<int:jamid>")
 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("/<int:jamid>/update")
index d67660ec080d6c06eb01117f8ebe6ed8db26b2d8..b001ce6186897b2e02c5a66593f0641cf615ce87 100644 (file)
         <br/>
     {% if event.startdate %}
     <strong>Start Date:</strong>
-        {{ event.startdate.astimezone().strftime("%Y-%m-%d %I:%M%p") }}
+        {{ event.startdate.astimezone().strftime("%Y-%m-%d %I:%M%p") }}
         <br/>
     {% endif %}
     {% if event.enddate %}
     <strong>End Date:</strong>
-        {{ event.enddate.astimezone().strftime("%Y-%m-%d %I:%M%p") }}
+        {{ event.enddate.astimezone().strftime("%Y-%m-%d %I:%M%p") }}
     {% endif %}
 </div>
 
index 1bcf7c4bc58e70c32bb0e6d798a5d21d146512f4..397d35715853d1f8a2fe2c217fde60c482e951ec 100644 (file)
@@ -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) }}
 
 <h2>All Jams</h2>
 <div class="jam-list">
index 46daefa47912d1e4703eeb9bcab22141612148ba..c3f2f26837042fe1fdfd6fb7b4edd6061d2887fb 100644 (file)
@@ -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",
+            ])
+