admin: bruger- og gruppe-administration (opret bruger m. gruppe-adgang, medlemsstyring)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
agw
2026-06-11 21:20:00 +02:00
co-authored by Claude Opus 4.8
parent dfe500c178
commit 7cf79fa901
7 changed files with 286 additions and 13 deletions
+40
View File
@@ -0,0 +1,40 @@
{% extends "base.html" %}
{% block title %}Admin — brugere{% endblock %}
{% block body %}
<h1>Brugere</h1>
<p class="lead">Opret og administrér brugere. Adgang til services styres via <strong class="text-text">grupper</strong> (en app er bundet til en gruppe).</p>
{% if saved %}<div class="flash">{{ saved }}</div>{% endif %}
<h2>Opret ny bruger</h2>
<form method="post" action="/admin/users" class="stat" style="display:block">
<div style="display:grid;gap:.7rem;grid-template-columns:repeat(auto-fit,minmax(12rem,1fr))">
<label>Brugernavn<input name="username" required autocomplete="off"></label>
<label>Navn<input name="name" autocomplete="off"></label>
<label>Email<input name="email" type="email" autocomplete="off"></label>
<label>Adgangskode<input name="password" type="text" autocomplete="new-password" placeholder="(valgfri)"></label>
</div>
<p class="muted" style="margin:.9rem 0 .4rem;font-size:.85rem">Adgang (grupper) — sæt flueben for de services brugeren skal kunne tilgå:</p>
<div style="display:grid;gap:.3rem .9rem;grid-template-columns:repeat(auto-fill,minmax(11rem,1fr))">
{% for g in groups %}
<label style="display:flex;gap:.4rem;align-items:center;font-size:.9rem"><input type="checkbox" name="groups" value="{{ g.pk }}" style="width:auto"> {{ g.name }}</label>
{% endfor %}
</div>
<p style="margin-top:1rem"><button class="btn" type="submit">Opret bruger</button></p>
</form>
<h2>Alle brugere ({{ users|length }})</h2>
<table>
<thead><tr><th>Bruger</th><th>Email</th><th>Grupper</th><th>Status</th><th></th></tr></thead>
<tbody>
{% for u in users %}
<tr>
<td><strong>{{ u.username }}</strong>{% if u.name %} <span class="muted">· {{ u.name }}</span>{% endif %}</td>
<td class="muted">{{ u.email or '—' }}</td>
<td class="muted" style="font-size:.85rem">{{ u.group_names|join(', ') if u.group_names else '—' }}</td>
<td>{% if u.active %}<span style="color:var(--accent)">aktiv</span>{% else %}<span class="muted">inaktiv</span>{% endif %}</td>
<td><a href="/admin/users/{{ u.pk }}">Rediger →</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}