diff options
Diffstat (limited to 'management')
| -rw-r--r-- | management/__init__.py | 0 | ||||
| -rw-r--r-- | management/endpoints.py | 50 | ||||
| -rw-r--r-- | management/templates/base.html | 7 | ||||
| -rw-r--r-- | management/templates/dashboard.html | 9 | ||||
| -rw-r--r-- | management/templates/users.html | 11 |
5 files changed, 77 insertions, 0 deletions
diff --git a/management/__init__.py b/management/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/management/__init__.py | |||
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 @@ | |||
| 1 | from fastapi import FastAPI, Request | ||
| 2 | from sqlalchemy import func | ||
| 3 | from sqlmodel import select | ||
| 4 | from starlette.authentication import requires | ||
| 5 | from starlette.middleware.authentication import AuthenticationMiddleware | ||
| 6 | from starlette.middleware.sessions import SessionMiddleware | ||
| 7 | from starlette.responses import RedirectResponse | ||
| 8 | from starlette.templating import Jinja2Templates | ||
| 9 | |||
| 10 | import conf | ||
| 11 | from authentication.backend import SessionAuthBackend | ||
| 12 | from db.models import User | ||
| 13 | from db.session import get_session_context | ||
| 14 | |||
| 15 | management = FastAPI() | ||
| 16 | management.add_middleware(AuthenticationMiddleware, backend=SessionAuthBackend()) | ||
| 17 | management.add_middleware(SessionMiddleware, secret_key=conf.SECRET_KEY) | ||
| 18 | |||
| 19 | templates = Jinja2Templates(directory=[ | ||
| 20 | 'templates', | ||
| 21 | 'management/templates' | ||
| 22 | ]) | ||
| 23 | |||
| 24 | @management.get('/') | ||
| 25 | async def index(request: Request): | ||
| 26 | with get_session_context() as session: | ||
| 27 | query = select(func.count(User.id)) | ||
| 28 | user_count = session.exec(query) | ||
| 29 | |||
| 30 | if user_count.first() == 0: | ||
| 31 | return RedirectResponse('/auth/register/?next=/management/dashboard/', status_code=303) | ||
| 32 | |||
| 33 | return RedirectResponse('/management/dashboard/', status_code=303) | ||
| 34 | |||
| 35 | |||
| 36 | @management.get('/dashboard/') | ||
| 37 | @requires(['authenticated', 'session'], redirect='get_login') | ||
| 38 | async def dashboard(request: Request): | ||
| 39 | return templates.TemplateResponse(request, 'dashboard.html') | ||
| 40 | |||
| 41 | @management.get('/users/') | ||
| 42 | @requires(['authenticated', 'session'], redirect='get_login') | ||
| 43 | async def users(request: Request): | ||
| 44 | with get_session_context() as session: | ||
| 45 | query = select(User) | ||
| 46 | users = session.exec(query).all() | ||
| 47 | |||
| 48 | return templates.TemplateResponse(request, 'users.html', context={ | ||
| 49 | 'users': users | ||
| 50 | }) | ||
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 @@ | |||
| 1 | {% extends 'global.html' %} | ||
| 2 | {% block template %} | ||
| 3 | <nav> | ||
| 4 | <a href="/auth/logout/">Logout</a> | ||
| 5 | </nav> | ||
| 6 | {% block content %}{% endblock %} | ||
| 7 | {% 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 @@ | |||
| 1 | {% extends 'base.html' %} | ||
| 2 | |||
| 3 | {% block content %} | ||
| 4 | <div> | ||
| 5 | <ul> | ||
| 6 | <li><a href="/management/users/">Users</a></li> | ||
| 7 | </ul> | ||
| 8 | </div> | ||
| 9 | {% 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 @@ | |||
| 1 | {% extends 'base.html' %} | ||
| 2 | |||
| 3 | {% block content %} | ||
| 4 | <div> | ||
| 5 | <ul> | ||
| 6 | {% for user in users %} | ||
| 7 | <li>{{ user.username }}</li> | ||
| 8 | {% endfor %} | ||
| 9 | </ul> | ||
| 10 | </div> | ||
| 11 | {% endblock %} | ||
