py app init + zitadel doku
This commit is contained in:
1 parent
5b649f96f2
commit
5a0260e4fd
23 files changed
+1071
-1
No files matched your search
@@ -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') }}">← Zurück zum Dashboard</a></p>
|
||||
{% endblock %}
|
||||
@@ -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 }} · <em>{{ session.user.role }}</em></span>
|
||||
<a href="{{ url_for('main.logout') }}">Abmelden</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</nav>
|
||||
<main>
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
@@ -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> · 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>⚠ 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 %}
|
||||
@@ -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()">← Zurück</button>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -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') }}">← Zurück</a></p>
|
||||
{% endblock %}
|
||||
@@ -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') }}">← Zurück zum Dashboard</a></p>
|
||||
{% endblock %}
|
||||
Reference in new issue
Block a user