Separate admin web routes into vidai/admin.py

- Created vidai/admin.py with Flask Blueprint for admin web routes
- Moved all /admin/* web routes from web.py to admin.py
- Added /admin/settings and related update routes
- Updated navigation links in base.html to use correct admin URLs
- Registered admin blueprint in web.py
parent a8111d9e
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
<a href="/history" {% if active_page == 'history' %}class="active"{% endif %}>History</a> <a href="/history" {% if active_page == 'history' %}class="active"{% endif %}>History</a>
{% if user.get('role') == 'admin' %} {% if user.get('role') == 'admin' %}
<a href="/admin/cluster_tokens" {% if active_page == 'cluster_tokens' %}class="active"{% endif %}>Cluster Tokens</a> <a href="/admin/cluster_tokens" {% if active_page == 'cluster_tokens' %}class="active"{% endif %}>Cluster Tokens</a>
<a href="/settings" {% if active_page == 'settings' %}class="active"{% endif %}>Settings</a> <a href="/admin/settings" {% if active_page == 'settings' %}class="active"{% endif %}>Settings</a>
{% endif %} {% endif %}
</nav> </nav>
<div class="user-menu"> <div class="user-menu">
......
This diff is collapsed.
...@@ -27,9 +27,10 @@ import time ...@@ -27,9 +27,10 @@ import time
import argparse import argparse
from .comm import SocketCommunicator, Message from .comm import SocketCommunicator, Message
from .config import get_all_settings, get_allow_registration from .config import get_all_settings, get_allow_registration
from .auth import login_user, logout_user, get_current_user, register_user, confirm_email, require_auth, require_admin from .auth import login_user, logout_user, get_current_user, register_user, confirm_email, require_auth
from .database import get_user_tokens, update_user_tokens, get_user_queue_items, get_default_user_tokens, create_remember_token, validate_remember_token, delete_remember_token, extend_remember_token from .database import get_user_tokens, update_user_tokens, get_user_queue_items, get_default_user_tokens, create_remember_token, validate_remember_token, delete_remember_token, extend_remember_token
from .api import api_bp from .api import api_bp
from .admin import admin_bp
app = Flask(__name__, template_folder='../templates') app = Flask(__name__, template_folder='../templates')
app.secret_key = os.environ.get('FLASK_SECRET_KEY', 'dev-secret-key-change-in-production') app.secret_key = os.environ.get('FLASK_SECRET_KEY', 'dev-secret-key-change-in-production')
...@@ -290,74 +291,6 @@ def analyze(): ...@@ -290,74 +291,6 @@ def analyze():
server_dir=server_dir, server_dir=server_dir,
active_page='analyze') active_page='analyze')
@app.route('/admin/train', methods=['GET', 'POST'])
@admin_required
def train():
user = get_current_user_session()
message = None
if request.method == 'POST':
# Check token balance (skip for admin users)
if user.get('role') != 'admin':
tokens = get_user_tokens(user['id'])
if tokens < 100:
flash('Insufficient tokens. Training requires 100 tokens.', 'error')
return redirect(url_for('dashboard'))
output_model = request.form.get('output_model', 'MyCustomModel')
description = request.form.get('description', '')
uploaded_data = request.files.get('data')
train_dir = request.form.get('train_dir')
train_path = None
if uploaded_data and uploaded_data.filename:
# Handle uploaded training data
import tempfile
import os
import shutil
if uploaded_data.filename.lower().endswith('.zip'):
# Handle ZIP file
with tempfile.TemporaryDirectory() as tmp_dir:
zip_path = os.path.join(tmp_dir, "data.zip")
with open(zip_path, "wb") as f:
f.write(uploaded_data.read())
extract_dir = os.path.join(tmp_dir, "extracted")
shutil.unpack_archive(zip_path, extract_dir)
train_path = extract_dir
else:
# Handle single file
with tempfile.TemporaryDirectory() as tmp_dir:
file_path = os.path.join(tmp_dir, uploaded_data.filename)
with open(file_path, "wb") as f:
f.write(uploaded_data.read())
train_path = tmp_dir
elif train_dir and os.path.isdir(train_dir):
train_path = train_dir
if train_path:
data = {
'output_model': output_model,
'description': description,
'train_path': train_path,
'user_id': user['id']
}
msg_id = send_to_backend('train_request', data)
result_data = get_result(msg_id)
if 'data' in result_data:
message = result_data['data'].get('message', 'Training completed')
# Deduct tokens (skip for admin users)
if user.get('role') != 'admin':
update_user_tokens(user['id'], -100)
else:
message = result_data.get('error', 'Error')
else:
flash('Please provide training data (upload file or specify directory)', 'error')
return render_template('admin/train.html',
user=user,
tokens=get_user_tokens(user["id"]),
message=message,
active_page='train')
@app.route('/config', methods=['GET', 'POST']) @app.route('/config', methods=['GET', 'POST'])
def config(): def config():
...@@ -390,16 +323,6 @@ def history(): ...@@ -390,16 +323,6 @@ def history():
queue_items=queue_items, queue_items=queue_items,
active_page='history') active_page='history')
@app.route('/settings')
@admin_required
def settings():
"""User settings page."""
user = get_current_user_session()
return render_template('admin/settings.html',
user=user,
tokens=get_user_tokens(user["id"]),
active_page='settings')
@app.route('/update_settings', methods=['POST']) @app.route('/update_settings', methods=['POST'])
@login_required @login_required
...@@ -740,4 +663,7 @@ if __name__ == "__main__": ...@@ -740,4 +663,7 @@ if __name__ == "__main__":
# Register API blueprint # Register API blueprint
app.register_blueprint(api_bp) app.register_blueprint(api_bp)
# Register admin blueprint
app.register_blueprint(admin_bp)
app.run(host='0.0.0.0', debug=True) app.run(host='0.0.0.0', debug=True)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment