diff --git a/app.py b/app.py index 88d6b1f..9566255 100755 --- a/app.py +++ b/app.py @@ -685,6 +685,7 @@ def add_customer(): success = None logo_urls = [None, None, None] customer_names = ["", "", ""] + contacts = ["", "", ""] site = request.args.get("site") or request.form.get("site") or "" # Fallback auf ersten für den User zugänglichen Standort @@ -703,6 +704,11 @@ def add_customer(): request.form.get("customer_name_2", "").strip(), request.form.get("customer_name_3", "").strip(), ] + contacts = [ + request.form.get("contact_1", "").strip(), + request.form.get("contact_2", "").strip(), + request.form.get("contact_3", "").strip(), + ] filled_names = [n for n in customer_names if n] print(f"🔍 APP.PY - Suche nach Kunden: {filled_names} (site: {site})") @@ -725,6 +731,14 @@ def add_customer(): else: valid_names = [n for n, l in valid] valid_urls = [l for n, l in valid] + valid_contacts = [] + for name in valid_names: + for i, cn in enumerate(customer_names): + if cn == name: + valid_contacts.append(contacts[i] if i < len(contacts) else "") + break + else: + valid_contacts.append("") for i, name in enumerate(customer_names): for j, (vn, vu) in enumerate(zip(valid_names, valid_urls)): if vn == name: @@ -732,14 +746,14 @@ def add_customer(): break bg_url = get_background_url(site) - html_filename = generate_welcome_page.save_welcome_page(valid_names, valid_urls, site=site, background_url=bg_url) + html_filename = generate_welcome_page.save_welcome_page(valid_names, valid_urls, contacts=valid_contacts, site=site, background_url=bg_url) if html_filename: if generate_welcome_page.add_customer_to_lobby_playlist(html_filename, site=site): # Letzte Kundendaten für Background-Update speichern config = load_config() site_cfg = config.setdefault("sites", {}).setdefault(site, {}) - site_cfg["welcome_data"] = {"names": valid_names, "logo_urls": valid_urls} + site_cfg["welcome_data"] = {"names": valid_names, "logo_urls": valid_urls, "contacts": valid_contacts} save_config(config) add_history_entry("customer_added", f"Kunden ({', '.join(valid_names)}) zur Willkommensseite an Standort '{site}' hinzugefügt", current_user.email) success = f"✅ Willkommensseite mit {len(valid_names)} Kunden erstellt!" @@ -755,12 +769,17 @@ def add_customer(): config = load_config() site_list = get_site_list(config) background_url = get_background_url(site) + welcome_data = config.get("sites", {}).get(site, {}).get("welcome_data", {}) + saved_contacts = welcome_data.get("contacts", ["", "", ""]) + if not contacts: + contacts = saved_contacts return render_template( "customer.html", error=error, success=success, logo_urls=logo_urls, customer_names=customer_names, + contacts=contacts, site=site, site_list=site_list, current_site=site, @@ -804,7 +823,9 @@ def api_add_customer(): if not logo_url: return jsonify({"error": "Logo not found"}), 400 - html_filename = generate_welcome_page.save_welcome_page(customer_name, logo_url, site=site) + contact = data.get("contact", "").strip() + + html_filename = generate_welcome_page.save_welcome_page([customer_name], [logo_url], contacts=[contact], site=site) if not html_filename: return jsonify({"error": "Failed to create welcome page"}), 500 diff --git a/generate_welcome_page.py b/generate_welcome_page.py index f1f83be..626a51f 100644 --- a/generate_welcome_page.py +++ b/generate_welcome_page.py @@ -97,14 +97,26 @@ def search_customer_logo(customer_name): # HTML-Generierung # ------------------------------------------------- -def generate_welcome_html(customer_names, logo_urls, site="stuttgart", background_url=None): +def md_to_html(text): + """Wandelt einfaches Markdown in HTML um (fett, kursiv, code, zeilenumbrüche).""" + import re + text = re.sub(r'\*\*(.+?)\*\*', r'\1', text) + text = re.sub(r'\*(.+?)\*', r'\1', text) + text = re.sub(r'`(.+?)`', r'\1', text) + lines = text.split('\n') + return '
'.join(line.strip() for line in lines) + + +def generate_welcome_html(customer_names, logo_urls, contacts=None, site="stuttgart", background_url=None): """ Generiert den HTML-Code für die Willkommensseite. - - Links oben: CANCOM-Logo + "meets" + Kundenlogos (280px Breite) - - Rechts unten: "Herzlich Willkommen in unserer Niederlassung {Standort}" + - Links oben: CANCOM-Logo + "meets" + Kundenlogos + - Unter jedem Logo: Ansprechpartner-Kontaktdaten (Landscape) + - Portrait: Kontaktdaten links neben den Logos customer_names: Liste der Kundennamen (max. 3) logo_urls: Liste der Logo-URLs (gleiche Reihenfolge) + contacts: Liste der Ansprechpartner-Texte (Markdown, optional) site: Standort-Name für die Anzeige background_url: URLs zum Hintergrundbild (None → Standard-Wallpaper) """ @@ -113,15 +125,25 @@ def generate_welcome_html(customer_names, logo_urls, site="stuttgart", backgroun print(f"✅ Generate - Willkommensseite wird generiert für: {names_str} (site: {site})") site_display = site.capitalize() + if contacts is None: + contacts = [""] * len(customer_names) + bg_image = background_url if background_url else "/static/wallpaper.png" cancom_svg = '''''' logo_html = "" for i, (name, url) in enumerate(zip(customer_names, logo_urls)): if url: + contact_html = "" + if i < len(contacts) and contacts[i]: + contact_html = f'''
{md_to_html(contacts[i])}
''' logo_html += f'''
+
+ {name} + {contact_html} +
''' html_content = f""" @@ -165,13 +187,13 @@ def generate_welcome_html(customer_names, logo_urls, site="stuttgart", backgroun }} .customer-logos {{ display: flex; flex-direction: row; - align-items: center; justify-content: flex-end; + align-items: flex-start; justify-content: flex-end; gap: 48px; max-width: 100%; }} .customer-logo-item {{ flex: 0 0 280px; - display: flex; align-items: center; justify-content: center; - min-height: 100px; + display: flex; flex-direction: column; + align-items: center; justify-content: flex-start; }} .customer-logo {{ width: 100%; height: auto; @@ -179,15 +201,40 @@ def generate_welcome_html(customer_names, logo_urls, site="stuttgart", backgroun object-fit: contain; filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.15)); }} + .customer-name {{ + font-size: 1rem; font-weight: 600; color: #000; + margin-top: 8px; text-align: center; + }} + .contact-info {{ + font-size: 0.85rem; color: #333; line-height: 1.5; + margin-top: 6px; text-align: center; + }} + .contact-info strong {{ color: #000; }} + .contact-info code {{ + font-size: 0.8rem; padding: 1px 4px; + background: rgba(0,0,0,0.06); border-radius: 3px; + }} @media (orientation: portrait) {{ .customer-logos {{ - flex-direction: column; gap: 24px; + flex-direction: column; gap: 20px; }} .customer-logo-item {{ - flex: 0 0 200px; + flex: 0 0 auto; + flex-direction: row; gap: 20px; + width: 100%; max-width: 600px; }} .customer-logo {{ - max-height: 120px; + max-height: 100px; width: 180px; flex-shrink: 0; + }} + .customer-name {{ + margin-top: 0; text-align: left; + }} + .contact-info {{ + text-align: left; + }} + .customer-meta {{ + display: flex; flex-direction: column; + align-items: flex-start; flex: 1; }} }} .content {{ @@ -226,15 +273,16 @@ def generate_welcome_html(customer_names, logo_urls, site="stuttgart", backgroun # Speichern + Playlist-Einfügung # ------------------------------------------------- -def save_welcome_page(customer_names, logo_urls, site="stuttgart", background_url=None): +def save_welcome_page(customer_names, logo_urls, contacts=None, site="stuttgart", background_url=None): """Speichert die generierte Willkommensseite als welcome.html im Lobby-Verzeichnis. + contacts: Liste der Ansprechpartner-Texte (Markdown, optional) background_url: Benutzerdefiniertes Hintergrundbild oder None (Standard). Gibt den Dateinamen zurück oder None bei Fehler.""" try: welcome_dir = os.path.join(MEDIA_DIR, site, "lobby") os.makedirs(welcome_dir, exist_ok=True) filepath = os.path.join(os.path.abspath(welcome_dir), WELCOME_FILENAME) - html_content = generate_welcome_html(customer_names, logo_urls, site=site, background_url=background_url) + html_content = generate_welcome_html(customer_names, logo_urls, contacts=contacts, site=site, background_url=background_url) with open(filepath, "w", encoding="utf-8") as f: f.write(html_content) diff --git a/history.json b/history.json index afb53ec..83bda1a 100644 --- a/history.json +++ b/history.json @@ -1,4 +1,10 @@ [ + { + "timestamp": "2026-07-02 12:25:24", + "action": "user_login", + "detail": "User 'admin' angemeldet", + "user": "admin" + }, { "timestamp": "2026-06-28 16:04:39", "action": "user_login", diff --git a/templates/customer.html b/templates/customer.html index 8773afa..392cdc7 100644 --- a/templates/customer.html +++ b/templates/customer.html @@ -129,24 +129,34 @@ + +
+ +
+ +

Das System sucht automatisch nach den Kundenlogos

und erstellt eine angepasste Willkommensseite für die Lobby-Playlist.

+

Ansprechpartner unterstützen fett, kursiv und Code sowie Zeilenumbrüche.