Feat: Fotofilter + Fotobox/graf user

This commit is contained in:
2026-09-20 13:45:36 +00:00
parent c4960249b4
commit 77b549c960
7 changed files with 321 additions and 21 deletions
+57 -13
View File
@@ -212,6 +212,18 @@ DEFAULT_INVITATION_GROUPS = [
},
{"name": "Peter", "password": "Peter!Fest26#", "role": "guest", "members": ["Peter"]},
{"name": "Johanna", "password": "Joha!Fest26#", "role": "guest", "members": ["Johanna"]},
{
"name": "Fotograf",
"password": os.environ.get("PHOTOGRAPHER_PASSWORD", "Foto!Graf26#"),
"role": "guest",
"members": [],
},
{
"name": "Fotobox",
"password": os.environ.get("PHOTOBOOTH_PASSWORD", "Foto!Box26#"),
"role": "guest",
"members": [],
},
]
AGE_REQUIRED_NAMES = {"Lena", "Finn", "Fin", "Bruno"}
@@ -453,7 +465,15 @@ TEXTS = {
"gifts_caption": "Trommelwirbel... in unserer 70-Quadratmeter-Wohnung ist leider kein Platz mehr für Materielles.",
"gifts_text": "Also: Money! Ein finanzieller Beitrag zu unserer Reise nach der Hochzeit ist herzlich willkommen.",
"gallery_uploaded_by": "von {name}",
"gallery_uploaded_by_prefix": "von",
"gallery_empty": "Noch keine Bilder vorhanden.",
"gallery_filter_label": "Galerie nach Uploader filtern",
"gallery_filter_trigger": "Nach Uploader filtern:",
"gallery_filter_no_results": "Keine Bilder entsprechen den ausgewählten Filtern.",
"gallery_uploader_filter_label": "Uploader auswählen",
"gallery_uploader_all": "Alle",
"gallery_uploader_none": "Keine",
"gallery_uploader_selected": "{count} ausgewählt",
"gallery_image_alt": "Upload von {name}",
"gallery_save_hint": "Tipp: Halte das Bild länger gedrückt, um es in deiner Mediathek zu speichern.",
"flash_enter_group_name": "Bitte Gruppenname eingeben.",
@@ -727,7 +747,15 @@ TEXTS = {
"gifts_caption": "Drum roll... in our 70-square-meter apartment, we sadly have no room left for material things.",
"gifts_text": "So: Money! A financial contribution to our trip after the wedding is very welcome.",
"gallery_uploaded_by": "by {name}",
"gallery_uploaded_by_prefix": "by",
"gallery_empty": "No photos available yet.",
"gallery_filter_label": "Filter gallery by uploader",
"gallery_filter_trigger": "Filter by uploader:",
"gallery_filter_no_results": "No photos match the selected filters.",
"gallery_uploader_filter_label": "Select uploaders",
"gallery_uploader_all": "All",
"gallery_uploader_none": "None",
"gallery_uploader_selected": "{count} selected",
"gallery_image_alt": "Uploaded by {name}",
"gallery_save_hint": "Tip: Touch and hold the photo to save it to your photo library.",
"flash_enter_group_name": "Please enter group name.",
@@ -1081,12 +1109,15 @@ def init_db() -> None:
def seed_default_groups() -> None:
db = get_db()
existing = db.execute("SELECT COUNT(*) AS c FROM groups").fetchone()
if int(existing["c"] or 0) > 0:
return
now = datetime.utcnow().isoformat()
for entry in DEFAULT_INVITATION_GROUPS:
existing = db.execute(
"SELECT id FROM groups WHERE LOWER(name) = LOWER(?)",
(entry["name"],),
).fetchone()
if existing is not None:
continue
password_hash = generate_password_hash(entry["password"])
cursor = db.execute(
"INSERT INTO groups (name, password_hash, role, created_at) VALUES (?, ?, ?, ?)",
@@ -1104,13 +1135,14 @@ def seed_default_groups() -> None:
)
)
db.executemany(
"""
INSERT INTO group_members (group_id, name, requires_age, created_at)
VALUES (?, ?, ?, ?)
""",
member_rows,
)
if member_rows:
db.executemany(
"""
INSERT INTO group_members (group_id, name, requires_age, created_at)
VALUES (?, ?, ?, ?)
""",
member_rows,
)
db.commit()
@@ -1247,7 +1279,12 @@ def complete_onboarding():
@app.get("/gästebereich")
@login_required
def guest_area():
return render_template("guest_area.html")
db = get_db()
member_row = db.execute(
"SELECT 1 FROM group_members WHERE group_id = ? LIMIT 1",
(int(session["group_id"]),),
).fetchone()
return render_template("guest_area.html", has_rsvp_members=member_row is not None)
@app.route("/gastgeberbereich", methods=["GET"])
@@ -1322,6 +1359,9 @@ def rsvp():
(current_group_id,),
).fetchall()
if not members:
return redirect(url_for("guest_area"))
if request.method == "POST":
updates = []
for member in members:
@@ -1430,7 +1470,11 @@ def gallery():
ORDER BY uploads.id DESC
"""
).fetchall()
return render_template("gallery.html", images=images)
uploaders = sorted(
{str(image["uploaded_by_name"]) for image in images},
key=str.casefold,
)
return render_template("gallery.html", images=images, uploaders=uploaders)
@app.post("/gallery/delete/<int:image_id>")