add privacy/impress/foo

This commit is contained in:
Lea 2024-10-12 21:39:20 +02:00
parent 19c1d989f3
commit 8f6d9130f0
6 changed files with 340 additions and 110 deletions

11
app.py
View File

@ -75,5 +75,16 @@ def about():
return render_template("about.html")
# TODO: Fix layout of privacy
@app.route('/privacy')
def privacy():
return render_template("privacy.html")
@app.route('/impress')
def impress():
return render_template("impress.html")
if __name__ == "__main__":
app.run()

View File

@ -1,6 +1,7 @@
from wtforms import Form, StringField, validators
from wtforms.fields.choices import SelectMultipleField, RadioField
from wtforms.fields.numeric import IntegerField
from wtforms.fields.simple import BooleanField
from wtforms.widgets.core import CheckboxInput, ListWidget, Input
@ -83,4 +84,4 @@ class SearchForm(Form):
validators=[validators.InputRequired(), validators.NumberRange(min=1, max=4)]
)
# TODO: DSE akzeptieren
privacy_agreement = BooleanField("Datenschutz", validators=[validators.InputRequired()])

View File

@ -17,8 +17,8 @@
<a class="mx-2" href="/about">About</a>
</div>
<div class="flex justify-right">
<a class="mx-2" href="https://www.binary-kitchen.de/wiki/datenschutz">Datenschutz</a>
<a class="mx-2" href="https://www.binary-kitchen.de/wiki/impressum">Impressum</a>
<a class="mx-2" href="/privacy">Datenschutz</a>
<a class="mx-2" href="/impress">Impressum</a>
</div>
</nav>

30
templates/impress.html Normal file
View File

@ -0,0 +1,30 @@
{% extends "base.html" %}
{% block content %}
<div class="container mx-auto px-4 py-6">
<div class="flex flex-col">
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Impressum</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
theraPy
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Lea Laux
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
c/o Binary Kitchen e.V.
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Walderdorffstraße 13b
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
93053 Regensburg
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
therapy-jetzt@binary-kitchen.de
</p>
</div>
</div>
{% endblock %}

View File

@ -3,121 +3,142 @@
{% block content %}
<div class="container mx-auto p-4">
<div class="space-y-2 mb-3 my-6">
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
TheraPy hilft dir, Telefonzeiten für psychotherapeutische Angebote basierend auf den Daten der 116 117
Arztsuche der kassenärztlichen Vereinigung zu finden.
Mit dem gewünschten Standort und Suchkriterien erhältst du aktuelle Telefonzeiten sortiert nach Datum.
</p>
<h1 class="text-3xl font-bold mb-6 mt-6">Suche</h1>
<form method="POST" action="/search" class="space-y-6">
{{ form.csrf_token }}
<div class="space-y-2 mb-3 my-6">
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
TheraPy hilft dir, Telefonzeiten für psychotherapeutische Angebote basierend auf den Daten der 116 117
Arztsuche der kassenärztlichen Vereinigung zu finden.
Mit dem gewünschten Standort und Suchkriterien erhältst du aktuelle Telefonzeiten sortiert nach Datum.
</p>
<h1 class="text-3xl font-bold mb-6 mt-6">Suche</h1>
<form method="POST" action="/search" class="space-y-6">
{{ form.csrf_token }}
<div class="space-y-2">
<label for="locationInput" class="block text-lg font-medium">{{ form.location.label }}</label>
<div class="flex flex-initial items-center space-x-2">
{{ form.location(class="input input-bordered w-full text-lg", id="locationInput", placeholder="Standort/PLZ eingeben") }}
</div>
{% if form.location.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.location.errors[0] }}
<div class="space-y-2">
<label for="locationInput" class="block text-lg font-medium">{{ form.location.label }}</label>
<div class="flex flex-initial items-center space-x-2">
{{ form.location(class="input input-bordered w-full text-lg", id="locationInput", placeholder="Standort/PLZ eingeben") }}
</div>
{% endif %}
</div>
<div class="space-y-2">
<label for="distanceRange" class="block text-lg font-medium">{{ form.therapy_distance.label }}: <span
id="distanceValue">{{ form.therapy_distance.data or 25 }} km</span></label>
<div class="flex items-center">
{{ form.therapy_distance(class="range range-primary flex-grow", id="distanceRange", min=0, max=50, step=1, oninput="document.getElementById('distanceValue').textContent = this.value + ' km'") }}
{% if form.location.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.location.errors[0] }}
</div>
{% endif %}
</div>
{% if form.therapy_distance.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.therapy_distance.errors[0] }}
</div>
{% endif %}
</div>
<div>
<fieldset>
<legend class="block text-lg font-medium">{{ form.therapy_type.label }}</legend>
<div class="space-y-2 mt-2">
{% for subfield in form.therapy_type %}
<div class="flex flex-initial items-center space-x-2">
{{ subfield(class="checkbox checkbox-primary") }}
<label class="text-lg" for="{{ subfield.id }}">
{{ subfield.label.text }}
<div class="space-y-2">
<label for="distanceRange" class="block text-lg font-medium">{{ form.therapy_distance.label }}:
<span
id="distanceValue">{{ form.therapy_distance.data or 25 }} km</span></label>
<div class="flex items-center">
{{ form.therapy_distance(class="range range-primary flex-grow", id="distanceRange", min=0, max=50, step=1, oninput="document.getElementById('distanceValue').textContent = this.value + ' km'") }}
</div>
{% if form.therapy_distance.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.therapy_distance.errors[0] }}
</div>
{% endif %}
</div>
<div>
<fieldset>
<legend class="block text-lg font-medium">{{ form.therapy_type.label }}</legend>
<div class="space-y-2 mt-2">
{% for subfield in form.therapy_type %}
<div class="flex flex-initial items-center space-x-2">
{{ subfield(class="checkbox checkbox-primary") }}
<label class="text-lg" for="{{ subfield.id }}">
{{ subfield.label.text }}
</label>
</div>
{% endfor %}
{% if form.therapy_type.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.therapy_type.errors[0] }}
</div>
{% endif %}
</div>
</fieldset>
</div>
<div>
<fieldset>
<legend class="block text-lg font-medium">{{ form.therapy_age_range.label }}</legend>
<div class="space-y-2 mt-2">
{% for subfield in form.therapy_age_range %}
<div class="flex flex-initial items-center space-x-2">
{{ subfield(class="radio radio-primary") }}
<label class="text-lg" for="{{ subfield.id }}">
{{ subfield.label.text }}
</label>
</div>
{% endfor %}
{% if form.therapy_age_range.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.therapy_age_range.errors[0] }}
</div>
{% endif %}
</div>
</fieldset>
</div>
<div>
<fieldset>
<legend class="block text-lg font-medium">{{ form.therapy_setting.label }}</legend>
<div class="space-y-2 mt-2">
{% for subfield in form.therapy_setting %}
<div class="flex flex-initial items-center space-x-2">
{{ subfield(class="radio radio-primary") }}
<label class="text-lg" for="{{ subfield.id }}">
{{ subfield.label.text }}
</label>
</div>
{% endfor %}
{% if form.therapy_setting.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.therapy_setting.errors[0] }}
</div>
{% endif %}
</div>
</fieldset>
</div>
<div class="space-y-2">
<label for="timeRange" class="block text-lg font-medium">{{ form.amount_of_weeks.label }} <span
id="weeksValue">{{ form.amount_of_weeks.data or 4 }} nächste(n) Woche(n)</span></label>
<div class="flex items-center">
{{ form.amount_of_weeks(class="range range-primary flex-grow", id="timeRange", min=1, max=4, step=1, oninput="document.getElementById('weeksValue').textContent = this.value + ' nächste(n) Woche(n)'") }}
</div>
{% if form.amount_of_weeks.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.amount_of_weeks.errors[0] }}
</div>
{% endif %}
</div>
<div>
<fieldset>
<div class="space-y-2 mt-4">
<div class="flex items-center space-x-2">
{{ form.privacy_agreement(class="checkbox checkbox-primary") }}
<label for="privacyAgreement" class="text-lg">
Ich habe die <a href="/privacy" class="text-purple-500 underline">Datenschutzerklärung</a> zur Kenntnis genommen und stimme der Verarbeitung meiner personenbezogenen Daten zu.
</label>
</div>
{% endfor %}
{% if form.therapy_type.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.therapy_type.errors[0] }}
</div>
{% endif %}
</div>
</fieldset>
</div>
<div>
<fieldset>
<legend class="block text-lg font-medium">{{ form.therapy_age_range.label }}</legend>
<div class="space-y-2 mt-2">
{% for subfield in form.therapy_age_range %}
<div class="flex flex-initial items-center space-x-2">
{{ subfield(class="radio radio-primary") }}
<label class="text-lg" for="{{ subfield.id }}">
{{ subfield.label.text }}
</label>
</div>
{% endfor %}
{% if form.therapy_age_range.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.therapy_age_range.errors[0] }}
</div>
{% endif %}
</div>
</fieldset>
</div>
<div>
<fieldset>
<legend class="block text-lg font-medium">{{ form.therapy_setting.label }}</legend>
<div class="space-y-2 mt-2">
{% for subfield in form.therapy_setting %}
<div class="flex flex-initial items-center space-x-2">
{{ subfield(class="radio radio-primary") }}
<label class="text-lg" for="{{ subfield.id }}">
{{ subfield.label.text }}
</label>
</div>
{% endfor %}
{% if form.therapy_setting.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.therapy_setting.errors[0] }}
</div>
{% endif %}
</div>
</fieldset>
</div>
<div class="space-y-2">
<label for="timeRange" class="block text-lg font-medium">{{ form.amount_of_weeks.label }} <span
id="weeksValue">{{ form.amount_of_weeks.data or 4 }} nächste(n) Woche(n)</span></label>
<div class="flex items-center">
{{ form.amount_of_weeks(class="range range-primary flex-grow", id="timeRange", min=1, max=4, step=1, oninput="document.getElementById('weeksValue').textContent = this.value + ' nächste(n) Woche(n)'") }}
{% if form.privacy_agreement.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.privacy_agreement.errors[0] }}
</div>
{% endif %}
</div>
</fieldset>
</div>
{% if form.amount_of_weeks.errors %}
<div class="text-red-500 text-sm mt-1">
{{ form.amount_of_weeks.errors[0] }}
</div>
{% endif %}
</div>
<div>
<button type="submit" class="btn btn-primary btn-lg w-full">Suche</button>
</div>
</form>
<div>
<button type="submit" class="btn btn-primary btn-lg w-full">Suche</button>
</div>
</form>
</div>
</div>
{% endblock %}

167
templates/privacy.html Normal file
View File

@ -0,0 +1,167 @@
{% extends "base.html" %}
{% block content %}
<div class="container mx-auto px-4 py-6">
<div class="flex flex-col">
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Allgemeines</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
„Öffentliche Daten nützen, private Daten schützen.“
(siehe <a href="https://www.ccc.de/de/hackerethics" class="text-purple-500 underline">https://www.ccc.de/de/hackerethics</a>)
Nach diesem Grundsatz verfahren wir mit euren persönlichen - oder personenbeziehbaren - Daten.
Wir wissen, dass Informationen am liebsten frei sein wollen - bei den persönlichen passen wir daher vor
allem auf, welche wir überhaupt erheben.
</p>
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Kontakts</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Wir - das ist die Binary Kitchen, kontaktieren könnt ihr uns zum Thema Datenschutz gerne unter:
vorstand@binary-kitchen.de oder per Post.
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Binary Kitchen e.V., Walderdorffstr. 13b, 93053 Regensburg
</p>
<h3 class="text-2xl font-bold mb-4">Rechte</h3>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Die Datenschutzbestimmungen - insbesondere die DSGVO - geben Betroffenen Rechte, die sich für uns von
selbst verstehen:
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Das Recht, Auskunft über die eigenen verarbeiteten Daten zu erhalten, sie berichtigen oder löschen zu
lassen, gemäß Art. 15, 16 und 17 DSGVO.
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Das Recht, dass die Verarbeitung der personenbezogenen Daten gemäß Art. 18 DSGVO eingeschränkt wird.
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Das Recht, die Daten, die ihr uns bereitgestellt habt, in einem strukturierten, gängigen und
maschinenlesbaren Format zu erhalten, soweit die Voraussetzungen nach Art. 20 DSGVO gegeben sind.
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Das Recht, einmal abgegebene Einwilligungen in die Verarbeitung eigener personenbezogenen Daten
jederzeit mit Wirkung für die Zukunft zu widerrufen, Art. 21 DSGVO.
</p>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Das Recht, Beschwerde bei einer Aufsichtsbehörde einzulegen, Art. 77 DSGVO.
</p>
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Ort der Datenverarbeitung</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Wir verarbeiten eure personenbezogenen Daten grundsätzlich nur in Deutschland und in der Europäischen
Union.
Ehrenamtliche Mitarbeiter der Binary Kitchen und Dienstleister, die uns bei der Datenverarbeitung im
Rahmen der Auftragsverarbeitung unterstützen (Dienstleister für IT-Betrieb, Rechenzentrum), haben zur
Erfüllung der unten genannten Zwecke im erforderlichen Umfang Zugriff auf personenbezogenen Daten.
Gesetzlich können wir im Einzelfall verpflichtet sein, personenbezogenen Daten an Behörden (z.B.
Auskunftsersuchen von Ermittlungsbehörden) oder natürliche/juristische Personen zu übermitteln. Schon
deswegen speichern wir eure Daten nicht so gerne und nur wenn es sein muss.
</p>
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Änderungen dieser Erklärung</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Wir versuchen, diese Datenschutzhinweise aktuell zu halten, Neuerungen werden wir dokumentieren, und an
dieser Stelle veröffentlichen. Schaut also öfter mal rein.
</p>
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Besuch unserer Webseite</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Um unsere Webseite anbieten zu können, müssen personenbezogene Daten verarbeitet werden. Zum Teil
geschieht das im Hintergrund und automatisch, damit die Seite überhaupt funktioniert. Rechtsgrundlage
hierfür ist Art. 6 Abs. 1 lit. b) DSGVO.
</p>
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Logfiles</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Bei Aufruf unserer Website werden folgende Daten in einer Protokolldatei gespeichert: Die angeforderte
Website-URL sowie die Website, von der aus die Datei angefordert wurde, die gespeicherten Cookies des
Besuchers für die aufgerufene Domain, der Status des Zugriffs (Datei übertragen, Datei nicht gefunden,
etc.), Datum, Uhrzeit und Dauer des Abrufs, übertragene Datenmenge im Rahmen der Verbindung, Typ und
Version des verwendeten Browsers, verwendete Sprache, IP-Adresse. Die Logs brauchen wir zeitweise um
einen störungsfreien Betrieb anzubieten. Sie werden sieben Tage nach Erstellung gelöscht.
Rechtsgrundlage hierfür ist unser berechtigtes Interesse am störungsfreien Betrieb gemäß Art. 6 Abs. 1
lit. f) DSGVO.
Kurz zur IP-Adresse:
Manchmal ist die gar nicht personenbezogen (z.b. wenn ein VPN, Firmenproxy, Freifunk oder andere offene
Netze oder TOR genutzt wird), meistens lässt sich aber zumindest vom Anbieter des Internetzugangs
rückdröseln (Fachbegriff!), an wen zu welchem Zeitpunkt welche IP-Nummer vergeben war. Und damit auch
von allen, die diese Info vom Anbieter erhalten können. Deswegen wird die IP# oft als personenbezogen
angesehen und behandelt.
Unser Webserver nutzt die, um die Daten die abgefragt werden, zu senden. Darüberhinaus landet sie in
Logs (s.o.).
</p>
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Abfrage von Gesundheitsdaten</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Zum anderen Teil - und dafür seid ihr vermutlich hier - könnt ihr diese Website auch nutzen, um euch die
Kontaktdaten von therapierenden Personen anzuzeigen. Um diese Abfrage durchführen zu können, müsst ihr
neben eurer Postleitzahl auch Angaben zur Therapieform und eurem Alter machen. Diese können
Gesundheitsdaten gemäß Art. 9 DSGVO darstellen. Rechtsgrundlage hierfür ist ausschließlich eure
Einwilligung gemäß Art. 6 Abs. 1 lit. a i.V.m. Art. 9 Abs. 2 lit. a DSGVO. Die Daten werden nicht
gespeichert, sondern lediglich genutzt, um euch unmittelbar Ergebnisse anzeigen zu können. Sobald die
Ergebnisse generiert sind, werden die Daten gelöscht.
</p>
<div class="w-ful mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Kontaktaufnahme</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Schließlich könnt ihr mit uns in Kontakt treten, wenn technische Probleme auftreten oder ihr weitere
Anliegen habt. Zu diesem Zweck verarbeiten wir zumindest eure E-Mail-Adresse. Je nach Inhalt kann es
auch hier sein, dass Gesundheitsdaten verarbeitet werden. Rechtsgrundlage hierfür ist ausschließlich
eure Einwilligung gemäß Art. 6 Abs. 1 lit. a i.V.m. Art. 9 Abs. 2 lit. a DSGVO. Die Daten werden
gelöscht, sobald eure E-Mail bearbeitet ist. Ihr habt das Recht, eure Einwilligung jederzeit zu
widerrufen. Auch dann werden eure personenbezogenen Daten unverzüglich gelöscht.
</p>
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Links auf Websites anderer Anbieter</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Wir haben auf unserer Website Links auf Websites anderer Anbieter gesetzt. Wir sind für die
Datenverarbeitung auf diesen anderen Websites zum Glück nicht verantwortlich. Wie die jeweiligen
Anbieter den Datenschutz handhaben, müsst ihr bitte deren Datenschutzbestimmungen entnehmen.
</p>
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Werbung, Tracking, Surf-Analyse</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Gibt es bei uns alles nicht. Wir speichern und verarbeiten keine Daten zu anderen Zwecken, als die
genannten Dienste zur verfügung zu stellen, wir nutzen sie nicht zu Werbezwecken und wir geben sie auch
nicht dafür weiter. Nicht mal wenn ihr wollen würdet.
</p>
<div class="w-full mb-3 my-6">
<h2 class="text-2xl font-bold mb-4">Datenweiterleitung</h2>
</div>
<p class="mb-3 text-lg md:text-xl dark:text-gray-400">
Wir geben eure Daten weder an Dritte weiter, noch übermitteln wir sie in Länder außerhalb der
Europäischen Union. Die Daten werden auch nicht für einen anderen Zweck weiterverarbeitet.
</p>
</div>
</div>
{% endblock %}