py app init + zitadel doku

This commit is contained in:
br committed 2026-06-17 19:04:39 +02:00
1 parent 5b649f96f2
commit 5a0260e4fd
23 files changed
+1071 -1

No files matched your search

+71
View File
@@ -0,0 +1,71 @@
{#
Datei: templates/admin.html
Autor: <Vorname Nachname>
Datum: 2026-06-17
Zweck: Admin-Ansicht mit Übersicht aller Clients, Projekte und Nutzer.
Variablen: user, clients (list), projects (list), users (list)
#}
{% extends "base.html" %}
{% block title %}Admin Cockpit{% endblock %}
{% block content %}
<h1>Admin Cockpit</h1>
<section>
<h2>Clients</h2>
<table>
<thead><tr><th>ID</th><th>Name</th></tr></thead>
<tbody>
{% for c in clients %}
<tr><td>{{ c.id }}</td><td>{{ c.name }}</td></tr>
{% else %}
<tr><td colspan="2">Keine Clients vorhanden.</td></tr>
{% endfor %}
</tbody>
</table>
</section>
<section>
<h2>Projekte</h2>
<table>
<thead><tr><th>ID</th><th>Name</th><th>Client</th></tr></thead>
<tbody>
{% for p in projects %}
<tr>
<td>{{ p.id }}</td>
<td><a href="{{ url_for('main.projekt', project_id=p.id) }}">{{ p.name }}</a></td>
<td>{{ p.client.name }}</td>
</tr>
{% else %}
<tr><td colspan="3">Keine Projekte vorhanden.</td></tr>
{% endfor %}
</tbody>
</table>
</section>
<section>
<h2>Nutzer</h2>
<table>
<thead><tr><th>Zitadel-ID (sub)</th><th>E-Mail</th><th>Rolle</th></tr></thead>
<tbody>
{% for u in users %}
<tr>
<td><code>{{ u.zitadel_user_id }}</code></td>
<td>{{ u.email }}</td>
<td>{{ u.global_role }}</td>
</tr>
{% else %}
<tr><td colspan="3">Keine Nutzer in der DB.</td></tr>
{% endfor %}
</tbody>
</table>
</section>
<section>
<h2>Aktionen</h2>
<button class="btn" disabled title="Noch nicht implementiert">Gesamtexport (CSV)</button>
</section>
<p><a href="{{ url_for('main.index') }}">&larr; Zurück zum Dashboard</a></p>
{% endblock %}
+29
View File
@@ -0,0 +1,29 @@
{#
Datei: templates/base.html
Autor: <Vorname Nachname>
Datum: 2026-06-17
Zweck: Basis-Layout für alle Seiten. Erwartet: session.user (optional).
#}
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}OIDC Showcase{% endblock %}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<nav>
<span class="nav-brand">OIDC Showcase</span>
{% if session.user %}
<div class="nav-user">
<span>{{ session.user.email }} &nbsp;·&nbsp; <em>{{ session.user.role }}</em></span>
<a href="{{ url_for('main.logout') }}">Abmelden</a>
</div>
{% endif %}
</nav>
<main>
{% block content %}{% endblock %}
</main>
</body>
</html>
+56
View File
@@ -0,0 +1,56 @@
{#
Datei: templates/index.html
Autor: <Vorname Nachname>
Datum: 2026-06-17
Zweck: Dashboard mit Test-Matrix. Zeigt Kacheln je nach Rolle des eingeloggten Nutzers.
Variablen: user (dict), projects (list[Project]), forbidden_project (Project|None)
#}
{% extends "base.html" %}
{% block title %}Dashboard{% endblock %}
{% block content %}
<h1>Dashboard</h1>
<p class="subtitle">Angemeldet als <strong>{{ user.email }}</strong> &nbsp;·&nbsp; Rolle: <em>{{ user.role }}</em></p>
<div class="card-grid">
{% if user.role == "Admin" %}
<div class="card">
<h2>Admin Cockpit</h2>
<p>Vollzugriff auf alle Clients, Projekte und Nutzer.</p>
<a href="{{ url_for('main.admin') }}" class="btn">Öffnen</a>
</div>
{% endif %}
{% if user.role == "Mitarbeiter" %}
<div class="card">
<h2>Mitarbeiter Cockpit</h2>
<p>Deine zugewiesenen Projekte im Überblick.</p>
<a href="{{ url_for('main.mitarbeiter') }}" class="btn">Meine Projekte</a>
</div>
{% endif %}
{% if projects %}
<div class="card">
<h2>Kundenprojekte</h2>
<ul class="project-list">
{% for p in projects %}
<li><a href="{{ url_for('main.projekt', project_id=p.id) }}">{{ p.name }}</a></li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if forbidden_project %}
<div class="card card--warning">
<h2>&#9888; Test: Unbefugter Zugriff</h2>
<p>Simuliert einen Angriff: Zugriff auf ein nicht zugewiesenes Projekt.</p>
<a href="{{ url_for('main.projekt', project_id=forbidden_project.id) }}" class="btn btn--danger">
Zugriff auf „{{ forbidden_project.name }}" erzwingen
</a>
</div>
{% endif %}
</div>
{% endblock %}
+17
View File
@@ -0,0 +1,17 @@
{#
Datei: templates/login_error.html
Autor: <Vorname Nachname>
Datum: 2026-06-17
Zweck: Fehlerseite bei verweigertem Zugriff. Keine Variablen erwartet.
#}
{% extends "base.html" %}
{% block title %}Zugriff verweigert{% endblock %}
{% block content %}
<div class="error-box">
<h1>Zugriff verweigert</h1>
<p>Bitte besuch uns später wieder, du bist im Moment nicht autorisiert.</p>
<button class="btn btn--danger" onclick="history.back()">&#8592; Zurück</button>
</div>
{% endblock %}
+28
View File
@@ -0,0 +1,28 @@
{#
Datei: templates/mitarbeiter.html
Autor: <Vorname Nachname>
Datum: 2026-06-17
Zweck: Projektübersicht für Mitarbeiter (nur zugewiesene Projekte).
Variablen: user, projects (list[Project])
#}
{% extends "base.html" %}
{% block title %}Meine Projekte{% endblock %}
{% block content %}
<h1>Mitarbeiter Cockpit</h1>
<p>Deine zugewiesenen Projekte:</p>
<ul class="project-list">
{% for p in projects %}
<li>
<a href="{{ url_for('main.projekt', project_id=p.id) }}">{{ p.name }}</a>
<span class="client-name">– {{ p.client.name }}</span>
</li>
{% else %}
<li>Keine Projekte zugewiesen.</li>
{% endfor %}
</ul>
<p><a href="{{ url_for('main.index') }}">&larr; Zurück</a></p>
{% endblock %}
+40
View File
@@ -0,0 +1,40 @@
{#
Datei: templates/projekt.html
Autor: <Vorname Nachname>
Datum: 2026-06-17
Zweck: Projekt-Cockpit mit Notizen-Log. Zugriff nur für zugewiesene Nutzer.
Variablen: user, project (Project), notes (list[Note])
#}
{% extends "base.html" %}
{% block title %}{{ project.name }}{% endblock %}
{% block content %}
<h1>{{ project.name }}</h1>
<p class="subtitle">Client: {{ project.client.name }}</p>
<section>
<h2>Korrespondenz / Notizen</h2>
{% if notes %}
<table class="notes-table">
<thead>
<tr><th>Datum</th><th>Autor (sub)</th><th>Notiz</th></tr>
</thead>
<tbody>
{% for n in notes %}
<tr>
<td>{{ n.created_at.strftime('%Y-%m-%d %H:%M') }}</td>
<td><code>{{ n.user_id }}</code></td>
<td>{{ n.text }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<button class="btn" disabled title="Noch nicht implementiert">Notizen exportieren</button>
{% else %}
<p>Keine Notizen für dieses Projekt vorhanden.</p>
{% endif %}
</section>
<p><a href="{{ url_for('main.index') }}">&larr; Zurück zum Dashboard</a></p>
{% endblock %}