From: Chris Fulljames Date: Sun, 13 Apr 2025 13:10:55 +0000 (-0400) Subject: Hide jam songs before end date X-Git-Url: https://littlesong.place/gitweb/?a=commitdiff_plain;h=80ded250c1f7d24164e08efd91b444c5419b9937;p=littlesongplace.git Hide jam songs before end date --- diff --git a/src/littlesongplace/songs.py b/src/littlesongplace/songs.py index 107dbcd..3478460 100644 --- a/src/littlesongplace/songs.py +++ b/src/littlesongplace/songs.py @@ -30,6 +30,7 @@ class Song: tags: list[str] collaborators: list[str] user_has_pfp: bool + hidden: bool def json(self): return json.dumps(vars(self)) @@ -161,48 +162,50 @@ def get_for_event(eventid): """, [eventid]) +def _get_song_info_list(table, column, songid): + rows = db.query( + f"SELECT ({column}) FROM {table} WHERE songid = ?", [songid]) + return [r[column] for r in rows if r[column]] + def _from_db(query, args=()): songs_data = db.query(query, args) - tags, collabs = _get_info_for_songs(songs_data) songs = [] for sd in songs_data: - song_tags = [t["tag"] for t in tags[sd["songid"]] if t["tag"]] - song_collabs = [c["name"] for c in collabs[sd["songid"]] if c["name"]] - created = datetime.fromisoformat(sd["created"]).astimezone().strftime("%Y-%m-%d") - has_pfp = users.user_has_pfp(sd["userid"]) + songid = sd["songid"] + song_tags = _get_song_info_list("song_tags", "tag", songid) + song_collabs = _get_song_info_list("song_collaborators", "name", songid) + + # Song is hidden if it was submitted to an event that hasn't ended yet + hidden = False + if sd["eventid"]: + event_row = db.query( + "SELECT * FROM jam_events WHERE eventid = ?", + [sd["eventid"]], + one=True) + if event_row and event_row["enddate"]: + enddate = datetime.fromisoformat(event_row["enddate"]).astimezone() + hidden = datetime.now().astimezone() < enddate + + created = ( + datetime.fromisoformat(sd["created"]) + .astimezone() + .strftime("%Y-%m-%d")) + songs.append(Song( - sd["songid"], - sd["userid"], - sd["threadid"], - sd["username"], - sd["title"], - sanitize_user_text(sd["description"]), - created, - song_tags, - song_collabs, - has_pfp + songid=sd["songid"], + userid=sd["userid"], + threadid=sd["threadid"], + username=sd["username"], + title=sd["title"], + description=sanitize_user_text(sd["description"]), + created=created, + tags=song_tags, + collaborators=song_collabs, + user_has_pfp=users.user_has_pfp(sd["userid"]), + hidden=hidden, )) return songs -def _get_info_for_songs(songs): - tags = {} - collabs = {} - for song in songs: - songid = song["songid"] - tags[songid] = db.query( - """ - select (tag) from song_tags - where songid = ? - """, - [songid]) - collabs[songid] = db.query( - """ - select (name) from song_collaborators - where songid = ? - """, - [songid]) - return tags, collabs - @bp.get("/edit-song") def edit_song(): if not "userid" in session: diff --git a/src/littlesongplace/static/styles.css b/src/littlesongplace/static/styles.css index 9be2828..74c3b10 100644 --- a/src/littlesongplace/static/styles.css +++ b/src/littlesongplace/static/styles.css @@ -263,7 +263,7 @@ input[type=file] { margin: 10px 0px; } -.playlist-type { +.visibility-indicator { opacity: 50%; } diff --git a/src/littlesongplace/templates/playlist.html b/src/littlesongplace/templates/playlist.html index f7dff23..f7a8a60 100644 --- a/src/littlesongplace/templates/playlist.html +++ b/src/littlesongplace/templates/playlist.html @@ -15,7 +15,7 @@

Playlist by {{ username }} {% if session["userid"] == userid -%} - + [{% if private %}Private{% else %}Public{% endif %}] {%- endif %} diff --git a/src/littlesongplace/templates/profile.html b/src/littlesongplace/templates/profile.html index 43747f9..5240e89 100644 --- a/src/littlesongplace/templates/profile.html +++ b/src/littlesongplace/templates/profile.html @@ -157,7 +157,7 @@ {{ plist['name'] }} {% if session["userid"] == userid -%} - + [{% if plist['private'] %}Private{% else %}Public{% endif %}] {%- endif %} diff --git a/src/littlesongplace/templates/song-list.html b/src/littlesongplace/templates/song-list.html index 19784a4..20831c1 100644 --- a/src/littlesongplace/templates/song-list.html +++ b/src/littlesongplace/templates/song-list.html @@ -9,6 +9,7 @@

{% for song in songs %} + {%- if not (song.hidden and g.uiserid != song.userid) -%}
@@ -34,6 +35,7 @@
{{ song_details(song, current_user_playlists) | indent(8) }}
+ {%- endif -%} {% endfor %}
diff --git a/src/littlesongplace/templates/song-macros.html b/src/littlesongplace/templates/song-macros.html index 9711440..ad20a82 100644 --- a/src/littlesongplace/templates/song-macros.html +++ b/src/littlesongplace/templates/song-macros.html @@ -18,12 +18,13 @@ {% macro song_info(song) %}
- +
{{ song.title }} + {%- if song.hidden %}[Hidden]{% endif -%} +
-
- - -
+
-
+ {{ song_artist(song) | indent(4) }} diff --git a/test/test_jams.py b/test/test_jams.py index 855186e..e219115 100644 --- a/test/test_jams.py +++ b/test/test_jams.py @@ -4,6 +4,11 @@ import pytest from .utils import create_user, upload_song +# Shared timestamps +today = datetime.now(timezone.utc) +yesterday = (today - timedelta(days=1)).isoformat() +tomorrow = (today + timedelta(days=1)).isoformat() + @pytest.fixture def user(client): create_user(client, "user", login=True) @@ -218,10 +223,6 @@ def _assert_appear_in_order(page, values): 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) @@ -274,7 +275,30 @@ def test_jam_events_sorted_on_jam_info_page(client, user, jam): # Song Submissions ############################################################# def test_submit_song_to_event(client, user, jam, event): + # Song always visible to owner + upload_song(client, b"Success", eventid=event) + response = client.get(f"/jams/{jam}/events/{event}") + assert b"song title" in response.data + +def test_submitted_song_hidden_before_enddate(client, user, jam, event): + response = client.post( + f"/jams/{jam}/events/{event}/update", + data=_get_event_data(enddate=tomorrow), + follow_redirects=True) upload_song(client, b"Success", eventid=event) + client.get("/logout") # Log out to test public visibility + + response = client.get(f"/jams/{jam}/events/{event}") + assert b"song title" not in response.data + +def test_submitted_song_visible_after_enddate(client, user, jam, event): + response = client.post( + f"/jams/{jam}/events/{event}/update", + data=_get_event_data(enddate=yesterday), + follow_redirects=True) + upload_song(client, b"Success", eventid=event) + client.get("/logout") # Log out to test public visibility + response = client.get(f"/jams/{jam}/events/{event}") assert b"song title" in response.data