From f28781dd1dd718f45bf1cef82d1ce6eb4792b4ca Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Wed, 22 Jul 2026 17:37:10 +0200 Subject: Added management interface --- management/__init__.py | 0 management/endpoints.py | 50 +++++++++++++++++++++++++++++++++++++ management/templates/base.html | 7 ++++++ management/templates/dashboard.html | 9 +++++++ management/templates/users.html | 11 ++++++++ 5 files changed, 77 insertions(+) create mode 100644 management/__init__.py create mode 100644 management/endpoints.py create mode 100644 management/templates/base.html create mode 100644 management/templates/dashboard.html create mode 100644 management/templates/users.html (limited to 'management') diff --git a/management/__init__.py b/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/management/endpoints.py b/management/endpoints.py new file mode 100644 index 0000000..47602d6 --- /dev/null +++ b/management/endpoints.py @@ -0,0 +1,50 @@ +from fastapi import FastAPI, Request +from sqlalchemy import func +from sqlmodel import select +from starlette.authentication import requires +from starlette.middleware.authentication import AuthenticationMiddleware +from starlette.middleware.sessions import SessionMiddleware +from starlette.responses import RedirectResponse +from starlette.templating import Jinja2Templates + +import conf +from authentication.backend import SessionAuthBackend +from db.models import User +from db.session import get_session_context + +management = FastAPI() +management.add_middleware(AuthenticationMiddleware, backend=SessionAuthBackend()) +management.add_middleware(SessionMiddleware, secret_key=conf.SECRET_KEY) + +templates = Jinja2Templates(directory=[ + 'templates', + 'management/templates' +]) + +@management.get('/') +async def index(request: Request): + with get_session_context() as session: + query = select(func.count(User.id)) + user_count = session.exec(query) + + if user_count.first() == 0: + return RedirectResponse('/auth/register/?next=/management/dashboard/', status_code=303) + + return RedirectResponse('/management/dashboard/', status_code=303) + + +@management.get('/dashboard/') +@requires(['authenticated', 'session'], redirect='get_login') +async def dashboard(request: Request): + return templates.TemplateResponse(request, 'dashboard.html') + +@management.get('/users/') +@requires(['authenticated', 'session'], redirect='get_login') +async def users(request: Request): + with get_session_context() as session: + query = select(User) + users = session.exec(query).all() + + return templates.TemplateResponse(request, 'users.html', context={ + 'users': users + }) diff --git a/management/templates/base.html b/management/templates/base.html new file mode 100644 index 0000000..0b9da11 --- /dev/null +++ b/management/templates/base.html @@ -0,0 +1,7 @@ +{% extends 'global.html' %} +{% block template %} + + {% block content %}{% endblock %} +{% endblock %} diff --git a/management/templates/dashboard.html b/management/templates/dashboard.html new file mode 100644 index 0000000..201aa48 --- /dev/null +++ b/management/templates/dashboard.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %} + +{% block content %} +
+ +
+{% endblock %} diff --git a/management/templates/users.html b/management/templates/users.html new file mode 100644 index 0000000..272d2b4 --- /dev/null +++ b/management/templates/users.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} + +{% block content %} +
+ +
+{% endblock %} -- cgit v1.2.3