bearbeiten Button für admin angepasst, zusage funktion auch hinzugefügt
This commit is contained in:
+77
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user