bearbeiten Button für admin angepasst, zusage funktion auch hinzugefügt

This commit is contained in:
kai
2026-08-25 12:48:45 +02:00
parent 21e2265e2d
commit 310e0db080
5 changed files with 253 additions and 27 deletions
+77
View File
@@ -108,6 +108,17 @@ def ensure_schema():
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
)
""",
"""
CREATE TABLE IF NOT EXISTS concert_attendance (
concert_id INTEGER NOT NULL REFERENCES concerts(id) ON DELETE CASCADE,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
status VARCHAR(20) NOT NULL CHECK (
status IN ('attending', 'maybe', 'ticket_search')
),
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (concert_id, user_id)
)
""",
]
with get_db_connection() as connection:
@@ -1090,6 +1101,22 @@ def concert_detail(request: Request, concert_id: int):
)
photo_rows = cursor.fetchall()
cursor.execute(
"""
SELECT
concert_attendance.user_id,
concert_attendance.status,
users.display_name,
users.username
FROM concert_attendance
JOIN users ON users.id = concert_attendance.user_id
WHERE concert_attendance.concert_id = %s
ORDER BY users.display_name NULLS LAST, users.username
""",
(concert_id,),
)
attendance_rows = cursor.fetchall()
comments = [
{
"id": row[0],
@@ -1110,6 +1137,20 @@ def concert_detail(request: Request, concert_id: int):
for row in photo_rows
]
attendance = [
{
"user_id": row[0],
"status": row[1],
"name": row[2] or row[3],
}
for row in attendance_rows
]
attending_users = [item for item in attendance if item["status"] == "attending"]
current_attendance = next(
(item["status"] for item in attendance if item["user_id"] == user["id"]),
None,
)
template = templates.get_template("concert_detail.html")
return template.render(
user=user,
@@ -1118,6 +1159,9 @@ def concert_detail(request: Request, concert_id: int):
photos=photos,
can_edit=can_edit_concert(user, concert),
can_delete=can_delete_concert(user, concert),
current_attendance=current_attendance,
attending_users=attending_users,
attending_count=len(attending_users),
)
@@ -1404,6 +1448,39 @@ def delete_concert(request: Request, concert_id: int):
return RedirectResponse("/", status_code=303)
@app.post("/concerts/{concert_id}/attendance")
def set_attendance(
request: Request,
concert_id: int,
status: str = Form(...),
):
user = get_current_user(request)
if not user:
return login_redirect(f"/concerts/{concert_id}")
if status not in {"attending", "maybe", "ticket_search"}:
return HTMLResponse("<h1>Ungültige Auswahl</h1>", status_code=400)
if not load_concert(concert_id):
return HTMLResponse("<h1>Konzert nicht gefunden</h1>", status_code=404)
with get_db_connection() as connection:
with connection.cursor() as cursor:
cursor.execute(
"""
INSERT INTO concert_attendance (concert_id, user_id, status)
VALUES (%s, %s, %s)
ON CONFLICT (concert_id, user_id)
DO UPDATE SET
status = EXCLUDED.status,
updated_at = CURRENT_TIMESTAMP
""",
(concert_id, user["id"], status),
)
connection.commit()
return RedirectResponse(f"/concerts/{concert_id}#attendance", status_code=303)
@app.post("/concerts/{concert_id}/comments")
def add_comment(
request: Request,