new testarena

This commit is contained in:
2025-11-28 11:22:07 +01:00
parent 22f7f2f94d
commit fb26b8386b
48 changed files with 7105 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify
from flask_login import login_required, current_user
from app.models import User
from app import db
from functools import wraps
admin_bp = Blueprint('admin', __name__, url_prefix='/admin')
def admin_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.is_authenticated or not current_user.is_admin:
flash('Access denied. Admin privileges required.', 'error')
return redirect(url_for('dashboard.index'))
return f(*args, **kwargs)
return decorated_function
@admin_bp.route('/')
@login_required
@admin_required
def index():
users = User.query.order_by(User.created_at.desc()).all()
return render_template('admin/dashboard.html', users=users)
@admin_bp.route('/users/create', methods=['POST'])
@login_required
@admin_required
def create_user():
username = request.form.get('username')
password = request.form.get('password')
is_admin = request.form.get('is_admin') == 'on'
if not username or not password:
flash('Username and password are required', 'error')
return redirect(url_for('admin.index'))
if User.query.filter_by(username=username).first():
flash('Username already exists', 'error')
return redirect(url_for('admin.index'))
user = User(username=username, is_admin=is_admin)
user.set_password(password)
db.session.add(user)
db.session.commit()
flash(f'User {username} created successfully', 'success')
return redirect(url_for('admin.index'))
@admin_bp.route('/users/<int:user_id>/reset-password', methods=['POST'])
@login_required
@admin_required
def reset_password(user_id):
user = User.query.get_or_404(user_id)
new_password = request.form.get('new_password')
if not new_password:
flash('New password is required', 'error')
return redirect(url_for('admin.index'))
user.set_password(new_password)
db.session.commit()
flash(f'Password reset for {user.username}', 'success')
return redirect(url_for('admin.index'))
@admin_bp.route('/users/<int:user_id>/delete', methods=['POST'])
@login_required
@admin_required
def delete_user(user_id):
user = User.query.get_or_404(user_id)
if user.id == current_user.id:
flash('Cannot delete your own account', 'error')
return redirect(url_for('admin.index'))
username = user.username
db.session.delete(user)
db.session.commit()
flash(f'User {username} deleted successfully', 'success')
return redirect(url_for('admin.index'))

View File

@@ -0,0 +1,32 @@
from flask import Blueprint, render_template, redirect, url_for, flash, request
from flask_login import login_user, logout_user, login_required
from app.models import User
from app import db
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/')
def index():
return redirect(url_for('auth.login'))
@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
user = User.query.filter_by(username=username).first()
if user and user.check_password(password):
login_user(user)
return redirect(url_for('dashboard.index'))
else:
flash('Invalid username or password', 'error')
return render_template('login.html')
@auth_bp.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('auth.login'))

View File

@@ -0,0 +1,15 @@
from flask import Blueprint, render_template
from flask_login import login_required, current_user
from app.models import Job
dashboard_bp = Blueprint('dashboard', __name__, url_prefix='/dashboard')
@dashboard_bp.route('/')
@login_required
def index():
if current_user.is_admin:
jobs = Job.query.order_by(Job.submitted_at.desc()).all()
else:
jobs = Job.query.filter_by(user_id=current_user.id).order_by(Job.submitted_at.desc()).all()
return render_template('dashboard/index.html', jobs=jobs)

View File

@@ -0,0 +1,123 @@
from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify
from flask_login import login_required, current_user
from app.models import Job
from app import db
import json
jobs_bp = Blueprint('jobs', __name__, url_prefix='/jobs')
@jobs_bp.route('/submit')
@login_required
def submit():
return render_template('jobs/submit.html')
@jobs_bp.route('/submit/step1', methods=['POST'])
@login_required
def submit_step1():
branch_name = request.form.get('branch_name')
# TODO: Implement branch checkout and scenario detection
# For now, return mock scenarios
scenarios = [
'Scenario_1_Basic_Test',
'Scenario_2_Advanced_Test',
'Scenario_3_Integration_Test',
'Scenario_4_Performance_Test',
'Scenario_5_Security_Test'
]
return render_template('jobs/submit_step2.html', branch_name=branch_name, scenarios=scenarios)
@jobs_bp.route('/submit/step2', methods=['POST'])
@login_required
def submit_step2():
branch_name = request.form.get('branch_name')
selected_scenarios = request.form.getlist('scenarios')
if not selected_scenarios:
flash('Please select at least one scenario', 'error')
return redirect(url_for('jobs.submit'))
return render_template('jobs/submit_step3.html',
branch_name=branch_name,
scenarios=selected_scenarios)
@jobs_bp.route('/submit/step3', methods=['POST'])
@login_required
def submit_step3():
branch_name = request.form.get('branch_name')
scenarios = request.form.get('scenarios')
environment = request.form.get('environment')
return render_template('jobs/submit_step4.html',
branch_name=branch_name,
scenarios=scenarios,
environment=environment)
@jobs_bp.route('/submit/final', methods=['POST'])
@login_required
def submit_final():
branch_name = request.form.get('branch_name')
scenarios = request.form.get('scenarios')
environment = request.form.get('environment')
test_mode = request.form.get('test_mode')
keep_devbenches = request.form.get('keep_devbenches') == 'on'
reuse_results = request.form.get('reuse_results') == 'on'
job = Job(
user_id=current_user.id,
branch_name=branch_name,
scenarios=scenarios,
environment=environment,
test_mode=test_mode,
keep_devbenches=keep_devbenches,
reuse_results=reuse_results,
status='in_progress'
)
db.session.add(job)
db.session.commit()
# TODO: Start test execution in background
flash('Test job submitted successfully', 'success')
return redirect(url_for('dashboard.index'))
@jobs_bp.route('/<int:job_id>')
@login_required
def view_job(job_id):
job = Job.query.get_or_404(job_id)
if not current_user.is_admin and job.user_id != current_user.id:
flash('Access denied', 'error')
return redirect(url_for('dashboard.index'))
return jsonify({
'id': job.id,
'submitter': job.submitter.username,
'branch_name': job.branch_name,
'scenarios': job.scenarios,
'environment': job.environment,
'test_mode': job.test_mode,
'status': job.status,
'submitted_at': job.submitted_at.strftime('%Y-%m-%d %H:%M:%S'),
'completed_at': job.completed_at.strftime('%Y-%m-%d %H:%M:%S') if job.completed_at else None,
'duration': job.duration,
'keep_devbenches': job.keep_devbenches,
'reuse_results': job.reuse_results,
'results_path': job.results_path
})
@jobs_bp.route('/<int:job_id>/abort', methods=['POST'])
@login_required
def abort_job(job_id):
job = Job.query.get_or_404(job_id)
if not current_user.is_admin and job.user_id != current_user.id:
return jsonify({'error': 'Access denied'}), 403
if job.status == 'in_progress':
job.status = 'aborted'
db.session.commit()
# TODO: Kill the running process
return jsonify({'success': True})
return jsonify({'error': 'Job is not in progress'}), 400