""" 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 %}
← Training & Opleiding

🎓 Training Advies & Compliance Scan

Compliance Gap Analyse

Scan huidige training compliance, identificeer gaps en krijg geprioritiseerd advies.

{% endblock %} """ CREATOR_TEMPLATE = """ {% extends "base.html" %} {% block content %}
← Training & Opleiding

🛠️ eLearning Module Creator

Nieuwe Module Aanmaken

📝 Quiz Vragen

📚 Bestaande Modules

Laden...
{% endblock %} """ MODULES_OVERVIEW_TEMPLATE = """ {% extends "base.html" %} {% block content %}
← Training & Opleiding

📚 eLearning Modules

-
Totaal Modules
-
Gepubliceerd
-
Toewijzingen
-
Voltooid
Laden...
{% endblock %} """ LEARNER_TEMPLATE = """ {% extends "base.html" %} {% block content %}
← Modules

Laden...

{% 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()