modified: routes/auth_routes.py

modified:   routes/journal_routes.py
	modified:   static/css/style.css
	modified:   templates/base.html
	new file:   templates/datenschutz.html
	modified:   templates/future.html
	new file:   templates/impressum.html
This commit is contained in:
SimolZimol
2026-08-02 21:46:25 +02:00
parent 25d35e5556
commit 29cadb7fd3
7 changed files with 260 additions and 10 deletions

View File

@@ -33,3 +33,15 @@ def logout():
session.clear()
flash("Du wurdest abgemeldet.", "info")
return redirect(url_for("auth.login"))
@auth_bp.route("/impressum")
def impressum():
"""Öffentliche Impressum-Seite (gesetzlich Pflicht)."""
return render_template("impressum.html")
@auth_bp.route("/datenschutz")
def datenschutz():
"""Öffentliche Datenschutz-/GDPR-Seite."""
return render_template("datenschutz.html")

View File

@@ -277,13 +277,19 @@ def future():
note_text = request.form.get("note_text", "").strip()
month_str = request.form.get("month", "")
month = parse_date(month_str)
ref_type = request.form.get("ref_type", "").strip()
ref_value = request.form.get("ref_value", "").strip()
refs = None
if ref_value:
refs = json.dumps([{"type": ref_type or "link", "value": ref_value}])
if note_text and month:
with get_connection() as conn:
with conn.cursor() as cur:
cur.execute(
"INSERT INTO future_log (user_id, month_date, note_text) "
"VALUES (%s, %s, %s)",
(_user_id(), month, note_text),
"INSERT INTO future_log (user_id, month_date, note_text, refs) "
"VALUES (%s, %s, %s, %s)",
(_user_id(), month, note_text, refs),
)
flash("Eintrag ins Future Log hinzugefügt.", "success")
else:
@@ -298,13 +304,52 @@ def future():
)
entries = cur.fetchall()
# Gruppieren nach Monat
# Gruppieren nach Monat (mit Zählern)
grouped = {}
for e in entries:
key = e["month_date"].strftime("%Y-%m")
grouped.setdefault(key, []).append(e)
return render_template("future.html", grouped=grouped, months=MONTHS)
month_stats = {}
for key, items in grouped.items():
month_stats[key] = {
"total": len(items),
"open": sum(1 for i in items if i["status"] == "open"),
"done": sum(1 for i in items if i["status"] == "done"),
}
today = date.today()
return render_template(
"future.html",
grouped=grouped,
month_stats=month_stats,
months=MONTHS,
ref_types=list(REF_TYPE_DISPLAY.keys()),
today_str=today.strftime("%Y-%m"),
)
@journal_bp.route("/future/<int:entry_id>/toggle", methods=["POST"])
@login_required
def toggle_future(entry_id: int):
"""Schaltet einen Future-Log-Eintrag zwischen offen und erledigt um."""
with get_connection() as conn:
with conn.cursor() as cur:
cur.execute(
"SELECT status FROM future_log WHERE id = %s AND user_id = %s",
(entry_id, _user_id()),
)
entry = cur.fetchone()
if not entry:
flash("Eintrag nicht gefunden.", "danger")
return redirect(url_for("journal.future"))
new_status = "done" if entry["status"] != "done" else "open"
cur.execute(
"UPDATE future_log SET status = %s WHERE id = %s AND user_id = %s",
(new_status, entry_id, _user_id()),
)
flash("Status aktualisiert.", "success")
return redirect(url_for("journal.future"))
@journal_bp.route("/woche")

View File

@@ -179,6 +179,19 @@ input:focus, select:focus { outline: 2px solid var(--accent); }
/* Footer */
.footer { text-align: center; padding: 1.5rem; color: var(--muted); font-size: .8rem; }
/* --- Footer Links --- */
.footer-links { margin-top: .3rem; font-size: .85rem; }
.footer-links a { color: var(--accent-dark); text-decoration: none; }
.footer-links a:hover { text-decoration: underline; }
.footer-links span { margin: 0 .4rem; }
/* --- Rechtliche Seiten (Impressum/Datenschutz) --- */
.legal h1 { font-size: 1.5rem; margin-bottom: 1rem; }
.legal h2 { font-size: 1.05rem; margin-top: 1.2rem; }
.legal p, .legal li { line-height: 1.6; }
.legal ul { padding-left: 1.2rem; }
.legal a { color: var(--blue); }
/* Responsive */
@media (max-width: 720px) {
.week-grid { grid-template-columns: repeat(2, 1fr); }

View File

@@ -45,7 +45,12 @@
</main>
<footer class="footer">
<p>Bullet Journal &copy; {{ now.year if now else 2026 }}</p>
<p>&copy; {{ now.year if now else 2026 }} Journal von Simon Giehl</p>
<p class="footer-links">
<a href="{{ url_for('auth.impressum') }}">Impressum</a>
<span>·</span>
<a href="{{ url_for('auth.datenschutz') }}">Datenschutz</a>
</p>
</footer>
<script src="{{ url_for('static', filename='js/main.js') }}"></script>

View File

@@ -0,0 +1,91 @@
{% extends "base.html" %}
{% block title %}Datenschutzerklärung Journal{% endblock %}
{% block content %}
<section class="card legal">
<h1>Datenschutzerklärung</h1>
<h2>1. Verantwortlicher</h2>
<p>
Verantwortlicher im Sinne der Datenschutz-Grundverordnung (DSGVO) ist:<br>
Simon Giehl<br>
Mühlenweg 9<br>
47608 Geldern<br>
E-Mail: <a href="mailto:simon-giehl@vp-server.eu">simon-giehl@vp-server.eu</a>
</p>
<h2>2. Allgemeines</h2>
<p>
Diese Datenschutzerklärung informiert Sie über die Art, den Umfang und den Zweck der
Verarbeitung personenbezogener Daten innerhalb dieses Online-Angebots („Journal").
Personenbezogene Daten sind alle Daten, die auf Sie persönlich beziehbar sind, z.&nbsp;B.
Name, E-Mail-Adresse oder Nutzerverhalten.
</p>
<h2>3. Verarbeitung personenbezogener Daten</h2>
<p>
Im Rahmen der Nutzung dieser Website werden folgende Daten verarbeitet:
</p>
<ul>
<li>
<strong>Kontodaten:</strong> Benutzername, E-Mail-Adresse (falls hinterlegt) sowie ein
verschlüsseltes Passwort (gehasht mit Salz und Pfeffer; Klartext wird nicht gespeichert).
</li>
<li>
<strong>Journal-Inhalte:</strong> Ihre Einträge, Notizen, Termine und Verweise, die Sie
selbst eingeben und die ausschließlich im Zusammenhang mit Ihrem Konto verarbeitet werden.
</li>
<li>
<strong>Technische Daten:</strong> Bei Zugriffen können standardmäßig Zugriffsdaten
(z.&nbsp;B. IP-Adresse, Zeitpunkt) in Server-Logs verarbeitet werden.
</li>
</ul>
<h2>4. Rechtsgrundlagen</h2>
<p>
Die Verarbeitung erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO (Erfüllung eines
Vertrags bzw. Durchführung vorvertraglicher Maßnahmen) sowie Art. 6 Abs. 1 lit. f DSGVO
(berechtigtes Interesse, z.&nbsp;B. Gewährleistung der Systemsicherheit).
</p>
<h2>5. Speicherung der Daten</h2>
<p>
Ihre Daten werden in einer MySQL-Datenbank gespeichert, solange Ihr Konto bzw. Ihre Einträge
bestehen. Sie können jederzeit die Löschung Ihres Kontos und Ihrer Daten verlangen.
</p>
<h2>6. Weitergabe an Dritte</h2>
<p>
Eine Weitergabe Ihrer personenbezogenen Daten an Dritte erfolgt nicht, es sei denn,
dies ist gesetzlich vorgeschrieben oder Sie haben zuvor eingewilligt.
</p>
<h2>7. Cookies &amp; Session</h2>
<p>
Diese Website verwendet für die Anmeldung eine Sitzung (Session), die technisch notwendig
ist. Es werden keine Marketing-Cookies eingesetzt.
</p>
<h2>8. Ihre Rechte als betroffene Person</h2>
<p>
Sie haben das Recht auf:
</p>
<ul>
<li>Auskunft über Ihre gespeicherten Daten (Art. 15 DSGVO),</li>
<li>Berichtigung unrichtiger Daten (Art. 16 DSGVO),</li>
<li>Löschung Ihrer Daten (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>Widerruf erteilter Einwilligungen mit Wirkung für die Zukunft (Art. 7 Abs. 3 DSGVO).</li>
</ul>
<p>
Zudem besteht ein Beschwerderecht bei einer Datenschutz-Aufsichtsbehörde (Art. 77 DSGVO).
</p>
<h2>9. Kontakt</h2>
<p>
Bei Fragen zur Verarbeitung Ihrer personenbezogenen Daten wenden Sie sich bitte an:
<a href="mailto:simon-giehl@vp-server.eu">simon-giehl@vp-server.eu</a>
</p>
</section>
{% endblock %}

View File

@@ -1,5 +1,5 @@
{% extends "base.html" %}
{% block title %}Future Log Bullet Journal{% endblock %}
{% block title %}Future Log Journal{% endblock %}
{% block content %}
<div class="page-head">
<div>
@@ -22,13 +22,38 @@
</label>
<button type="submit" class="btn btn-primary">Hinzufügen</button>
</div>
<div class="note-form-row ref-row">
<label>
Verweis-Typ
<select name="ref_type">
<option value=""> kein </option>
<option value="email">📧 E-Mail</option>
<option value="link">🔗 Link/URL</option>
<option value="phone">📞 Telefon</option>
<option value="mention">@ Erwähnung</option>
</select>
</label>
<label class="grow">
Verweis
<input type="text" name="ref_value" placeholder="z. B. name@firma.de (optional)">
</label>
</div>
</form>
</section>
{% if grouped %}
{% for month_key, entries in grouped.items() %}
<section class="card">
<h2>{{ month_key[5:7]|int }} / {{ month_key[0:4] }}</h2>
<div class="day-head">
<h2>{{ month_key[5:7]|int }} / {{ month_key[0:4] }}
{% if month_key == today_str %}<span class="pill">aktuell</span>{% endif %}
</h2>
<div class="day-head-stats">
<span class="pill open">{{ month_stats[month_key].open }} offen</span>
<span class="pill done">{{ month_stats[month_key].done }} erledigt</span>
<span class="pill">{{ month_stats[month_key].total }} gesamt</span>
</div>
</div>
<ul class="note-list">
{% for e in entries %}
<li class="note-item {{ 'is-done' if e.status == 'done' else '' }}">
@@ -44,9 +69,14 @@
{% endfor %}
</div>
{% endif %}
<span class="note-date">{{ e.month_date.strftime('%m/%Y') }}</span>
</div>
<span class="note-date">{{ e.month_date.strftime('%m/%Y') }}</span>
<span class="mini-actions">
<form method="post" action="{{ url_for('journal.toggle_future', entry_id=e.id) }}" class="inline">
<button class="btn btn-small {{ 'btn-success' if e.status != 'done' else '' }}">
{{ 'Erledigt' if e.status != 'done' else 'Wieder öffnen' }}
</button>
</form>
<a href="{{ url_for('journal.edit_future', entry_id=e.id) }}" class="btn btn-small">Bearbeiten</a>
<form method="post" action="{{ url_for('journal.delete_future', entry_id=e.id) }}" class="inline"
onsubmit="return confirm('Eintrag wirklich löschen?');">
@@ -60,7 +90,7 @@
{% endfor %}
{% else %}
<section class="card">
<p class="muted">Noch keine Einträge im Future Log.</p>
<p class="muted">Noch keine Einträge im Future Log. Füge oben deinen ersten Eintrag hinzu.</p>
</section>
{% endif %}
{% endblock %}

54
templates/impressum.html Normal file
View File

@@ -0,0 +1,54 @@
{% extends "base.html" %}
{% block title %}Impressum Journal{% endblock %}
{% block content %}
<section class="card legal">
<h1>Impressum</h1>
<p>Angaben gemäß § 5 TMG</p>
<h2>Diensteanbieter</h2>
<p>
Simon Giehl<br>
Mühlenweg 9<br>
47608 Geldern<br>
Deutschland
</p>
<h2>Kontakt</h2>
<p>
Telefon: <br>
E-Mail: <a href="mailto:simon-giehl@vp-server.eu">simon-giehl@vp-server.eu</a>
</p>
<h2>Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV</h2>
<p>
Simon Giehl<br>
Mühlenweg 9<br>
47608 Geldern
</p>
<h2>Haftung für Inhalte</h2>
<p>
Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen
Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG 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.
</p>
<h2>Haftung für Links</h2>
<p>
Unser Angebot enthält Links zu externen Websites 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.
</p>
<h2>Urheberrecht</h2>
<p>
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.
</p>
</section>
{% endblock %}