"""
Flask route integrations for eLearning Creator.
Add these to app.py via import or manual merge.
import os
BASE_PATH = os.environ.get("BASE_PATH", "/hseq-dashboard")
"""
from flask import request, jsonify, render_template_string
# ─── HTML Templates ──────────────────────────────────────────────────────────
ADVISORY_TEMPLATE = """
{% extends "base.html" %}
{% block content %}
Compliance Gap Analyse
Scan huidige training compliance, identificeer gaps en krijg geprioritiseerd advies.
{% endblock %}
"""
CREATOR_TEMPLATE = """
{% extends "base.html" %}
{% block content %}
Nieuwe Module Aanmaken
📝 Quiz Vragen
📚 Bestaande Modules
Laden...
{% endblock %}
"""
MODULES_OVERVIEW_TEMPLATE = """
{% extends "base.html" %}
{% block content %}
Laden...
👨💼 Module Toewijzen
{% endblock %}
"""
LEARNER_TEMPLATE = """
{% extends "base.html" %}
{% block content %}
{% endblock %}
"""
# ─── Route Registration Function ─────────────────────────────────────────────
def register_elearning_routes(app, BASE_PATH="/hseq-dashboard"):
"""Register all eLearning routes on the Flask app."""
from elearning import (init_elearning_tables, run_advisory_scan, create_module,
get_modules, get_module, update_module, delete_module,
assign_module, get_assignments, record_quiz_attempt, seed_demo_module)
@app.route(BASE_PATH + '/services/training/advisory')
def training_advisory():
return render_template_string(ADVISORY_TEMPLATE, BASE_PATH=BASE_PATH)
@app.route(BASE_PATH + '/services/training/creator')
def training_creator():
return render_template_string(CREATOR_TEMPLATE, BASE_PATH=BASE_PATH)
@app.route(BASE_PATH + '/services/training/modules')
def training_modules():
return render_template_string(MODULES_OVERVIEW_TEMPLATE, BASE_PATH=BASE_PATH)
@app.route(BASE_PATH + '/services/training/modules/')
def training_module_view(module_id):
return render_template_string(LEARNER_TEMPLATE, module_id=module_id, BASE_PATH=BASE_PATH)
# ── API Routes ──
@app.route(BASE_PATH + '/api/elearning/modules', methods=['GET'])
def api_get_modules():
cat = request.args.get('category')
return jsonify(get_modules(cat))
@app.route(BASE_PATH + '/api/elearning/modules', methods=['POST'])
def api_create_module():
data = request.get_json()
try:
mid = create_module(
title=data['title'],
category=data.get('category', 'overig'),
content_html=data.get('content_html', ''),
quiz_questions=data.get('quiz_questions', []),
passing_score=data.get('passing_score', 70),
duration_minutes=data.get('duration_minutes', 30)
)
return jsonify({'success': True, 'id': mid})
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 400
@app.route(BASE_PATH + '/api/elearning/modules/', methods=['GET'])
def api_get_module(module_id):
m = get_module(module_id)
if not m:
return jsonify({'error': 'Not found'}), 404
return jsonify(m)
@app.route(BASE_PATH + '/api/elearning/modules/', methods=['DELETE'])
def api_delete_module(module_id):
delete_module(module_id)
return jsonify({'success': True})
@app.route(BASE_PATH + '/api/elearning/advisory/scan')
def api_advisory_scan():
return jsonify(run_advisory_scan())
@app.route(BASE_PATH + '/api/elearning/assign', methods=['POST'])
def api_assign():
data = request.get_json()
try:
count = assign_module(
module_id=data['module_id'],
employee_ids=data.get('employee_ids', []),
contractor_ids=data.get('contractor_ids', []),
assigned_by=data.get('assigned_by', 'web'),
due_days=data.get('due_days', 30)
)
return jsonify({'success': True, 'assigned': count})
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 400
@app.route(BASE_PATH + '/api/elearning/assign/search')
def api_assign_search():
q = request.args.get('q', '')
from elearning import get_db
conn = get_db()
rows = conn.execute(
"""SELECT e.id, e.name, r.name as role FROM employees e
JOIN roles r ON e.role_id = r.id
WHERE e.name LIKE ? AND e.status = 'active' LIMIT 20""",
(f'%{q}%',)
).fetchall()
conn.close()
return jsonify([dict(r) for r in rows])
@app.route(BASE_PATH + '/api/elearning/progress')
def api_progress():
from elearning import get_db
conn = get_db()
total = conn.execute("SELECT COUNT(*) as c FROM elearning_assignments").fetchone()['c']
completed = conn.execute("SELECT COUNT(*) as c FROM elearning_assignments WHERE status='completed'").fetchone()['c']
pending = conn.execute("SELECT COUNT(*) as c FROM elearning_assignments WHERE status='pending'").fetchone()['c']
failed = conn.execute("SELECT COUNT(*) as c FROM elearning_assignments WHERE status='failed'").fetchone()['c']
conn.close()
return jsonify({'total': total, 'completed': completed, 'pending': pending, 'failed': failed})
@app.route(BASE_PATH + '/api/elearning/quiz/submit', methods=['POST'])
def api_quiz_submit():
data = request.get_json()
try:
record_quiz_attempt(
assignment_id=data['assignment_id'],
answers=data.get('answers', {}),
score=data['score'],
passed=data['passed']
)
return jsonify({'success': True})
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 400
# Initialize on first request
init_elearning_tables()
seed_demo_module()