Add blueprints for authentication, admin, dashboard, gallery, generation, and profile routes

- Created `__init__.py` for blueprint registration.
- Implemented `auth.py` for user authentication (login, register, logout).
- Added `admin.py` for admin functionalities (user management, stats).
- Developed `dashboard.py` for user dashboard displaying user info and generated content.
- Created `gallery.py` for managing and displaying images and videos.
- Implemented `generate.py` for text, image, and video generation functionalities.
- Added `profile.py` for user profile management.
- Updated templates to reflect new route structures and improve navigation.
This commit is contained in:
2026-05-30 19:39:30 +02:00
parent 02fc5995db
commit f43b13f625
20 changed files with 667 additions and 617 deletions
+2 -2
View File
@@ -42,7 +42,7 @@
<!-- Role toggle -->
<form
method="post"
action="{{ url_for('admin_set_role', user_id=u.id) }}"
action="{{ url_for('admin.set_role', user_id=u.id) }}"
>
<input
type="hidden"
@@ -57,7 +57,7 @@
{% if u.id != session.get('user_id') %}
<form
method="post"
action="{{ url_for('admin_delete_user', user_id=u.id) }}"
action="{{ url_for('admin.delete_user', user_id=u.id) }}"
onsubmit="return confirm('Delete {{ u.email }}?')"
>
<button type="submit" class="btn btn-sm btn-danger">
+13 -11
View File
@@ -13,7 +13,9 @@
<body>
<header>
<nav>
<a href="{{ url_for('index') }}" class="brand">All You Can GET AI</a>
<a href="{{ url_for('auth.index') }}" class="brand"
>All You Can GET AI</a
>
<button class="hamburger" aria-label="Open menu">
<span></span><span></span><span></span>
@@ -21,21 +23,21 @@
<div class="nav-links">
{% if session.get('access_token') %}
<a href="{{ url_for('dashboard') }}">Dashboard</a>
<a href="{{ url_for('gallery') }}">Gallery</a>
<a href="{{ url_for('dashboard.index') }}">Dashboard</a>
<a href="{{ url_for('gallery.index') }}">Gallery</a>
<a href="{{ url_for('generate_text') }}">Generate Text</a>
<a href="{{ url_for('generate_image') }}">Generate Image</a>
<a href="{{ url_for('generate_video') }}">Generate Video</a>
<a href="{{ url_for('generate.text') }}">Generate Text</a>
<a href="{{ url_for('generate.image') }}">Generate Image</a>
<a href="{{ url_for('generate.video') }}">Generate Video</a>
<a href="{{ url_for('profile') }}">Profile</a>
<a href="{{ url_for('profile.index') }}">Profile</a>
{% if session.get('user_role') == 'admin' %}
<a href="{{ url_for('admin') }}">Admin</a>
<a href="{{ url_for('admin.index') }}">Admin</a>
{% endif %}
<a href="{{ url_for('logout') }}">Log out</a>
<a href="{{ url_for('auth.logout') }}">Log out</a>
{% else %}
<a href="{{ url_for('login') }}">Log in</a>
<a href="{{ url_for('register') }}">Register</a>
<a href="{{ url_for('auth.login') }}">Log in</a>
<a href="{{ url_for('auth.register') }}">Register</a>
{% endif %}
</div>
</nav>
+6 -6
View File
@@ -3,7 +3,7 @@ endblock %} {% block content %}
<div class="card">
<h1>Welcome{% if user.get('email') %}, {{ user.email }}{% endif %}</h1>
<p>Role: <strong>{{ user.get('role', 'user') }}</strong></p>
<a href="{{ url_for('generate') }}" class="btn">Start generating</a>
<a href="{{ url_for('generate.index') }}" class="btn">Start generating</a>
</div>
{% if pending_videos %}
@@ -12,7 +12,7 @@ endblock %} {% block content %}
<div class="image-grid">
{% for vid in pending_videos %}
<a
href="{{ url_for('video_detail', video_id=vid.id) }}"
href="{{ url_for('gallery.video_detail', video_id=vid.id) }}"
class="image-grid-item"
>
<div
@@ -39,7 +39,7 @@ endblock %} {% block content %}
<div class="image-grid">
{% for img in generated_images %}
<a
href="{{ url_for('image_detail', image_id=img.id) }}"
href="{{ url_for('gallery.image_detail', image_id=img.id) }}"
class="image-grid-item"
>
<img
@@ -62,7 +62,7 @@ endblock %} {% block content %}
<div class="image-grid">
{% for vid in completed_videos %}
<a
href="{{ url_for('video_detail', video_id=vid.id) }}"
href="{{ url_for('gallery.video_detail', video_id=vid.id) }}"
class="image-grid-item"
>
{% if vid.video_url %}
@@ -97,11 +97,11 @@ endblock %} {% block content %}
<div class="image-grid">
{% for img in images %}
<a
href="{{ url_for('upload_detail', image_id=img.id) }}"
href="{{ url_for('gallery.upload_detail', image_id=img.id) }}"
class="image-grid-item"
>
<img
src="{{ url_for('serve_uploaded_image', image_id=img.id) }}"
src="{{ url_for('gallery.serve_uploaded_image', image_id=img.id) }}"
alt="{{ img.filename }}"
class="generated-image"
loading="lazy"
+7 -7
View File
@@ -22,7 +22,7 @@ content %}
class="block bg-gray-800 rounded-lg shadow-lg overflow-hidden hover:shadow-2xl transition-shadow duration-300 relative"
data-pending-video-id="{{ video.id }}"
>
<a href="{{ url_for('video_detail', video_id=video.id) }}">
<a href="{{ url_for('gallery.video_detail', video_id=video.id) }}">
<div class="p-4">
<p class="font-bold text-lg truncate">{{ video.prompt }}</p>
<p class="text-sm text-gray-400">
@@ -62,7 +62,7 @@ content %}
>
{% for image in generated_images %}
<a
href="{{ url_for('image_detail', image_id=image.id) }}"
href="{{ url_for('gallery.image_detail', image_id=image.id) }}"
class="block bg-gray-800 rounded-lg shadow-lg overflow-hidden hover:shadow-2xl transition-shadow duration-300"
>
<img
@@ -86,7 +86,7 @@ content %}
<p class="text-gray-400">
You haven't generated any images yet.
<a
href="{{ url_for('generate_image') }}"
href="{{ url_for('generate.image') }}"
class="text-blue-400 hover:underline"
>Generate one now</a
>.
@@ -105,7 +105,7 @@ content %}
>
{% for video in completed_videos %}
<a
href="{{ url_for('video_detail', video_id=video.id) }}"
href="{{ url_for('gallery.video_detail', video_id=video.id) }}"
class="block bg-gray-800 rounded-lg shadow-lg overflow-hidden hover:shadow-2xl transition-shadow duration-300"
>
{% if video.video_url %}
@@ -154,7 +154,7 @@ content %}
<p class="text-gray-400">
You haven't generated any videos yet.
<a
href="{{ url_for('generate_video') }}"
href="{{ url_for('generate.video') }}"
class="text-blue-400 hover:underline"
>Generate one now</a
>.
@@ -173,11 +173,11 @@ content %}
>
{% for image in uploads %}
<a
href="{{ url_for('upload_detail', image_id=image.id) }}"
href="{{ url_for('gallery.upload_detail', image_id=image.id) }}"
class="block bg-gray-800 rounded-lg shadow-lg overflow-hidden hover:shadow-2xl transition-shadow duration-300"
>
<img
src="{{ url_for('serve_uploaded_image', image_id=image.id) }}"
src="{{ url_for('gallery.serve_uploaded_image', image_id=image.id) }}"
alt="{{ image.filename }}"
class="w-full h-48 object-cover"
/>
+1 -1
View File
@@ -2,7 +2,7 @@
block content %}
<div class="container mx-auto px-4 py-8">
<a
href="{{ url_for('gallery') }}"
href="{{ url_for('gallery.index') }}"
class="text-blue-400 hover:underline mb-4 inline-block"
>&larr; Back to Gallery</a
>
+1 -1
View File
@@ -11,6 +11,6 @@ endblock %} {% block content %}
<button type="submit">Log in</button>
</form>
<p>No account? <a href="{{ url_for('register') }}">Register</a></p>
<p>No account? <a href="{{ url_for('auth.register') }}">Register</a></p>
</div>
{% endblock %}
+3 -1
View File
@@ -17,6 +17,8 @@ endblock %} {% block content %}
<button type="submit">Register</button>
</form>
<p>Already have an account? <a href="{{ url_for('login') }}">Log in</a></p>
<p>
Already have an account? <a href="{{ url_for('auth.login') }}">Log in</a>
</p>
</div>
{% endblock %}
+2 -2
View File
@@ -2,7 +2,7 @@
content %}
<div class="container mx-auto px-4 py-8">
<a
href="{{ url_for('gallery') }}"
href="{{ url_for('gallery.index') }}"
class="text-blue-400 hover:underline mb-4 inline-block"
>&larr; Back to Gallery</a
>
@@ -11,7 +11,7 @@ content %}
<h1 class="text-2xl font-bold mb-4">Uploaded Image</h1>
<div class="bg-gray-800 rounded-lg shadow-lg overflow-hidden">
<img
src="{{ url_for('serve_uploaded_image', image_id=image.id) }}"
src="{{ url_for('gallery.serve_uploaded_image', image_id=image.id) }}"
alt="{{ image.filename }}"
class="w-full object-contain"
/>
+1 -1
View File
@@ -2,7 +2,7 @@
block content %}
<div class="container mx-auto px-4 py-8">
<a
href="{{ url_for('gallery') }}"
href="{{ url_for('gallery.index') }}"
class="text-blue-400 hover:underline mb-4 inline-block"
>&larr; Back to Gallery</a
>