From 96358423dfa2687dd976a0dd9c9e4559e70e72b9 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Fri, 3 Jul 2026 10:13:04 +0200 Subject: [PATCH] feat(admin): add /admin user list page --- src/pages/admin/__init__.py | 0 src/pages/admin/_shell.py | 19 ++++++++++++ src/pages/admin/liste.py | 62 +++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 src/pages/admin/__init__.py create mode 100644 src/pages/admin/_shell.py create mode 100644 src/pages/admin/liste.py diff --git a/src/pages/admin/__init__.py b/src/pages/admin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/admin/_shell.py b/src/pages/admin/_shell.py new file mode 100644 index 0000000..0b724f0 --- /dev/null +++ b/src/pages/admin/_shell.py @@ -0,0 +1,19 @@ +import dash_bootstrap_components as dbc +from dash import html + + +def not_admin(): + return html.Div( + html.H2("404", id="admin-404-heading"), className="py-5 text-center" + ) + + +def admin_nav(active: str): + return dbc.Nav( + [ + dbc.NavLink("Utilisateurs", href="/admin", active=(active == "liste")), + dbc.NavLink("Journal", href="/admin/journal", active=(active == "journal")), + ], + pills=True, + class_name="mb-4", + ) diff --git a/src/pages/admin/liste.py b/src/pages/admin/liste.py new file mode 100644 index 0000000..2c0442b --- /dev/null +++ b/src/pages/admin/liste.py @@ -0,0 +1,62 @@ +import dash_bootstrap_components as dbc +from dash import dash_table, html, register_page + +from src.admin.guard import is_admin +from src.auth.db import list_users +from src.pages.admin._shell import admin_nav, not_admin +from src.subscriptions.db import get_current + +register_page( + __name__, + path="/admin", + title="Panneau admin | colibre", + name="Admin", + description="Panneau d'administration interne.", +) + + +def _rows(): + rows = [] + for user in list_users(): + sub = get_current(user["id"]) + rows.append( + { + "email": user["email"], + "vérifié": "oui" if user["email_verified"] else "non", + "plan": sub["plan"] if sub else "", + "statut": sub["status"] if sub else "", + "créé le": user["created_at"], + "voir": f"[Voir](/admin/user/{user['id']})", + } + ) + return rows + + +def layout(**_): + if not is_admin(): + return not_admin() + return dbc.Container( + [ + html.H2("Panneau admin"), + admin_nav("liste"), + dash_table.DataTable( + id="admin-users-table", + columns=[ + {"name": "Email", "id": "email"}, + {"name": "Vérifié", "id": "vérifié"}, + {"name": "Plan", "id": "plan"}, + {"name": "Statut", "id": "statut"}, + {"name": "Créé le", "id": "créé le"}, + {"name": "", "id": "voir", "presentation": "markdown"}, + ], + data=_rows(), + filter_action="native", + sort_action="native", + page_action="native", + page_size=20, + markdown_options={"link_target": "_self"}, + ), + ], + fluid=True, + className="py-4", + )