From: Chris Fulljames Date: Sat, 12 Apr 2025 23:31:01 +0000 (-0400) Subject: Allow submitting songs to event X-Git-Url: https://littlesong.place/gitweb/?a=commitdiff_plain;h=38ebe7ba0e800ecfaa885dea2220d4feb6245250;p=littlesongplace.git Allow submitting songs to event --- diff --git a/src/littlesongplace/jams.py b/src/littlesongplace/jams.py index ad136c1..72f04d7 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, comments, db +from . import auth, comments, db, songs from .sanitize import sanitize_user_text bp = Blueprint("jams", __name__, url_prefix="/jams") @@ -149,7 +149,9 @@ def events_view(jamid, eventid): except StopIteration: abort(404) # No event with this ID - return render_template("jam-event.html", jam=jam, event=event) + event_songs = songs.get_for_event(event.eventid) + + return render_template("jam-event.html", jam=jam, event=event, songs=event_songs) @bp.post("//events//update") diff --git a/src/littlesongplace/songs.py b/src/littlesongplace/songs.py index 9e060fc..107dbcd 100644 --- a/src/littlesongplace/songs.py +++ b/src/littlesongplace/songs.py @@ -152,6 +152,15 @@ def get_for_playlist(playlistid): """, [playlistid]) +def get_for_event(eventid): + return _from_db( + """ + SELECT * FROM songs + INNER JOIN users ON songs.userid = users.userid + WHERE songs.eventid = ? + """, + [eventid]) + def _from_db(query, args=()): songs_data = db.query(query, args) tags, collabs = _get_info_for_songs(songs_data) @@ -373,6 +382,10 @@ def create_song(): description = request.form["description"] tags = [t.strip() for t in request.form["tags"].split(",") if t] collaborators = [c.strip() for c in request.form["collabs"].split(",") if c] + try: + eventid = int(request.args["eventid"]) if "eventid" in request.args else None + except ValueError: + abort(400) with tempfile.NamedTemporaryFile(delete=False) as tmp_file: passed = convert_song(tmp_file, file, yt_url) @@ -388,11 +401,11 @@ def create_song(): timestamp = datetime.now(timezone.utc).isoformat() song_data = db.query( """ - insert into songs (userid, title, description, created, threadid) - values (?, ?, ?, ?, ?) + insert into songs (userid, title, description, created, threadid, eventid) + values (?, ?, ?, ?, ?, ?) returning (songid) """, - [session["userid"], title, description, timestamp, threadid], + [session["userid"], title, description, timestamp, threadid, eventid], one=True) # Move file to permanent location diff --git a/src/littlesongplace/sql/schema_revert.sql b/src/littlesongplace/sql/schema_revert.sql index 2fdb192..a6cd883 100644 --- a/src/littlesongplace/sql/schema_revert.sql +++ b/src/littlesongplace/sql/schema_revert.sql @@ -1,3 +1,5 @@ +DROP INDEX idx_songs_by_eventid; +ALTER TABLE songs DROP COLUMN eventid; DROP TABLE IF EXISTS jams; DROP TABLE IF EXISTS jam_events; diff --git a/src/littlesongplace/sql/schema_update.sql b/src/littlesongplace/sql/schema_update.sql index 527381c..ffb9b60 100644 --- a/src/littlesongplace/sql/schema_update.sql +++ b/src/littlesongplace/sql/schema_update.sql @@ -22,5 +22,8 @@ CREATE TABLE jam_events( FOREIGN KEY(threadid) REFERENCES comment_threads(threadid) ); +ALTER TABLE songs ADD COLUMN eventid INTEGER REFERENCES jam_events(eventid); +CREATE INDEX idx_songs_by_eventid ON songs(eventid); + PRAGMA user_version = 5; diff --git a/test/test_jams.py b/test/test_jams.py index c3f2f26..855186e 100644 --- a/test/test_jams.py +++ b/test/test_jams.py @@ -2,7 +2,7 @@ from datetime import datetime, timedelta, timezone import pytest -from .utils import create_user +from .utils import create_user, upload_song @pytest.fixture def user(client): @@ -221,7 +221,7 @@ 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) @@ -232,7 +232,7 @@ def _create_past_present_future_events(client, jam): 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, @@ -254,7 +254,7 @@ def test_jam_events_sorted_on_jams_page(client, user, 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 @@ -271,3 +271,10 @@ def test_jam_events_sorted_on_jam_info_page(client, user, jam): b"PastJam", ]) +# Song Submissions ############################################################# + +def test_submit_song_to_event(client, user, jam, event): + upload_song(client, b"Success", eventid=event) + response = client.get(f"/jams/{jam}/events/{event}") + assert b"song title" in response.data + diff --git a/test/utils.py b/test/utils.py index b4d7d26..f4d1629 100644 --- a/test/utils.py +++ b/test/utils.py @@ -45,7 +45,10 @@ def create_user_song_and_playlist(client, playlist_type="private"): create_user_and_song(client) client.post("/create-playlist", data={"name": "my playlist", "type": playlist_type}) -def upload_song(client, msg, error=False, songid=None, user="user", userid=1, filename=TEST_DATA/"sample-3s.mp3", **kwargs): +def upload_song( + client, msg, error=False, songid=None, eventid=None, + user="user", userid=1, filename=TEST_DATA/"sample-3s.mp3", **kwargs): + song_file = open(filename, "rb") data = { @@ -58,10 +61,14 @@ def upload_song(client, msg, error=False, songid=None, user="user", userid=1, fi for k, v in kwargs.items(): data[k] = v + upload_url = "/upload-song" + if songid: - response = client.post(f"/upload-song?songid={songid}", data=data) - else: - response = client.post("/upload-song", data=data) + upload_url += f"?songid={songid}" + elif eventid: + upload_url += f"?eventid={eventid}" + + response = client.post(upload_url, data=data) assert response.status_code == 302 if error: