From: Chris Fulljames Date: Sat, 12 Apr 2025 15:54:02 +0000 (-0400) Subject: Implement event create/view X-Git-Url: https://littlesong.place/gitweb/?a=commitdiff_plain;h=80aeaab1b2b935cbc3a016c43e76c295bde329a4;p=littlesongplace.git Implement event create/view --- diff --git a/src/littlesongplace/comments.py b/src/littlesongplace/comments.py index 5e47b93..69320a6 100644 --- a/src/littlesongplace/comments.py +++ b/src/littlesongplace/comments.py @@ -12,6 +12,7 @@ class ThreadType(enum.IntEnum): SONG = 0 PROFILE = 1 PLAYLIST = 2 + JAM_EVENT = 3 class ObjectType(enum.IntEnum): COMMENT = 0 diff --git a/src/littlesongplace/jams.py b/src/littlesongplace/jams.py index 75a143c..ebc17e2 100644 --- a/src/littlesongplace/jams.py +++ b/src/littlesongplace/jams.py @@ -4,7 +4,7 @@ from datetime import datetime, timezone from flask import abort, Blueprint, g, redirect, render_template, request, url_for -from . import auth, db +from . import auth, comments, db from .sanitize import sanitize_user_text bp = Blueprint("jams", __name__, url_prefix="/jams") @@ -55,14 +55,7 @@ def create(): @bp.get("/") def jam(jamid): - row = db.query( - """ - SELECT * FROM jams - INNER JOIN users ON jams.ownerid = users.userid - WHERE jamid = ? - """, [jamid], expect_one=True) - - jam = Jam.from_row(row) + jam = get_jam_by_id(jamid) # Show the main jam page return render_template("jam.html", jam=jam) @@ -104,13 +97,30 @@ def delete(jamid): @jam_owner_only def events_create(jamid): # Create a new event and redirect to the edit form - ... + threadid = comments.create_thread(comments.ThreadType.JAM_EVENT, g.userid) + timestamp = datetime.now(timezone.utc).isoformat() + row = db.query( + """ + INSERT INTO jam_events (jamid, threadid, created, title) + VALUES (?, ?, ?, ?) + RETURNING eventid + """, [jamid, threadid, timestamp, "New Event"], one=True) + db.commit() + + eventid = row["eventid"] + return redirect(url_for("jams.events_view", jamid=jamid, eventid=eventid)) @bp.get("//events/") def events_view(jamid, eventid): # Show the event page - ... + jam = get_jam_by_id(jamid) + try: + event = next(e for e in jam.events if e.eventid == eventid) + except StopIteration: + abort(404) # No event with this ID + + return render_template("jam-event.html", jam=jam, event=event) @bp.post("//events//update") @@ -128,6 +138,14 @@ def events_delete(jamid, eventid): # Delete an event, redirect to list of all events ... +def get_jam_by_id(jamid): + row = db.query( + """ + SELECT * FROM jams + INNER JOIN users ON jams.ownerid = users.userid + WHERE jamid = ? + """, [jamid], expect_one=True) + return Jam.from_row(row) @dataclass class Jam: @@ -197,8 +215,8 @@ class JamEvent: threadid=row["threadid"], created=datetime.fromisoformat(row["created"]), title=row["title"], - startdate=datetime.fromisoformat(row["startdate"]), - enddate=datetime.fromisoformat(row["enddate"]), + startdate=datetime.fromisoformat(row["startdate"]) if "startdate" in row else None, + enddate=datetime.fromisoformat(row["enddate"]) if "enddate" in row else None, description=sanitize_user_text(row["description"] or ""), jam_title=row["jam_title"], jam_ownername=row["jam_ownername"], diff --git a/src/littlesongplace/templates/jam-event.html b/src/littlesongplace/templates/jam-event.html index 06c4ca1..8dad7a7 100644 --- a/src/littlesongplace/templates/jam-event.html +++ b/src/littlesongplace/templates/jam-event.html @@ -10,11 +10,15 @@ Host: {{ jam.ownername }}
+ {% if event.startdate %} Start Date: {{ event.startdate.aslocaltime().strftime("%Y-%m-%d @ %H:%M") }}
+ {% endif %} + {% if event.enddate %} End Date: {{ event.enddate.aslocaltime().strftime("%Y-%m-%d @ %H:%M") }} + {% endif %}
@@ -31,6 +35,7 @@ {% include "song-list.html" %}

Comments

+{% from "comment-thread.html" import comment_thread %} {{ comment_thread(event.threadid, session['userid'], jam.ownerid, event.comments) }} {% endblock %} diff --git a/test/test_jams.py b/test/test_jams.py index e415101..58a51da 100644 --- a/test/test_jams.py +++ b/test/test_jams.py @@ -12,6 +12,8 @@ def jam(client): client.get("/jams/create") return 1 +# Jams ######################################################################### + def test_view_invalid_jam(client): response = client.get("/jams/1") assert response.status_code == 404 @@ -22,6 +24,10 @@ def test_create_jam(client, user): assert response.request.path == "/jams/1" assert b"New Jam" in response.data +def test_create_jam_not_logged_in(client): + response = client.get("/jams/create", follow_redirects=True) + assert response.request.path == "/login" + def test_jams_list(client, user, jam): response = client.get("/jams") assert response.status_code == 200 @@ -38,6 +44,10 @@ def test_update_jam(client, user, jam): assert b"Coolest Jam" in response.data assert b"pb and jam" in response.data +def test_update_jam_not_logged_in(client): + response = client.post("/jams/1/update", follow_redirects=True) + assert response.request.path == "/login" + def test_update_invalid_jam(client, user): response = client.post( "/jams/1/update", @@ -59,6 +69,10 @@ def test_delete_jam(client, user, jam): response = client.get(f"/jams/{jam}") assert response.status_code == 404 +def test_delete_jam_not_logged_in(client): + response = client.get("/jams/1/delete", follow_redirects=True) + assert response.request.path == "/login" + def test_delete_invalid_jam(client, user): response = client.get("/jams/1/delete") assert response.status_code == 404 @@ -67,3 +81,39 @@ def test_delete_other_users_jam(client, user, jam): create_user(client, "otheruser", login=True) response = client.get(f"/jams/{jam}/delete") assert response.status_code == 403 + +# Jam Events ################################################################### + +def test_view_event_invalid_jamid(client, user): + response = client.get("/jams/1/events/1") + assert response.status_code == 404 + +def test_view_event_invalid_eventid(client, user, jam): + response = client.get(f"/jams/{jam}/events/1") + assert response.status_code == 404 + +def test_create_event(client, user, jam): + response = client.get(f"/jams/{jam}/events/create", follow_redirects=True) + assert response.request.path == f"/jams/{jam}/events/1" + assert b"New Event" in response.data + +def test_create_event_not_logged_in(client, user, jam): + response = client.get("/logout") + response = client.get(f"/jams/{jam}/events/create", follow_redirects=True) + assert response.request.path == "/login" + +def test_create_event_on_other_users_jam(client, user, jam): + create_user(client, "otheruser", login=True) + response = client.get(f"/jams/{jam}/events/create", follow_redirects=True) + assert response.status_code == 403 + +# Update event +# Update event invalid event +# Update event not logged in +# Update event other users jam + +# Delete event +# Delete event not logged in +# Delete event invalid event +# Delete event other users jam +