Files
stundenfuchs/app/services/legal_content.py
T
maddin 9794362f39
CI / checks (push) Has been cancelled
chore: initialize public repository
2026-03-22 12:55:55 +00:00

243 lines
8.3 KiB
Python

from __future__ import annotations
import markdown as markdown_lib
import bleach
SITE_CONTENT_IMPRESSUM = 'impressum'
SITE_CONTENT_PRIVACY = 'datenschutz'
DEFAULT_SITE_CONTENT_MARKDOWN = {
SITE_CONTENT_IMPRESSUM: """# Impressum
Bitte vor dem produktiven Einsatz im Admin-Bereich vollständig ausfüllen.
## Diensteanbieter
Firmenname / Name
Straße und Hausnummer
PLZ Ort
Land
## Kontakt
E-Mail: [kontakt@example.com](mailto:kontakt@example.com)
## Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV
Name der verantwortlichen Person
Straße und Hausnummer
PLZ Ort
Land
""",
SITE_CONTENT_PRIVACY: """# Datenschutzerklärung
## 1. Verantwortlicher
Bitte vor dem produktiven Einsatz im Admin-Bereich prüfen und anpassen.
Verantwortlich für die Verarbeitung personenbezogener Daten im Zusammenhang mit dieser Website und Anwendung ist:
Firmenname / Name
Straße und Hausnummer
PLZ Ort
Land
E-Mail: [kontakt@example.com](mailto:kontakt@example.com)
## 2. Allgemeines zur Datenverarbeitung
Ich verarbeite personenbezogene Daten nur, soweit dies zur Bereitstellung einer funktionsfähigen Website und Anwendung, zur Bearbeitung von Anfragen, zur Sicherheit des Dienstes sowie zur Erbringung der angebotenen Funktionen erforderlich ist.
## 3. Aufruf der Website
Beim Aufruf der Website werden technisch erforderliche Daten verarbeitet, um die Seite auszuliefern und die Stabilität und Sicherheit des Dienstes zu gewährleisten.
Dabei können insbesondere folgende Daten verarbeitet werden:
- IP-Adresse
- Datum und Uhrzeit des Abrufs
- aufgerufene Seite bzw. Ressource
- Informationen über Browser und Betriebssystem
- Referrer-Informationen
- Protokolldaten zu Sicherheits- und Fehlervorgängen
Die Verarbeitung erfolgt zur technischen Bereitstellung, Systemsicherheit und Missbrauchserkennung.
## 4. Registrierung und Benutzerkonto
Wenn du ein Benutzerkonto anlegst, verarbeite ich die von dir angegebenen Registrierungsdaten, insbesondere:
- E-Mail-Adresse
- Passwort in gehashter Form
- von dir hinterlegte Einstellungen innerhalb der Anwendung
Die Verarbeitung erfolgt zum Zweck der Einrichtung und Verwaltung deines Benutzerkontos sowie zur Nutzung der Funktionen von Stundenfuchs.
## 5. Nutzung der Anwendung
Im Rahmen der Nutzung von Stundenfuchs verarbeite ich die von dir eingegebenen oder erzeugten Inhalte, insbesondere:
- Arbeitszeiteinträge
- Pausenangaben
- Urlaubs-, Krankheits- und Feiertagseinträge
- Stundenausgleich
- Einstellungen zu Wochenstunden, relevanten Arbeitstagen und Auswertungen
- Backup-, Export- und Importdaten
- Angaben im Arbeitsstunden-Counter
Diese Daten werden verarbeitet, um dir die Funktionen der Anwendung bereitzustellen.
## 6. Anmeldung, Sitzungen und Sicherheit
Zur Anmeldung und sicheren Nutzung der Anwendung werden technisch notwendige Sitzungsdaten verarbeitet. Außerdem können sicherheitsrelevante Daten verarbeitet werden, insbesondere zur:
- Login-Verwaltung
- Erkennung missbräuchlicher Zugriffe
- Durchsetzung von Sicherheitsmaßnahmen
- Begrenzung fehlerhafter Login- oder Formularversuche
## 7. E-Mail-Funktionen
Im Zusammenhang mit der Nutzung von Stundenfuchs können E-Mails versendet werden, insbesondere für:
- E-Mail-Bestätigung
- Passwort-Reset
- sicherheitsrelevante Hinweise
- Benachrichtigungen innerhalb der Anwendung
- Kontaktanfragen bzw. Tickets
Dafür werden insbesondere E-Mail-Adresse und die jeweils zur Nachricht erforderlichen Metadaten verarbeitet.
## 8. Zwei-Faktor-Authentifizierung
Wenn du die Zwei-Faktor-Authentifizierung aktivierst, werden die dafür erforderlichen Sicherheitsdaten verarbeitet, um die zusätzliche Anmeldung per Authenticator-App zu ermöglichen.
## 9. Kontaktformular und Ticketsystem
Wenn du das Kontaktformular nutzt oder ein Ticket erstellst, verarbeite ich die von dir übermittelten Angaben, insbesondere:
- Name
- E-Mail-Adresse
- Kategorie der Anfrage
- Betreff
- Nachricht
- technische Missbrauchsschutzdaten
Die Verarbeitung erfolgt zur Bearbeitung deiner Anfrage, zur Kommunikation mit dir sowie zur Abwehr von Missbrauch und Spam.
## 10. Export und Backup
Wenn du Export- oder Backup-Funktionen nutzt, werden die von dir innerhalb der Anwendung gespeicherten Daten zusammengestellt und zum Download bereitgestellt. Diese Verarbeitung erfolgt ausschließlich zur Durchführung der von dir ausgelösten Funktion.
## 11. Rechtsgrundlagen
Soweit die Verarbeitung zur Bereitstellung und Durchführung der Funktionen von Stundenfuchs erforderlich ist, erfolgt sie auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO.
Soweit die Verarbeitung zur Gewährleistung der Sicherheit, Stabilität und Missbrauchsvermeidung erfolgt, beruht sie auf Art. 6 Abs. 1 lit. f DSGVO. Das berechtigte Interesse liegt in der sicheren, funktionsfähigen und wirtschaftlichen Bereitstellung des Dienstes.
Soweit du mich kontaktierst, erfolgt die Verarbeitung je nach Inhalt deiner Anfrage auf Art. 6 Abs. 1 lit. b DSGVO oder Art. 6 Abs. 1 lit. f DSGVO.
## 12. Empfänger von Daten
Personenbezogene Daten werden nur insoweit weitergegeben, wie dies für den Betrieb der Anwendung technisch erforderlich ist oder eine gesetzliche Verpflichtung besteht.
Hosting-, E-Mail- und sonstige Empfängerangaben müssen für den konkreten Produktivbetrieb ergänzt werden.
## 13. Speicherdauer
Personenbezogene Daten werden nur so lange gespeichert, wie dies für die jeweiligen Zwecke erforderlich ist oder gesetzliche Aufbewahrungspflichten bestehen.
Kontodaten und in der Anwendung gespeicherte Inhalte werden grundsätzlich so lange gespeichert, wie dein Benutzerkonto besteht, sofern keine gesetzlichen Pflichten entgegenstehen.
Kontaktanfragen und Tickets werden gespeichert, soweit dies zur Bearbeitung, Dokumentation und Missbrauchsabwehr erforderlich ist.
## 14. Deine Rechte
Du hast nach Maßgabe der gesetzlichen Vorschriften das Recht auf:
- Auskunft über die verarbeiteten personenbezogenen Daten
- Berichtigung unrichtiger Daten
- Löschung
- Einschränkung der Verarbeitung
- Datenübertragbarkeit
- Widerspruch gegen Verarbeitungen auf Grundlage berechtigter Interessen
Wenn eine Verarbeitung auf einer Einwilligung beruht, kannst du diese jederzeit mit Wirkung für die Zukunft widerrufen.
## 15. Beschwerderecht
Du hast das Recht, dich bei einer Datenschutzaufsichtsbehörde zu beschweren.
## 16. Pflicht zur Bereitstellung von Daten
Soweit personenbezogene Daten für die Registrierung, Anmeldung oder Nutzung der Anwendung erforderlich sind, ist die Bereitstellung dieser Daten notwendig. Ohne diese Daten kann Stundenfuchs ganz oder teilweise nicht genutzt werden.
## 17. Keine automatisierte Entscheidungsfindung
Eine automatisierte Entscheidungsfindung einschließlich Profiling im Sinne von Art. 22 DSGVO findet nicht statt.
## 18. Keine Analyse- oder Drittinhalte
Es werden keine Analyse- oder Trackingdienste eingesetzt.
Es werden keine externen Schriftarten, kein externes Fehlertracking und keine eingebetteten Drittinhalte verwendet.
## 19. Stand
Stand: März 2026
""",
}
_ALLOWED_TAGS = [
'a', 'blockquote', 'br', 'code', 'em', 'h1', 'h2', 'h3', 'h4', 'li', 'ol', 'p', 'pre', 'strong', 'ul'
]
_ALLOWED_ATTRIBUTES = {
'a': ['href', 'title', 'rel', 'target'],
}
_ALLOWED_PROTOCOLS = ['http', 'https', 'mailto']
def default_site_content_markdown(key: str) -> str:
return DEFAULT_SITE_CONTENT_MARKDOWN.get(key, '')
def render_safe_markdown(markdown_text: str) -> str:
raw_html = markdown_lib.markdown(
markdown_text or '',
extensions=['extra', 'sane_lists'],
output_format='html5',
)
cleaned = bleach.clean(
raw_html,
tags=_ALLOWED_TAGS,
attributes=_ALLOWED_ATTRIBUTES,
protocols=_ALLOWED_PROTOCOLS,
strip=True,
)
return bleach.linkify(cleaned)
def normalize_markdown_input(value: str) -> str:
return (value or '').strip()
def ticket_status_label(status: str) -> str:
return {
'open': 'Offen',
'closed': 'Geschlossen',
}.get(status, status)
def ticket_category_options() -> list[dict[str, str]]:
return [
{'value': 'problem', 'label': 'Problem'},
{'value': 'feature', 'label': 'Featurerequest'},
{'value': 'other', 'label': 'Sonstiges'},
]
def ticket_category_label(value: str) -> str:
for item in ticket_category_options():
if item['value'] == value:
return item['label']
return value