]> littlesong.place Git - littlesongplace.git/commitdiff
Add Jam and JamEvent objects
authorChris Fulljames <christianfulljames@gmail.com>
Fri, 11 Apr 2025 21:00:17 +0000 (17:00 -0400)
committerChris Fulljames <christianfulljames@gmail.com>
Fri, 11 Apr 2025 21:00:17 +0000 (17:00 -0400)
src/littlesongplace/auth.py
src/littlesongplace/jams.py
src/littlesongplace/templates/jam.html

index c886179bfa2bddc7ebaf2934de84cc8d6e78b7c8..174a5f273155ccda2f6339efec31c55bb7e282cc 100644 (file)
@@ -1,5 +1,5 @@
+import functools
 from datetime import datetime, timezone
-from functools import wraps
 
 import bcrypt
 from flask import Blueprint, render_template, redirect, flash, g, request, current_app, session
index 2eef2349524b33b0a50590a529bd595f6bfd5434..a3f0033596555e1ce7829f228240b88e6ef39d38 100644 (file)
@@ -1,8 +1,9 @@
+from dataclasses import dataclass
 from datetime import datetime, timezone
 
-from flask import Blueprint, g, render_template, url_for
+from flask import Blueprint, g, redirect, render_template, url_for
 
-from . import db
+from . import auth, db
 
 bp = Blueprint("jams", __name__, url_prefix="/jams")
 
@@ -12,7 +13,7 @@ def jams():
     ...
 
 @bp.get("/create")
-@requires_login
+@auth.requires_login
 def create():
     # Create a new jam and redirect to the edit form
     timestamp = datetime.now(timezone.utc).isoformat()
@@ -26,26 +27,28 @@ def create():
             one=True)
     db.commit()
     jamid = row["jamid"]
-    return redirect(url_for('jam', jamid=jamid))
+    return redirect(url_for('jams.jam', jamid=jamid))
 
 @bp.get("/<jamid>")
 def jam(jamid):
-    row = db.query("SELECT * FROM jams WHERE jamid = ?", [jamid], one=True)
+    row = db.query(
+            """
+            SELECT * FROM jams
+            INNER JOIN users ON jams.ownerid = users.userid
+            WHERE jamid = ?
+            """, [jamid], one=True)
+    jam = Jam.from_row(row)
     # Show the main jam page
-    return render_template(
-            "jam.html",
-            title=row["title"],
-            owner=row["userid"],
-            description=row["description"])
+    return render_template("jam.html", jam=jam)
 
 @bp.post("/<jamid>/update")
-@requires_login
+@auth.requires_login
 def update(jamid):
     # Update a jam with the new form data, redirect to view page
     ...
 
 @bp.get("/<jamid>/delete")
-@requires_login
+@auth.requires_login
 def delete(jamid):
     # Delete a jam, redirect to the jams list
     ...
@@ -56,7 +59,7 @@ def events(jamid):
     ...
 
 @bp.get("/<jamid>/events/create")
-@requires_login
+@auth.requires_login
 def events_create():
     # Create a new event and redirect to the edit form
     ...
@@ -67,14 +70,68 @@ def events_view(eventid):
     ...
 
 @bp.post("/<jamid>/events/<int:eventid>/update")
-@requires_login
+@auth.requires_login
 def events_update(jamid):
     # Update an event with the new form data
     ...
 
 @bp.get("/<jamid>/events/<int:eventid>/delete")
-@requires_login
+@auth.requires_login
 def events_delete(jamid):
     # Delete an event, redirect to list of all events
     ...
 
+@dataclass
+class Jam:
+    jamid: int
+    # TODO: User colors?
+    # TODO: User object?
+    ownerid: int
+    ownername: str
+    created: datetime
+    title: str
+    description: str
+    events: list
+
+    @classmethod
+    def from_row(cls, row):
+        event_rows = db.query("SELECT * FROM jam_events WHERE jamid = ?", [row["jamid"]])
+        events = [JamEvent.from_row(r) for r in event_rows]
+        return cls(
+                jamid=row["jamid"],
+                title=row["title"],
+                description=row["description"], # TODO: Sanitize
+                ownerid=row["userid"],
+                ownername=row["username"],
+                created=datetime.fromisoformat(row["created"]),
+                events=events,
+        )
+
+@dataclass
+class JamEvent:
+    eventid: int
+    jamid: int
+    threadid: int
+    created: datetime
+    title: str
+    startdate: datetime
+    enddate: datetime
+    description: str
+    # TODO: Comment object?
+    comments: list
+
+    @classmethod
+    def from_row(cls, row):
+        comments = db.query("SELECT * FROM comments WHERE threadid = ?", [row["threadid"]])
+        return cls(
+                eventid=row["eventid"],
+                jamid=row["jamid"],
+                threadid=row["threadid"],
+                created=datetime.fromisoformat(row["created"]),
+                title=row["title"],
+                startdate=datetime.fromisoformat(row["startdate"]),
+                enddate=datetime.fromisoformat(row["enddate"]),
+                description=row["description"], # TODO: Sanitize
+                # TODO: Comment object?
+                comments=comments,
+        )
index 9b1a0c813bc451d78d1adee3d02a65bc7b3c8a32..f6f5fe3f6b6a3c4db96399a53c85b341c1510146 100644 (file)
@@ -1,30 +1,23 @@
 {% extends "base.html" %}
 
-{% block title %}Jam{% endblock %}
+{% block title %}{{ jam.title }}{% endblock %}
 
 {% block body %}
 
-<h1>Jam Title: Event Title</h1>
+<h1>{{ jam.title }}</h1>
 
-<div>
-    <span><strong>Deadline:</strong></span> 2000-00-00
-</div>
-
-<h2>Description</h2>
 
 <div>
-Event Description.
-
-Lorem ipsum dolor sit amet...
+    <span><strong>Posted By:</strong></span> {{ jam.userid }}
 </div>
-
 <div>
-<button class="button">Submit a Song</button>
+    <span><strong>Deadline:</strong></span> {{ jam.enddate }}
 </div>
 
+<h2>Description</h2>
 
-<h2>Submitted Songs</h2>
-<p>
-(Shown only after jam deadline)
+<div>
+{{ jam.description }}
+</div>
 
 {% endblock %}