feat: Migrate site to python3 dashboard
All checks were successful
Check Code Quality / RuffCheck (push) Successful in 1m3s
Build Docker / BuildImage (push) Successful in 1m5s

This commit is contained in:
2026-02-11 14:18:34 +11:00
parent 11abe34d5b
commit 6efc480e70
101 changed files with 1876 additions and 15776 deletions

21
templates/404.html Normal file
View File

@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nathan.Woodburn/</title>
<link rel="icon" href="/assets/img/favicon.png" type="image/png">
<link rel="stylesheet" href="/assets/css/404.css">
</head>
<body>
<div class="spacer"></div>
<div class="centre">
<h1>404 | Page not found</h1>
<p>Sorry, the page you are looking for does not exist.</p>
<p><a href="/">Go back to the homepage</a></p>
</div>
</body>
</html>

22
templates/500.html Normal file
View File

@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nathan.Woodburn/</title>
<link rel="icon" href="/assets/img/favicon.png" type="image/png">
<link rel="stylesheet" href="/assets/css/500.css">
</head>
<body>
<div class="spacer"></div>
<div class="centre">
<h1>500 | Internal Server Error</h1>
<p>Sorry, something went wrong on our end.</p>
<p class="code">{{ message }}</p>
<p><a href="/">Go back to the homepage</a></p>
</div>
</body>
</html>

View File

@@ -0,0 +1,20 @@
body {
background-color: #000000;
color: #ffffff;
}
h1 {
font-size: 50px;
margin: 0;
padding: 0;
}
.centre {
margin-top: 10%;
text-align: center;
}
a {
color: #ffffff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}

View File

@@ -0,0 +1,28 @@
body {
background-color: #000000;
color: #ffffff;
}
h1 {
font-size: 50px;
margin: 0;
padding: 0;
}
.centre {
margin-top: 10%;
text-align: center;
}
a {
color: #ffffff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.code {
font-family: "Courier New", Courier, monospace;
background-color: #222222;
padding: 10px;
border-radius: 5px;
display: inline-block;
margin-top: 20px;
}

View File

@@ -0,0 +1,97 @@
body {
background-color: #000000;
color: #ffffff;
}
h1 {
font-size: 50px;
margin: 0;
padding: 0;
}
.centre {
margin-top: max(5%, 50px);
text-align: center;
}
a {
color: #ffffff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.services-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
max-width: 800px;
margin: 20px auto;
padding: 20px;
}
.service-card {
background-color: #222;
padding: 20px;
border-radius: 8px;
text-align: center;
transition: transform 0.2s, background-color 0.2s;
border: 1px solid #333;
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
}
.service-card:hover {
transform: translateY(-5px);
background-color: #333;
}
.service-icon {
width: 48px;
height: 48px;
object-fit: contain;
margin-bottom: 10px;
}
.service-name {
font-size: 1.2em;
font-weight: bold;
color: #fff;
margin: 0;
}
.service-desc {
font-size: 0.9em;
color: #aaa;
margin: 0;
}
.section-title {
text-align: center;
margin-top: 40px;
color: #888;
text-transform: uppercase;
letter-spacing: 2px;
font-size: 0.9em;
}
.auth-status {
position: absolute;
top: 20px;
right: 20px;
}
.btn {
padding: 8px 16px;
border-radius: 4px;
background-color: #333;
color: white;
border: none;
cursor: pointer;
font-size: 14px;
}
.btn:hover {
background-color: #444;
text-decoration: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

53
templates/index.html Normal file
View File

@@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Woodburn/</title>
<link rel="icon" href="/assets/img/favicon.png" type="image/png">
<link rel="stylesheet" href="/assets/css/index.css">
</head>
<body>
<div class="auth-status">
{% if user %}
<span>Hello, {{ user.preferred_username | title or user.name or user.email }}</span>
<a href="/logout" class="btn">Logout</a>
{% else %}
<a href="/login" class="btn">Login</a>
{% endif %}
</div>
<div class="centre">
<h1>Woodburn/</h1>
<span>{{ datetime }}</span>
</div>
<div class="container">
<h3 class="section-title">External Services</h3>
<div class="services-grid">
{% for service in services.external %}
<a href="{{ service.url }}" class="service-card" target="_blank">
<img src="/services/external/{{ service.id }}.png" alt="{{ service.name }}" class="service-icon">
<h4 class="service-name">{{ service.name }}</h4>
<p class="service-desc">{{ service.description }}</p>
</a>
{% endfor %}
</div>
{% if user %}
<h3 class="section-title">Internal Services</h3>
<div class="services-grid">
{% for service in services.internal %}
<a href="{{ service.url }}" class="service-card" target="_blank">
<img src="/services/internal/{{ service.id }}.png" alt="{{ service.name }}" class="service-icon">
<h4 class="service-name">{{ service.name }}</h4>
<p class="service-desc">{{ service.description }}</p>
</a>
{% endfor %}
</div>
{% endif %}
</div>
</body>
</html>