vibetuner 2.26.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vibetuner/__init__.py +2 -0
- vibetuner/__main__.py +4 -0
- vibetuner/cli/__init__.py +141 -0
- vibetuner/cli/run.py +160 -0
- vibetuner/cli/scaffold.py +187 -0
- vibetuner/config.py +143 -0
- vibetuner/context.py +28 -0
- vibetuner/frontend/__init__.py +107 -0
- vibetuner/frontend/deps.py +41 -0
- vibetuner/frontend/email.py +45 -0
- vibetuner/frontend/hotreload.py +13 -0
- vibetuner/frontend/lifespan.py +37 -0
- vibetuner/frontend/middleware.py +151 -0
- vibetuner/frontend/oauth.py +196 -0
- vibetuner/frontend/routes/__init__.py +12 -0
- vibetuner/frontend/routes/auth.py +156 -0
- vibetuner/frontend/routes/debug.py +414 -0
- vibetuner/frontend/routes/health.py +37 -0
- vibetuner/frontend/routes/language.py +43 -0
- vibetuner/frontend/routes/meta.py +55 -0
- vibetuner/frontend/routes/user.py +94 -0
- vibetuner/frontend/templates.py +176 -0
- vibetuner/logging.py +87 -0
- vibetuner/models/__init__.py +14 -0
- vibetuner/models/blob.py +89 -0
- vibetuner/models/email_verification.py +84 -0
- vibetuner/models/mixins.py +76 -0
- vibetuner/models/oauth.py +57 -0
- vibetuner/models/registry.py +15 -0
- vibetuner/models/types.py +16 -0
- vibetuner/models/user.py +91 -0
- vibetuner/mongo.py +33 -0
- vibetuner/paths.py +250 -0
- vibetuner/services/__init__.py +0 -0
- vibetuner/services/blob.py +175 -0
- vibetuner/services/email.py +50 -0
- vibetuner/tasks/__init__.py +0 -0
- vibetuner/tasks/lifespan.py +28 -0
- vibetuner/tasks/worker.py +15 -0
- vibetuner/templates/email/magic_link.html.jinja +17 -0
- vibetuner/templates/email/magic_link.txt.jinja +5 -0
- vibetuner/templates/frontend/base/favicons.html.jinja +1 -0
- vibetuner/templates/frontend/base/footer.html.jinja +3 -0
- vibetuner/templates/frontend/base/header.html.jinja +0 -0
- vibetuner/templates/frontend/base/opengraph.html.jinja +7 -0
- vibetuner/templates/frontend/base/skeleton.html.jinja +45 -0
- vibetuner/templates/frontend/debug/collections.html.jinja +105 -0
- vibetuner/templates/frontend/debug/components/debug_nav.html.jinja +55 -0
- vibetuner/templates/frontend/debug/index.html.jinja +85 -0
- vibetuner/templates/frontend/debug/info.html.jinja +258 -0
- vibetuner/templates/frontend/debug/users.html.jinja +139 -0
- vibetuner/templates/frontend/debug/version.html.jinja +55 -0
- vibetuner/templates/frontend/email/magic_link.txt.jinja +5 -0
- vibetuner/templates/frontend/email_sent.html.jinja +83 -0
- vibetuner/templates/frontend/index.html.jinja +20 -0
- vibetuner/templates/frontend/lang/select.html.jinja +4 -0
- vibetuner/templates/frontend/login.html.jinja +89 -0
- vibetuner/templates/frontend/meta/browserconfig.xml.jinja +10 -0
- vibetuner/templates/frontend/meta/robots.txt.jinja +3 -0
- vibetuner/templates/frontend/meta/site.webmanifest.jinja +7 -0
- vibetuner/templates/frontend/meta/sitemap.xml.jinja +6 -0
- vibetuner/templates/frontend/user/edit.html.jinja +86 -0
- vibetuner/templates/frontend/user/profile.html.jinja +157 -0
- vibetuner/templates/markdown/.placeholder +0 -0
- vibetuner/templates.py +146 -0
- vibetuner/time.py +57 -0
- vibetuner/versioning.py +12 -0
- vibetuner-2.26.6.dist-info/METADATA +241 -0
- vibetuner-2.26.6.dist-info/RECORD +71 -0
- vibetuner-2.26.6.dist-info/WHEEL +4 -0
- vibetuner-2.26.6.dist-info/entry_points.txt +3 -0
|
File without changes
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{% set page_title = self.title() if self.title is defined else project_name.title() %}
|
|
2
|
+
<meta name="twitter:card" content="summary" />
|
|
3
|
+
<meta name="twitter:title" content="{{ page_title }}" />
|
|
4
|
+
<meta property="og:type" content="website" />
|
|
5
|
+
<meta property="og:url" content="{{ request.url }}" />
|
|
6
|
+
<meta property="og:description" content="{{ project_description }}" />
|
|
7
|
+
<meta property="og:title" content="{{ page_title }}" />
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="{{ request.state.language }}">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta name="description" content="{{ meta_description | default('') }}" />
|
|
7
|
+
<meta name="keywords" content="{{ meta_keywords | default('') }}" />
|
|
8
|
+
<meta name="color-scheme" content="light" />
|
|
9
|
+
<title>
|
|
10
|
+
{% block title %}
|
|
11
|
+
{% endblock title %}
|
|
12
|
+
</title>
|
|
13
|
+
<link rel="stylesheet" href="{{ url_for('css', path='bundle.css').path }}" />
|
|
14
|
+
<script src="{{ url_for('js', path='bundle.js').path }}"></script>
|
|
15
|
+
{% if umami_website_id and not DEBUG %}
|
|
16
|
+
<script defer src="/meta.js" data-website-id="{{ umami_website_id }}"></script>
|
|
17
|
+
{% endif %}
|
|
18
|
+
{% include "base/favicons.html.jinja" %}
|
|
19
|
+
{% include "base/opengraph.html.jinja" %}
|
|
20
|
+
|
|
21
|
+
{% block head %}
|
|
22
|
+
{% endblock head %}
|
|
23
|
+
</head>
|
|
24
|
+
<body hx-ext="preload" preload="mousedown" class="{{ BODY_CLASS }}">
|
|
25
|
+
{% block start_of_body %}
|
|
26
|
+
{% endblock start_of_body %}
|
|
27
|
+
{% block header %}
|
|
28
|
+
{% if not SKIP_HEADER %}
|
|
29
|
+
{% include "base/header.html.jinja" %}
|
|
30
|
+
|
|
31
|
+
{% endif %}
|
|
32
|
+
{% endblock header %}
|
|
33
|
+
{% block body %}
|
|
34
|
+
{% endblock body %}
|
|
35
|
+
{% block footer %}
|
|
36
|
+
{% if not SKIP_FOOTER %}
|
|
37
|
+
{% include "base/footer.html.jinja" %}
|
|
38
|
+
|
|
39
|
+
{% endif %}
|
|
40
|
+
{% endblock footer %}
|
|
41
|
+
{% if DEBUG %}{{ hotreload.script(url_for('hot-reload') ) | safe }}{% endif %}
|
|
42
|
+
{% block end_of_body %}
|
|
43
|
+
{% endblock end_of_body %}
|
|
44
|
+
</body>
|
|
45
|
+
</html>
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{% extends "base/skeleton.html.jinja" %}
|
|
2
|
+
|
|
3
|
+
{% block title %}
|
|
4
|
+
Database Collections Schema - Debug
|
|
5
|
+
{% endblock title %}
|
|
6
|
+
{% block body %}
|
|
7
|
+
<div class="container mx-auto px-4 py-8 max-w-6xl">
|
|
8
|
+
<!-- Header -->
|
|
9
|
+
<header class="mb-8">
|
|
10
|
+
<h1 class="text-4xl font-bold text-base-content mb-2">Database Collections Schema</h1>
|
|
11
|
+
<p class="text-base-content/70">Overview of all MongoDB collections and their field schemas</p>
|
|
12
|
+
</header>
|
|
13
|
+
<!-- Collections Grid -->
|
|
14
|
+
<div class="grid gap-6">
|
|
15
|
+
{% for collection in collections %}
|
|
16
|
+
<div class="card bg-base-100 shadow-xl border border-base-200">
|
|
17
|
+
<div class="card-body">
|
|
18
|
+
<!-- Collection Header -->
|
|
19
|
+
<div class="flex items-center justify-between mb-4">
|
|
20
|
+
<div>
|
|
21
|
+
<h2 class="card-title text-2xl text-primary">{{ collection.name }}</h2>
|
|
22
|
+
<p class="text-sm text-base-content/60">Model: {{ collection.model_name }}</p>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="badge badge-secondary">{{ collection.total_fields }} fields</div>
|
|
25
|
+
</div>
|
|
26
|
+
<!-- Fields Table -->
|
|
27
|
+
<div class="overflow-x-auto">
|
|
28
|
+
<table class="table table-zebra w-full">
|
|
29
|
+
<thead>
|
|
30
|
+
<tr>
|
|
31
|
+
<th class="text-left w-48">Field Name</th>
|
|
32
|
+
<th class="text-left min-w-64">Type</th>
|
|
33
|
+
<th class="text-left">Description</th>
|
|
34
|
+
<th class="text-center w-24">Required</th>
|
|
35
|
+
<th class="text-left w-48">Constraints</th>
|
|
36
|
+
</tr>
|
|
37
|
+
</thead>
|
|
38
|
+
<tbody>
|
|
39
|
+
{% for field in collection.fields %}
|
|
40
|
+
<tr class="align-top">
|
|
41
|
+
<td>
|
|
42
|
+
<code class="text-sm bg-base-200 px-2 py-1 rounded font-mono">{{ field.name }}</code>
|
|
43
|
+
</td>
|
|
44
|
+
<td>
|
|
45
|
+
<div class="font-mono text-xs text-base-content/90 max-w-xs overflow-hidden break-all leading-tight">
|
|
46
|
+
{{ field.type }}
|
|
47
|
+
</div>
|
|
48
|
+
</td>
|
|
49
|
+
<td>
|
|
50
|
+
{% if field.description %}
|
|
51
|
+
<div class="text-xs text-base-content/80 max-w-xs leading-tight">{{ field.description }}</div>
|
|
52
|
+
{% else %}
|
|
53
|
+
<span class="text-xs text-base-content/40 italic">No description</span>
|
|
54
|
+
{% endif %}
|
|
55
|
+
</td>
|
|
56
|
+
<td class="text-center">
|
|
57
|
+
{% if field.required %}
|
|
58
|
+
<span class="badge badge-error badge-xs min-w-fit">Required</span>
|
|
59
|
+
{% else %}
|
|
60
|
+
<span class="badge badge-ghost badge-xs min-w-fit">Optional</span>
|
|
61
|
+
{% endif %}
|
|
62
|
+
</td>
|
|
63
|
+
<td>
|
|
64
|
+
{% if field.extra %}
|
|
65
|
+
<div class="flex flex-wrap gap-1">
|
|
66
|
+
{% for key, value in field.extra.items() %}
|
|
67
|
+
{% if key == "enum" %}
|
|
68
|
+
<div class="tooltip" data-tip="Values: {{ value | join(", ") }}">
|
|
69
|
+
<span class="badge badge-info badge-xs min-w-fit">enum({{ value | length }})</span>
|
|
70
|
+
</div>
|
|
71
|
+
{% elif key == "enum_count" %}
|
|
72
|
+
<span class="badge badge-info badge-xs min-w-fit">enum({{ value }})</span>
|
|
73
|
+
{% elif key == "default" %}
|
|
74
|
+
<div class="tooltip" data-tip="Default: {{ value }}">
|
|
75
|
+
<span class="badge badge-success badge-xs min-w-fit">default</span>
|
|
76
|
+
</div>
|
|
77
|
+
{% elif key == "format" %}
|
|
78
|
+
<span class="badge badge-warning badge-xs min-w-fit">{{ value }}</span>
|
|
79
|
+
{% elif key == "pattern" %}
|
|
80
|
+
<div class="tooltip" data-tip="{{ value }}">
|
|
81
|
+
<span class="badge badge-accent badge-xs min-w-fit">regex</span>
|
|
82
|
+
</div>
|
|
83
|
+
{% elif key in ["min", "max", "min_length", "max_length"] %}
|
|
84
|
+
<span class="badge badge-neutral badge-xs min-w-fit">{{ key.replace('_', ' ') }}: {{ value }}</span>
|
|
85
|
+
{% endif %}
|
|
86
|
+
{% endfor %}
|
|
87
|
+
</div>
|
|
88
|
+
{% else %}
|
|
89
|
+
<span class="text-xs text-base-content/40">-</span>
|
|
90
|
+
{% endif %}
|
|
91
|
+
</td>
|
|
92
|
+
</tr>
|
|
93
|
+
{% endfor %}
|
|
94
|
+
</tbody>
|
|
95
|
+
</table>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
{% endfor %}
|
|
100
|
+
</div>
|
|
101
|
+
<!-- Debug Navigation Footer -->
|
|
102
|
+
{% include "debug/components/debug_nav.html.jinja" %}
|
|
103
|
+
|
|
104
|
+
</div>
|
|
105
|
+
{% endblock body %}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<!-- Debug Navigation Component -->
|
|
2
|
+
<nav class="mt-8 pt-6 border-t border-base-200">
|
|
3
|
+
<div class="flex flex-wrap gap-4">
|
|
4
|
+
<a href="{{ url_for('debug_index') }}"
|
|
5
|
+
class="btn btn-outline btn-primary gap-2">
|
|
6
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
7
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2H5a2 2 0 00-2-2z">
|
|
8
|
+
</path>
|
|
9
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 5a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H10a2 2 0 01-2-2V5z">
|
|
10
|
+
</path>
|
|
11
|
+
</svg>
|
|
12
|
+
Debug Home
|
|
13
|
+
</a>
|
|
14
|
+
<a href="{{ url_for('debug_info') }}"
|
|
15
|
+
class="btn btn-outline btn-primary gap-2">
|
|
16
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
17
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z">
|
|
18
|
+
</path>
|
|
19
|
+
</svg>
|
|
20
|
+
System Info
|
|
21
|
+
</a>
|
|
22
|
+
<a href="{{ url_for('debug_collections') }}"
|
|
23
|
+
class="btn btn-outline btn-primary gap-2">
|
|
24
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
25
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4">
|
|
26
|
+
</path>
|
|
27
|
+
</svg>
|
|
28
|
+
Collections
|
|
29
|
+
</a>
|
|
30
|
+
<a href="{{ url_for('debug_users') }}"
|
|
31
|
+
class="btn btn-outline btn-warning gap-2">
|
|
32
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
33
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z">
|
|
34
|
+
</path>
|
|
35
|
+
</svg>
|
|
36
|
+
User Impersonation
|
|
37
|
+
</a>
|
|
38
|
+
<a href="{{ url_for('debug_version') }}"
|
|
39
|
+
class="btn btn-outline btn-primary gap-2">
|
|
40
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
41
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z">
|
|
42
|
+
</path>
|
|
43
|
+
</svg>
|
|
44
|
+
Version
|
|
45
|
+
</a>
|
|
46
|
+
<a href="{{ url_for('health_ping') }}"
|
|
47
|
+
class="btn btn-outline btn-success gap-2">
|
|
48
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
49
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z">
|
|
50
|
+
</path>
|
|
51
|
+
</svg>
|
|
52
|
+
Health Check
|
|
53
|
+
</a>
|
|
54
|
+
</div>
|
|
55
|
+
</nav>
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{% extends "base/skeleton.html.jinja" %}
|
|
2
|
+
|
|
3
|
+
{% block title %}
|
|
4
|
+
Debug Dashboard
|
|
5
|
+
{% endblock title %}
|
|
6
|
+
{% block body %}
|
|
7
|
+
<div class="container mx-auto px-4 py-8 max-w-4xl">
|
|
8
|
+
<!-- Header -->
|
|
9
|
+
<header class="mb-8">
|
|
10
|
+
<h1 class="text-4xl font-bold text-base-content mb-2">Debug Dashboard</h1>
|
|
11
|
+
<p class="text-base-content/70">Development and debugging tools for {{ project_name }}</p>
|
|
12
|
+
</header>
|
|
13
|
+
<!-- Debug Tools Grid -->
|
|
14
|
+
<div class="grid md:grid-cols-2 gap-6">
|
|
15
|
+
<!-- System Information -->
|
|
16
|
+
<div class="card bg-base-100 shadow-xl border border-base-200 hover:shadow-2xl transition-shadow">
|
|
17
|
+
<div class="card-body">
|
|
18
|
+
<h2 class="card-title text-primary flex items-center gap-2">
|
|
19
|
+
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
20
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z">
|
|
21
|
+
</path>
|
|
22
|
+
</svg>
|
|
23
|
+
System Information
|
|
24
|
+
</h2>
|
|
25
|
+
<p class="text-base-content/70 mb-4">View application configuration, cookies, and runtime information</p>
|
|
26
|
+
<div class="card-actions justify-end">
|
|
27
|
+
<a href="{{ url_for('debug_info') }}" class="btn btn-primary btn-sm">View Details</a>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<!-- Database Collections -->
|
|
32
|
+
<div class="card bg-base-100 shadow-xl border border-base-200 hover:shadow-2xl transition-shadow">
|
|
33
|
+
<div class="card-body">
|
|
34
|
+
<h2 class="card-title text-primary flex items-center gap-2">
|
|
35
|
+
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
36
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4">
|
|
37
|
+
</path>
|
|
38
|
+
</svg>
|
|
39
|
+
Database Collections
|
|
40
|
+
</h2>
|
|
41
|
+
<p class="text-base-content/70 mb-4">Explore MongoDB collections and their field schemas</p>
|
|
42
|
+
<div class="card-actions justify-end">
|
|
43
|
+
<a href="{{ url_for('debug_collections') }}"
|
|
44
|
+
class="btn btn-primary btn-sm">View Schemas</a>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
<!-- Version Information -->
|
|
49
|
+
<div class="card bg-base-100 shadow-xl border border-base-200 hover:shadow-2xl transition-shadow">
|
|
50
|
+
<div class="card-body">
|
|
51
|
+
<h2 class="card-title text-primary flex items-center gap-2">
|
|
52
|
+
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
53
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z">
|
|
54
|
+
</path>
|
|
55
|
+
</svg>
|
|
56
|
+
Version Information
|
|
57
|
+
</h2>
|
|
58
|
+
<p class="text-base-content/70 mb-4">Check application version and build information</p>
|
|
59
|
+
<div class="card-actions justify-end">
|
|
60
|
+
<a href="{{ url_for('debug_version') }}" class="btn btn-primary btn-sm">View Version</a>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
<!-- Health Check -->
|
|
65
|
+
<div class="card bg-base-100 shadow-xl border border-base-200 hover:shadow-2xl transition-shadow">
|
|
66
|
+
<div class="card-body">
|
|
67
|
+
<h2 class="card-title text-success flex items-center gap-2">
|
|
68
|
+
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
69
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z">
|
|
70
|
+
</path>
|
|
71
|
+
</svg>
|
|
72
|
+
Health Check
|
|
73
|
+
</h2>
|
|
74
|
+
<p class="text-base-content/70 mb-4">Verify application health and API endpoint status</p>
|
|
75
|
+
<div class="card-actions justify-end">
|
|
76
|
+
<a href="{{ url_for('health_ping') }}" class="btn btn-success btn-sm">Check Health</a>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
<!-- Debug Navigation Footer -->
|
|
82
|
+
{% include "debug/components/debug_nav.html.jinja" %}
|
|
83
|
+
|
|
84
|
+
</div>
|
|
85
|
+
{% endblock body %}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
{% extends "base/skeleton.html.jinja" %}
|
|
2
|
+
|
|
3
|
+
{% block title %}
|
|
4
|
+
System Information - Debug
|
|
5
|
+
{% endblock title %}
|
|
6
|
+
{% block body %}
|
|
7
|
+
<div class="container mx-auto px-4 py-8 max-w-6xl">
|
|
8
|
+
<!-- Header -->
|
|
9
|
+
<header class="mb-8">
|
|
10
|
+
<h1 class="text-4xl font-bold text-base-content mb-2">System Information</h1>
|
|
11
|
+
<p class="text-base-content/70">Application configuration, runtime details, and session data</p>
|
|
12
|
+
</header>
|
|
13
|
+
<!-- Stats Overview -->
|
|
14
|
+
<div class="stats stats-vertical sm:stats-horizontal shadow-xl border border-base-200 mb-8 w-full">
|
|
15
|
+
<div class="stat">
|
|
16
|
+
<div class="stat-figure text-primary">
|
|
17
|
+
<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
18
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z">
|
|
19
|
+
</path>
|
|
20
|
+
</svg>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="stat-title">Version</div>
|
|
23
|
+
<div class="stat-value text-primary">{{ version }}</div>
|
|
24
|
+
<div class="stat-desc">Build {{ v_hash[:8] }}</div>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="stat">
|
|
27
|
+
<div class="stat-figure text-secondary">
|
|
28
|
+
<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
29
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129">
|
|
30
|
+
</path>
|
|
31
|
+
</svg>
|
|
32
|
+
</div>
|
|
33
|
+
<div class="stat-title">Languages</div>
|
|
34
|
+
<div class="stat-value text-secondary">{{ supported_languages | length }}</div>
|
|
35
|
+
<div class="stat-desc">{{ default_language }} default</div>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="stat">
|
|
38
|
+
<div class="stat-figure">
|
|
39
|
+
{% if DEBUG %}
|
|
40
|
+
<div class="badge badge-warning gap-1">
|
|
41
|
+
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
42
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z">
|
|
43
|
+
</path>
|
|
44
|
+
</svg>
|
|
45
|
+
DEBUG
|
|
46
|
+
</div>
|
|
47
|
+
{% else %}
|
|
48
|
+
<div class="badge badge-success gap-1">
|
|
49
|
+
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
50
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z">
|
|
51
|
+
</path>
|
|
52
|
+
</svg>
|
|
53
|
+
PROD
|
|
54
|
+
</div>
|
|
55
|
+
{% endif %}
|
|
56
|
+
</div>
|
|
57
|
+
<div class="stat-title">Mode</div>
|
|
58
|
+
<div class="stat-value">{{ "Debug" if DEBUG else "Production" }}</div>
|
|
59
|
+
<div class="stat-desc">{{ "Development" if DEBUG else "Live" }} environment</div>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
<!-- Project Configuration -->
|
|
63
|
+
<div class="card bg-base-100 shadow-xl border border-base-200 mb-6">
|
|
64
|
+
<div class="card-body">
|
|
65
|
+
<h2 class="card-title text-primary flex items-center gap-2 mb-6">
|
|
66
|
+
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
67
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z">
|
|
68
|
+
</path>
|
|
69
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
|
70
|
+
</svg>
|
|
71
|
+
Project Configuration
|
|
72
|
+
</h2>
|
|
73
|
+
<div class="overflow-x-auto">
|
|
74
|
+
<table class="table table-zebra">
|
|
75
|
+
<thead>
|
|
76
|
+
<tr>
|
|
77
|
+
<th class="font-bold">Setting</th>
|
|
78
|
+
<th class="font-bold">Value</th>
|
|
79
|
+
</tr>
|
|
80
|
+
</thead>
|
|
81
|
+
<tbody>
|
|
82
|
+
<tr>
|
|
83
|
+
<td>
|
|
84
|
+
<div class="flex items-center gap-2">
|
|
85
|
+
<div class="badge badge-ghost font-mono">Project Name</div>
|
|
86
|
+
</div>
|
|
87
|
+
</td>
|
|
88
|
+
<td>
|
|
89
|
+
<code class="text-sm bg-base-200 px-2 py-1 rounded">{{ project_name }}</code>
|
|
90
|
+
</td>
|
|
91
|
+
</tr>
|
|
92
|
+
<tr>
|
|
93
|
+
<td>
|
|
94
|
+
<div class="flex items-center gap-2">
|
|
95
|
+
<div class="badge badge-ghost font-mono">Project Slug</div>
|
|
96
|
+
</div>
|
|
97
|
+
</td>
|
|
98
|
+
<td>
|
|
99
|
+
<code class="text-sm bg-base-200 px-2 py-1 rounded">{{ project_slug }}</code>
|
|
100
|
+
</td>
|
|
101
|
+
</tr>
|
|
102
|
+
<tr>
|
|
103
|
+
<td>
|
|
104
|
+
<div class="flex items-center gap-2">
|
|
105
|
+
<div class="badge badge-ghost font-mono">Description</div>
|
|
106
|
+
</div>
|
|
107
|
+
</td>
|
|
108
|
+
<td>
|
|
109
|
+
<span class="text-sm">{{ project_description }}</span>
|
|
110
|
+
</td>
|
|
111
|
+
</tr>
|
|
112
|
+
<tr>
|
|
113
|
+
<td>
|
|
114
|
+
<div class="flex items-center gap-2">
|
|
115
|
+
<div class="badge badge-ghost font-mono">Copyright</div>
|
|
116
|
+
</div>
|
|
117
|
+
</td>
|
|
118
|
+
<td>
|
|
119
|
+
<span class="text-sm">{{ copyright }}</span>
|
|
120
|
+
</td>
|
|
121
|
+
</tr>
|
|
122
|
+
{% if umami_website_id %}
|
|
123
|
+
<tr>
|
|
124
|
+
<td>
|
|
125
|
+
<div class="flex items-center gap-2">
|
|
126
|
+
<div class="badge badge-ghost font-mono">Umami Website ID</div>
|
|
127
|
+
</div>
|
|
128
|
+
</td>
|
|
129
|
+
<td>
|
|
130
|
+
<code class="text-xs bg-base-200 px-2 py-1 rounded break-all">{{ umami_website_id }}</code>
|
|
131
|
+
</td>
|
|
132
|
+
</tr>
|
|
133
|
+
{% endif %}
|
|
134
|
+
</tbody>
|
|
135
|
+
</table>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
<!-- Runtime Information -->
|
|
140
|
+
<div class="card bg-base-100 shadow-xl border border-base-200 mb-6">
|
|
141
|
+
<div class="card-body">
|
|
142
|
+
<h2 class="card-title text-secondary flex items-center gap-2 mb-6">
|
|
143
|
+
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
144
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z">
|
|
145
|
+
</path>
|
|
146
|
+
</svg>
|
|
147
|
+
Runtime Information
|
|
148
|
+
</h2>
|
|
149
|
+
<div class="grid md:grid-cols-2 gap-6">
|
|
150
|
+
<div class="form-control">
|
|
151
|
+
<label class="label">
|
|
152
|
+
<span class="label-text font-medium">Current Language</span>
|
|
153
|
+
</label>
|
|
154
|
+
<div class="flex gap-2">
|
|
155
|
+
<div class="badge badge-primary badge-lg">{{ language }}</div>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="form-control">
|
|
159
|
+
<label class="label">
|
|
160
|
+
<span class="label-text font-medium">Debug Status</span>
|
|
161
|
+
</label>
|
|
162
|
+
<div class="flex items-center gap-3">
|
|
163
|
+
{% if DEBUG %}
|
|
164
|
+
<div class="badge badge-warning gap-2">
|
|
165
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
166
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z">
|
|
167
|
+
</path>
|
|
168
|
+
</svg>
|
|
169
|
+
Debug Mode Active
|
|
170
|
+
</div>
|
|
171
|
+
{% else %}
|
|
172
|
+
<div class="badge badge-success gap-2">
|
|
173
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
174
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z">
|
|
175
|
+
</path>
|
|
176
|
+
</svg>
|
|
177
|
+
Production Mode
|
|
178
|
+
</div>
|
|
179
|
+
{% endif %}
|
|
180
|
+
</div>
|
|
181
|
+
</div>
|
|
182
|
+
<div class="form-control md:col-span-2">
|
|
183
|
+
<label class="label">
|
|
184
|
+
<span class="label-text font-medium">Supported Languages</span>
|
|
185
|
+
</label>
|
|
186
|
+
<div class="flex flex-wrap gap-2">
|
|
187
|
+
{% for lang in supported_languages %}
|
|
188
|
+
<div class="badge badge-outline {{ 'badge-primary' if lang == default_language else '' }}">
|
|
189
|
+
{{ lang }}
|
|
190
|
+
{% if lang == default_language %}
|
|
191
|
+
<svg class="w-3 h-3 ml-1"
|
|
192
|
+
fill="none"
|
|
193
|
+
stroke="currentColor"
|
|
194
|
+
viewBox="0 0 24 24">
|
|
195
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
|
|
196
|
+
</svg>
|
|
197
|
+
{% endif %}
|
|
198
|
+
</div>
|
|
199
|
+
{% endfor %}
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
<!-- User Cookies -->
|
|
206
|
+
<div class="card bg-base-100 shadow-xl border border-base-200">
|
|
207
|
+
<div class="card-body">
|
|
208
|
+
<h2 class="card-title text-accent flex items-center gap-2 mb-6">
|
|
209
|
+
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
210
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z">
|
|
211
|
+
</path>
|
|
212
|
+
</svg>
|
|
213
|
+
User Cookies
|
|
214
|
+
<div class="badge badge-neutral">{{ cookies | length if cookies else 0 }}</div>
|
|
215
|
+
</h2>
|
|
216
|
+
{% if cookies %}
|
|
217
|
+
<div class="overflow-x-auto">
|
|
218
|
+
<table class="table table-zebra">
|
|
219
|
+
<thead>
|
|
220
|
+
<tr>
|
|
221
|
+
<th class="font-bold">Cookie Name</th>
|
|
222
|
+
<th class="font-bold">Value</th>
|
|
223
|
+
</tr>
|
|
224
|
+
</thead>
|
|
225
|
+
<tbody>
|
|
226
|
+
{% for name, value in cookies.items() %}
|
|
227
|
+
<tr>
|
|
228
|
+
<td>
|
|
229
|
+
<div class="flex items-center gap-2">
|
|
230
|
+
<div class="badge badge-ghost font-mono">{{ name }}</div>
|
|
231
|
+
</div>
|
|
232
|
+
</td>
|
|
233
|
+
<td>
|
|
234
|
+
<code class="text-xs bg-base-200 px-2 py-1 rounded break-all">{{ value[:50] }}
|
|
235
|
+
{% if value|length > 50 %}...{% endif %}
|
|
236
|
+
</code>
|
|
237
|
+
</td>
|
|
238
|
+
</tr>
|
|
239
|
+
{% endfor %}
|
|
240
|
+
</tbody>
|
|
241
|
+
</table>
|
|
242
|
+
</div>
|
|
243
|
+
{% else %}
|
|
244
|
+
<div class="alert alert-info">
|
|
245
|
+
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
246
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z">
|
|
247
|
+
</path>
|
|
248
|
+
</svg>
|
|
249
|
+
<span>No cookies found in the current session</span>
|
|
250
|
+
</div>
|
|
251
|
+
{% endif %}
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
<!-- Debug Navigation Footer -->
|
|
255
|
+
{% include "debug/components/debug_nav.html.jinja" %}
|
|
256
|
+
|
|
257
|
+
</div>
|
|
258
|
+
{% endblock body %}
|