summaryrefslogtreecommitdiffstats
path: root/management
diff options
context:
space:
mode:
Diffstat (limited to 'management')
-rw-r--r--management/__init__.py0
-rw-r--r--management/endpoints.py50
-rw-r--r--management/templates/base.html7
-rw-r--r--management/templates/dashboard.html9
-rw-r--r--management/templates/users.html11
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 @@
1from fastapi import FastAPI, Request
2from sqlalchemy import func
3from sqlmodel import select
4from starlette.authentication import requires
5from starlette.middleware.authentication import AuthenticationMiddleware
6from starlette.middleware.sessions import SessionMiddleware
7from starlette.responses import RedirectResponse
8from starlette.templating import Jinja2Templates
9
10import conf
11from authentication.backend import SessionAuthBackend
12from db.models import User
13from db.session import get_session_context
14
15management = FastAPI()
16management.add_middleware(AuthenticationMiddleware, backend=SessionAuthBackend())
17management.add_middleware(SessionMiddleware, secret_key=conf.SECRET_KEY)
18
19templates = Jinja2Templates(directory=[
20 'templates',
21 'management/templates'
22])
23
24@management.get('/')
25async 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')
38async def dashboard(request: Request):
39 return templates.TemplateResponse(request, 'dashboard.html')
40
41@management.get('/users/')
42@requires(['authenticated', 'session'], redirect='get_login')
43async 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 %}