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")
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")
""",
[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)
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)
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
+DROP INDEX idx_songs_by_eventid;
+ALTER TABLE songs DROP COLUMN eventid;
DROP TABLE IF EXISTS jams;
DROP TABLE IF EXISTS 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;
import pytest
-from .utils import create_user
+from .utils import create_user, upload_song
@pytest.fixture
def user(client):
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)
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,
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
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
+
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 = {
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: