]> littlesong.place Git - littlesongplace.git/commitdiff
Allow submitting songs to event
authorChris Fulljames <christianfulljames@gmail.com>
Sat, 12 Apr 2025 23:31:01 +0000 (19:31 -0400)
committerChris Fulljames <christianfulljames@gmail.com>
Sat, 12 Apr 2025 23:31:01 +0000 (19:31 -0400)
src/littlesongplace/jams.py
src/littlesongplace/songs.py
src/littlesongplace/sql/schema_revert.sql
src/littlesongplace/sql/schema_update.sql
test/test_jams.py
test/utils.py

index ad136c18a11f6d1b2443133c7f90a4883587f81b..72f04d79c921aa8e0b74501c99ea8135c9535652 100644 (file)
@@ -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("/<int:jamid>/events/<int:eventid>/update")
index 9e060fcdf1194a0b257f7804f86556ecf420874b..107dbcdf67b46a235f6385abfed7c2c9caafce6d 100644 (file)
@@ -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
index 2fdb19274a91ccd1839a18ec175f5ec5367a0779..a6cd88388abb6d846254cc2b24979922302cff4d 100644 (file)
@@ -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;
 
index 527381c73b675eb5c14b39a2680b5bef0ae61022..ffb9b60a0b69310759846dfde36c7b2e28a96927 100644 (file)
@@ -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;
 
index c3f2f26837042fe1fdfd6fb7b4edd6061d2887fb..855186ecc0e300dda6fb6eba31bfbeff4f2b2b2d 100644 (file)
@@ -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
+
index b4d7d26e572a10c8447f2683dccf49841ff3a56d..f4d1629c493ca510f12593b082ea9f22589b1781 100644 (file)
@@ -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: