Neue Features>: zu viele um sie zu beschrieben :D

This commit is contained in:
2026-02-22 16:36:37 +00:00
parent 396055a705
commit 9e2716ba9c
19 changed files with 1269 additions and 249 deletions

View File

@@ -12,8 +12,7 @@
<body>
<header class="topbar">
<div>
<a class="brand" href="{{ url_for('dashboard') if guest_name else url_for('landing') }}">{{ t('brand') }}</a>
<div class="host">{{ request.host }}</div>
<a class="brand" href="{{ url_for('welcome') if guest_name else url_for('landing') }}">{{ t('brand') }}</a>
</div>
<div class="toolbar">
<form method="post" action="{{ url_for('set_lang', code='de') }}">
@@ -41,5 +40,10 @@
{% block content %}{% endblock %}
</main>
<footer class="site-footer">
<a href="{{ url_for('datenschutz') }}">{{ t('privacy') }}</a>
<a href="{{ url_for('impressum') }}">{{ t('imprint') }}</a>
</footer>
</body>
</html>

View File

@@ -0,0 +1,225 @@
{% extends 'base.html' %}
{% block content %}
<section class="legal-page card" lang="{{ lang }}">
{% if lang == 'en' %}
<header class="legal-header">
<h1>Privacy Policy</h1>
<p>This privacy policy explains how personal data is processed when you use this website.</p>
<p><strong>{{ t('legal_de_authoritative') }}</strong></p>
</header>
<article class="legal-section">
<h2>Controller</h2>
<p>
Dominic Thiels, Wiesbadener Strasse 70b, 65510 Idstein, Germany<br />
Phone: +49 151 70616118<br />
Email: <a href="mailto:d.thiels@freenet.de">d.thiels@freenet.de</a>
</p>
</article>
<article class="legal-section">
<h2>Data Processed During Website Access</h2>
<p>When you visit this website, technical access data may be processed, including IP address, request date/time, transmitted data volume, referrer, browser type/version, and operating system.</p>
<p>Legal basis: Art. 6(1)(f) GDPR (legitimate interest in secure and stable operation of the website).</p>
</article>
<article class="legal-section">
<h2>Cookies</h2>
<p>Only technically necessary cookies are used to maintain the website and user session. No tracking cookies are used.</p>
</article>
<article class="legal-section">
<h2>Google Maps</h2>
<p>Google Maps is only loaded after an explicit user click on the location page. Once activated, data such as your IP address may be transferred to Google.</p>
<p>More information: <a href="https://policies.google.com/privacy" target="_blank" rel="noopener">Google Privacy Policy</a></p>
</article>
<article class="legal-section">
<h2>Photo Uploads</h2>
<p>When guests upload photos, the uploaded file, optional metadata, and technical access data may be processed to provide the shared wedding gallery.</p>
</article>
<article class="legal-section">
<h2>Your Rights</h2>
<p>Under GDPR, you may have rights of access, rectification, erasure, restriction, portability, objection, and the right to lodge a complaint with a supervisory authority.</p>
</article>
{% else %}
<header class="legal-header">
<h1>Datenschutzerklärung</h1>
<p>
In dieser Datenschutzerklärung informieren wir Sie über die Verarbeitung personenbezogener Daten bei der Nutzung
dieser Website.
</p>
</header>
<article class="legal-section" id="verantwortlicher">
<h2>Verantwortlicher</h2>
<p>
Verantwortlich für die Datenverarbeitung ist:<br />
Dominic Thiels, Wiesbadener Straße 70b, 65510 Idstein, +49 151 70616118 und
<a href="mailto:d.thiels@freenet.de">d.thiels@freenet.de</a>
</p>
</article>
<article class="legal-section" id="personenbezogene-daten">
<h2>Personenbezogene Daten</h2>
<p>
Personenbezogene Daten sind alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche
Person (betroffene Person) beziehen. Als identifizierbar wird eine natürliche Person angesehen, die direkt oder
indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem Namen, zu einer Kennnummer, zu Standortdaten,
zu einer Online-Kennung oder zu einem oder mehreren besonderen Merkmalen identifiziert werden kann, die Ausdruck
der physischen, physiologischen, genetischen, psychischen, wirtschaftlichen, kulturellen oder sozialen Identität
dieser natürlichen Person sind.
</p>
</article>
<article class="legal-section" id="daten-beim-websiteaufruf">
<h2>Daten beim Websiteaufruf</h2>
<p>
Wenn Sie diese Website nur nutzen, um sich zu informieren und keine Daten angeben, dann verarbeiten wir nur die
Daten, die zur Anzeige der Website auf dem von Ihnen verwendeten internetfähigen Gerät erforderlich sind. Das sind
insbesondere:
</p>
<ul>
<li>IP-Adresse</li>
<li>Datum und Uhrzeit der Anfrage</li>
<li>jeweils übertragene Datenmenge</li>
<li>die Website, von der die Anforderung kommt</li>
<li>Browsertyp und Browserversion</li>
<li>Betriebssystem</li>
</ul>
<p>
Rechtsgrundlage für die Verarbeitung dieser Daten sind berechtigte Interessen gemäß Art. 6 Abs. 1 lit. f DSGVO, um
die Darstellung der Website grundsätzlich zu ermöglichen.
</p>
<p>
Darüber hinaus können Sie verschiedene Leistungen auf der Website nutzen, bei der weitere personenbezogene und
nicht personenbezogene Daten verarbeitet werden.
</p>
</article>
<article class="legal-section" id="rechte-der-betroffenen">
<h2>Ihre Rechte</h2>
<p>Als betroffene Person haben Sie folgende Rechte:</p>
<ul>
<li>Auskunft über die Sie betreffenden personenbezogenen Daten (Art. 15 DSGVO)</li>
<li>Berichtigung unrichtiger oder unvollständiger Daten (Art. 16 DSGVO)</li>
<li>Löschung (Art. 17 DSGVO)</li>
<li>Einschränkung der Verarbeitung (Art. 18 DSGVO)</li>
<li>Datenübertragbarkeit (Art. 20 DSGVO)</li>
<li>Widerspruch gegen die Verarbeitung (Art. 21 DSGVO)</li>
<li>
Nicht einer ausschließlich automatisierten Entscheidung (einschließlich Profiling) unterworfen zu werden
(Art. 22 DSGVO)
</li>
<li>
Beschwerderecht bei einer Aufsichtsbehörde (Art. 77 DSGVO). Zuständig ist die Aufsichtsbehörde an Ihrem üblichen
Aufenthaltsort, Arbeitsplatz oder am Ort des vermuteten Verstoßes.
</li>
</ul>
</article>
<article class="legal-section" id="cookies">
<h2>Einsatz von Cookies</h2>
<p>
Beim Besuch der Website können Cookies auf Ihrem Gerät gespeichert werden. Cookies sind kleine Textdateien, die
von dem von Ihnen verwendeten Browser gespeichert werden. Cookies können keine Programme ausführen und auch keine
Viren auf Ihr Gerät übertragen. Die Stelle, die den Cookie setzt, kann darüber jedoch bestimmte Informationen
erhalten. So kann mithilfe von Cookies insbesondere das Gerät, mit dem diese Website aufgerufen wurde, bei einem
erneuten Aufruf erkannt werden.
</p>
<p>
Durch die Browsereinstellungen lässt sich das Setzen von Cookies einschränken oder verhindern. So kann z. B. nur
die Annahme von Cookies, die von Drittanbietern stammen, blockiert werden oder aber auch die Annahme von allen
Cookies. Durch das Blockieren sind jedoch möglicherweise nicht mehr alle Funktionen dieser Website nutzbar. Im
weiteren Text dieser Datenschutzerklärung informieren wir Sie konkret, an welchen Stellen und zu welchen Zwecken
Cookies auf den Seiten zum Einsatz kommen.
</p>
<p>
<strong>
Es werden ausschließlich technisch notwendige Cookies verwendet, die für den Betrieb der Website und die
Aufrechterhaltung der Benutzersitzung erforderlich sind.
</strong>
</p>
</article>
<article class="legal-section" id="google-maps">
<h2>Google Maps</h2>
<p>
Auf dieser Website ist ein Dienst der Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland,
eingebunden, um geographische Informationen visuell darzustellen (Google Maps).
</p>
<p>
Bei der Nutzung von Google Maps werden Informationen über die Nutzung dieser Website einschließlich Ihrer
IP-Adresse an Server von Google übertragen und dort gespeichert. Diese Server können sich auch in den USA
befinden. Google kann diese Informationen gegebenenfalls an Dritte übertragen, sofern dies gesetzlich vorgeschrieben
ist oder soweit Dritte diese Daten im Auftrag von Google verarbeiten.
</p>
<p>
Die Nutzung von Google Maps erfolgt im Interesse einer ansprechenden Darstellung der Veranstaltungsorte sowie einer
leichten Auffindbarkeit der auf der Website angegebenen Orte. Dies stellt ein berechtigtes Interesse im Sinne von
Art. 6 Abs. 1 lit. f DSGVO dar.
</p>
<p>
Sofern eine entsprechende Einwilligung abgefragt wird (z. B. über ein Cookie-Banner), erfolgt die Verarbeitung
ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO. Die Einwilligung kann jederzeit widerrufen werden.
</p>
<p>
Weitere Informationen zur Datenverarbeitung durch Google finden Sie in der Datenschutzerklärung von Google:
<a href="https://policies.google.com/privacy" target="_blank" rel="noopener">https://policies.google.com/privacy</a>
</p>
</article>
<article class="legal-section" id="foto-upload">
<h2>Upload von Fotos durch Nutzer</h2>
<p>
Auf dieser Website besteht die Möglichkeit, Fotos hochzuladen, beispielsweise im Rahmen einer gemeinsamen
Hochzeitsgalerie.
</p>
<p>Beim Hochladen von Fotos werden folgende personenbezogene Daten verarbeitet:</p>
<ul>
<li>die hochgeladene Bilddatei</li>
<li>
gegebenenfalls enthaltene Metadaten (z. B. Aufnahmedatum, Kamerainformationen oder gegebenenfalls
Standortdaten/GPS-Koordinaten)
</li>
<li>der vom Nutzer angegebene Name (sofern vorgesehen)</li>
<li>technische Zugriffsdaten (z. B. IP-Adresse, Zeitpunkt des Uploads)</li>
</ul>
<p>
Die Verarbeitung erfolgt zum Zweck der Bereitstellung einer gemeinsamen Fotogalerie für Gäste der Veranstaltung.
Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO (Erfüllung der Nutzungsfunktion der Website) sowie Art. 6 Abs. 1
lit. f DSGVO (berechtigtes Interesse an der Bereitstellung einer gemeinsamen Erinnerungsplattform).
</p>
<p>
Es wird darauf hingewiesen, dass hochgeladene Fotos personenbezogene Daten Dritter enthalten können (z. B.
Abbildungen von Personen). Der hochladende Nutzer ist dafür verantwortlich, dass die Veröffentlichung dieser Bilder
datenschutzrechtlich zulässig ist und insbesondere die Einwilligung der abgebildeten Personen vorliegt.
</p>
<p>
Die Fotos werden ausschließlich für den vorgesehenen Zweck gespeichert und nicht an Dritte weitergegeben, sofern
keine gesetzliche Verpflichtung besteht.
</p>
</article>
<footer class="legal-footer">
<p><small>Quelle: Muster-Datenschutzerklärung von anwalt.de</small></p>
</footer>
{% endif %}
</section>
{% endblock %}

View File

@@ -7,14 +7,14 @@
{% for image in images %}
<figure class="gallery-item">
<a href="{{ url_for('serve_upload', filename=image['filename']) }}" target="_blank" rel="noopener">
<img src="{{ url_for('serve_upload', filename=image['filename']) }}" alt="Upload von {{ image['uploaded_by'] }}" loading="lazy" />
<img src="{{ url_for('serve_upload', filename=image['filename']) }}" alt="{{ t('gallery_image_alt').format(name=image['uploaded_by']) }}" loading="lazy" />
</a>
<figcaption>von {{ image['uploaded_by'] }}</figcaption>
<figcaption>{{ t('gallery_uploaded_by').format(name=image['uploaded_by']) }}</figcaption>
</figure>
{% endfor %}
</div>
{% else %}
<p>Noch keine Bilder vorhanden.</p>
<p>{{ t('gallery_empty') }}</p>
{% endif %}
</section>
{% endblock %}

View File

@@ -1,8 +1,8 @@
{% extends 'base.html' %}
{% block content %}
<section class="card">
<h1>{{ t('dashboard') }}</h1>
<p>Hallo {{ guest_name }}.</p>
<h1>{{ t('guest_area') }}</h1>
<p>{{ t('hello_guest').format(name=guest_name) }}</p>
</section>
<section class="card-grid">
@@ -13,5 +13,6 @@
<a class="card link-card" href="{{ url_for('info', page='hotels') }}">{{ t('hotels') }}</a>
<a class="card link-card" href="{{ url_for('info', page='taxi') }}">{{ t('taxi') }}</a>
<a class="card link-card" href="{{ url_for('info', page='location') }}">{{ t('location') }}</a>
<a class="card link-card" href="{{ url_for('host_area') }}">{{ t('host_area') }}</a>
</section>
{% endblock %}

View File

@@ -0,0 +1,80 @@
{% extends 'base.html' %}
{% block content %}
<section class="card">
<h1>{{ t('host_access_title') }}</h1>
<p>{{ t('host_access_note') }}</p>
</section>
{% if not unlocked %}
<section class="card form-card">
<form method="post" action="{{ url_for('host_area') }}" class="form-grid">
<label>
{{ t('host_password') }}
<input type="password" name="host_password" required />
</label>
<button class="btn" type="submit">{{ t('host_access_submit') }}</button>
</form>
</section>
{% else %}
<section class="stats-grid">
<article class="card stat-card">
<h2>{{ t('total_guests') }}</h2>
<p>{{ stats.total_guests }}</p>
</article>
<article class="card stat-card">
<h2>{{ t('attending_yes') }}</h2>
<p>{{ stats.attending_yes }}</p>
</article>
<article class="card stat-card">
<h2>{{ t('attending_no') }}</h2>
<p>{{ stats.attending_no }}</p>
</article>
<article class="card stat-card">
<h2>{{ t('attending_open') }}</h2>
<p>{{ stats.attending_open }}</p>
</article>
<article class="card stat-card">
<h2>{{ t('plus_one_total') }}</h2>
<p>{{ stats.plus_one_total }}</p>
</article>
</section>
<section class="card">
<h2>{{ t('host_stats_title') }}</h2>
<div class="table-wrap">
<table class="guest-table">
<thead>
<tr>
<th>{{ t('host_table_name') }}</th>
<th>{{ t('host_table_status') }}</th>
<th>{{ t('host_table_plus_one') }}</th>
</tr>
</thead>
<tbody>
{% for guest in guests %}
<tr>
<td>{{ guest["name"] }}</td>
<td>
{% if guest["attending"] == 1 %}
{{ t('status_yes') }}
{% elif guest["attending"] == 0 %}
{{ t('status_no') }}
{% else %}
{{ t('status_open') }}
{% endif %}
</td>
<td>
{% if guest["attending"] == 1 and guest["plus_one"] == 1 %}
{{ t('yes') }}
{% else %}
{{ t('no') }}
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</section>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,63 @@
{% extends 'base.html' %}
{% block content %}
<section class="legal-page card" lang="{{ lang }}">
{% if lang == 'en' %}
<h1>Imprint</h1>
<p>Information according to Section 5 DDG.</p>
<p><strong>{{ t('legal_de_authoritative') }}</strong></p>
<h2>Provider</h2>
<p>
Dominic Thiels<br />
Wiesbadener Strasse 70b<br />
65510 Idstein<br />
Germany
</p>
<h2>Represented by</h2>
<p>Dominic Thiels</p>
<h2>Contact</h2>
<p>
Phone: +49 151 70616118<br />
Email: <a href="mailto:d.thiels@freenet.de">d.thiels@freenet.de</a>
</p>
<h2>Consumer Dispute Resolution</h2>
<p>We do not participate in dispute resolution proceedings before a consumer arbitration board and are not obliged to do so.</p>
<h2>Liability for Content</h2>
<p>The contents of this website were created with due care. However, no guarantee is given for correctness, completeness or timeliness.</p>
<h2>Liability for Links</h2>
<p>This website contains links to external third-party websites. We have no influence on their contents. The respective provider is responsible for those contents.</p>
<h2>Copyright</h2>
<p>The content created by the site operator is subject to German copyright law. Any use beyond statutory limits requires prior written consent.</p>
{% else %}
<h1>Impressum</h1>
<p>Angaben gemäß § 5 DDG</p>
<p>Dominic Thiels<br>
<br>
Wiesbadener Straße 70b<br>
65510 Idstein <br>
</p>
<p> <strong>Vertreten durch: </strong><br>
Dominic Thiels<br>
</p>
<p><strong>Kontakt:</strong> <br>
Telefon: +49-151 70616118<br>
E-Mail: <a>d.thiels@freenet.de</a></br></p>
<p><strong>Verbraucherstreitbeilegung / Universalschlichtungsstelle</strong>
<br>Wir nehmen nicht an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teil und sind dazu auch nicht verpflichtet.
</p>
<p><strong>Haftungsausschluss: </strong>
<br><br><strong>Haftung für Inhalte</strong><br>
Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 DDG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 DDG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.<br><br><strong>Haftung für Links</strong><br>
Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.<br><br><strong>Urheberrecht</strong><br>
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.</p>
<p>Erstellt mit dem <a href="https://impressum-generator.de" rel="dofollow">Impressum-Generator</a> von WebsiteWissen.com, dem Ratgeber für <a href="https://websitewissen.com/website-erstellen" rel="dofollow">Website-Erstellung</a>, <a href="https://websitewissen.com/homepage-baukasten-vergleich" rel="dofollow">Homepage-Baukästen</a> und <a href="https://websitewissen.com/shopsysteme-vergleich" rel="dofollow">Shopsysteme</a>. Rechtstext von der <a href="https://www.kanzlei-hasselbach.de/" rel="dofollow">Kanzlei Hasselbach</a>.
</p>
{% endif %}
</section>
{% endblock %}

View File

@@ -9,11 +9,11 @@
</h1>
{% if page == 'schedule' %}
<p>15:00 Trauung, 17:00 Empfang, 19:00 Dinner.</p>
<p>{{ t('schedule_text') }}</p>
{% elif page == 'hotels' %}
<p>Empfehlungen folgen. Bitte frühzeitig buchen.</p>
<p>{{ t('hotels_text') }}</p>
{% elif page == 'taxi' %}
<p>Taxi-Service: 01234 / 567890 (24/7).</p>
<p>{{ t('taxi_text') }}</p>
{% elif page == 'location' %}
<p><strong>{{ location_name }}</strong></p>
<p>{{ location_address }}</p>

View File

@@ -2,7 +2,7 @@
{% block content %}
<section class="hero card">
<h1>{{ t('subtitle') }}</h1>
<p>Passwortgeschützter Zugriff für unsere Gäste.</p>
<p>{{ t('login_note') }}</p>
</section>
<section class="card form-card">

View File

@@ -0,0 +1,13 @@
{% extends 'base.html' %}
{% block content %}
<section class="hero-banner" aria-label="{{ t('hero_headline') }}" style="--hero-image: url('{{ hero_image_url }}');">
<div class="hero-overlay">
{% if wedding_date %}
<p class="hero-kicker">{{ wedding_date }}</p>
{% endif %}
<h1>{{ t('hero_headline') }}</h1>
<p>{{ t('hero_text') }}</p>
<a class="btn hero-cta" href="{{ url_for('guest_area') }}">{{ t('to_guest_area') }}</a>
</div>
</section>
{% endblock %}