feat: #out detection sets category=ausverkauft + Spieltitel-Extraktion
- WhatsApp-Webhook: Neue Nachrichten mit #out setzen category='ausverkauft', Spieltitel wird nach #out extrahiert (abgeschnitten an Satzzeichen/Trennern) - Thread-Append: #out in Folgenachrichten aktualisiert category + spiel_titel - Web-Form-Submit: #out im Text setzt category='ausverkauft' + extrahiert Titel - Fix: lokales 'import re' in api_submit entfernt (globale 're' reicht) - Frontend: Filter-Dropdown zeigt 'ausverkauft' dynamisch, Badge auf Karten + Detailseite
This commit is contained in:
@@ -596,6 +596,14 @@ def whatsapp_webhook():
|
||||
else:
|
||||
content = f"[{msg_type}]"
|
||||
|
||||
# #out detection: set category to "ausverkauft" and extract game title
|
||||
if "#out" in content.lower():
|
||||
category_override = "ausverkauft"
|
||||
idx = content.lower().find("#out")
|
||||
after = content[idx + 4:].strip()
|
||||
if after:
|
||||
spiel_titel = re.split(r'[.!?\n]| - | – | — | ist | war | in ', after, maxsplit=1)[0].strip()[:200]
|
||||
|
||||
# GDPR: "Meine Daten löschen" trigger
|
||||
if msg_type == "text" and content.strip().lower() == "meine daten löschen":
|
||||
_gdpr_delete_sender(db, sender_id)
|
||||
@@ -649,6 +657,17 @@ def whatsapp_webhook():
|
||||
"UPDATE submissions SET content=?, halle=?, created_at=CURRENT_TIMESTAMP WHERE id=?",
|
||||
(new_content, new_halle, recent["id"]),
|
||||
)
|
||||
# Check for #out in appended content — update category + spiel_titel
|
||||
if "#out" in content.lower():
|
||||
out_title = None
|
||||
idx = content.lower().find("#out")
|
||||
after = content[idx + 4:].strip()
|
||||
if after:
|
||||
out_title = re.split(r'[.!?\n]| - | – | — | ist | war | in ', after, maxsplit=1)[0].strip()[:200]
|
||||
db.execute(
|
||||
"UPDATE submissions SET category=?, spiel_titel=? WHERE id=?",
|
||||
("ausverkauft", out_title, recent["id"]),
|
||||
)
|
||||
# Merge media paths (keep all, separated by ||)
|
||||
if media_path:
|
||||
merged_media = media_path
|
||||
@@ -3040,18 +3059,27 @@ def api_submit():
|
||||
# Validate halle
|
||||
halle_valid = None
|
||||
if halle:
|
||||
import re
|
||||
if re.match(r'^H[1-7]\s*[A-Z]\d{1,4}$', halle, re.IGNORECASE):
|
||||
halle_valid = halle.upper()
|
||||
|
||||
sender_id = 'web_' + (name.replace(' ', '_') if name else 'anonym')
|
||||
sender_name = name or None
|
||||
|
||||
# #out detection for web form
|
||||
category = None
|
||||
if text and "#out" in text.lower():
|
||||
category = "ausverkauft"
|
||||
if not spiel_titel:
|
||||
idx = text.lower().find("#out")
|
||||
after = text[idx + 4:].strip()
|
||||
if after:
|
||||
spiel_titel = re.split(r'[.!?\n]| - | – | — | ist | war | in ', after, maxsplit=1)[0].strip()[:200]
|
||||
|
||||
db.execute(
|
||||
"""INSERT INTO submissions
|
||||
(channel, sender_id, sender_name, type, content, media_path, status, halle, spiel_titel)
|
||||
VALUES (?, ?, ?, ?, ?, ?, 'new', ?, ?)""",
|
||||
('web', sender_id, sender_name, msg_type, text or None, media_path, halle_valid, spiel_titel or None),
|
||||
(channel, sender_id, sender_name, type, content, media_path, status, halle, category, spiel_titel)
|
||||
VALUES (?, ?, ?, ?, ?, ?, 'new', ?, ?, ?)""",
|
||||
('web', sender_id, sender_name, msg_type, text or None, media_path, halle_valid, category, spiel_titel or None),
|
||||
)
|
||||
db.commit()
|
||||
sub_id = db.execute("SELECT last_insert_rowid()").fetchone()[0]
|
||||
|
||||
Reference in New Issue
Block a user