243 lines
8.3 KiB
Python
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
|