Dashboard
{{ metrics.users?.total || 0 }}
Users
{{ metrics.users?.active || 0 }} active
{{ metrics.categories?.total || 0 }}
Categories
{{ metrics.categories?.active || 0 }} active
{{ metrics.quizzes?.total || 0 }}
Quizzes
{{ metrics.quizzes?.active || 0 }} active
{{ metrics.objectives?.total || 0 }}
Objectives
{{ metrics.objectives?.active || 0 }} active
{{ metrics.puzzles?.total || 0 }}
Puzzles
{{ metrics.puzzles?.active || 0 }} active
{{ metrics.fillblanks?.total || 0 }}
Fill Blanks
{{ metrics.fillblanks?.active || 0 }} active
{{ metrics.timed_challenges?.total || 0 }}
Timed Challenges
{{ metrics.timed_challenges?.active || 0 }} active
{{ metrics.cmdbuilder?.total || 0 }}
Cmd Builder
{{ metrics.cmdbuilder?.active || 0 }} active
{{ metrics.bughunt?.total || 0 }}
Bug Hunt
{{ metrics.bughunt?.active || 0 }} active
{{ metrics.achievements?.total || 0 }}
Achievements
{{ metrics.achievements?.active || 0 }} active
{{ metrics.weakness?.users_at_risk || 0 }}
Utilisateurs à risque
catégorie en moyen/faible
{{ metrics.training?.active_sessions || 0 }}
Sessions Mode Formation actives
{{ metrics.training?.active_participants || 0 }} stagiaires
{{ metrics.recent_activity?.count_24h || 0 }}
Activité (24h)
{{ metrics.recent_activity?.accuracy_24h || 0 }}% accuracy
Leaderboard (Top 10)
| # | Name | Score | |
|---|---|---|---|
| {{ idx + 1 }} | {{ user.display_name }} | {{ user.email }} | {{ user.score }} |
Quizzes by Category
{{ cat }}{{ count }}
No data
Quizzes by Difficulty
{{ diff }}{{ count }}
No data
Users
{{ dtTotal }} total
per page
| Name | Score | Active | Admin | Trainer | Created | Actions | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ user.email }} | {{ user.display_name }} | {{ user.score }} | {{ user.is_active ? 'Active' : 'Inactive' }} | {{ user.is_admin ? 'Admin' : 'User' }} | {{ user.is_trainer ? 'Trainer' : 'User' }} | {{ formatDate(user.created_at) }} |
|
||||||||
|
Aucune activité pour cet utilisateur.
|
|||||||||||||||
|
Chargement…
Aucune activité pour cet utilisateur.
{{ activityByEmail[user.email].total_sessions }} Sessions{{ activityByEmail[user.email].total_score }} Total Score{{ activityByEmail[user.email].overall_accuracy }}% Accuracy📅 Score — 7 derniers jours
{{ activityDayLabel(b.date) }}
📆 Heatmap (4 dernières semaines)
🎯 Accuracy by Topic
{{ t.topic }}
|
|||||||||||||||
Categories
per page
/
| Name | Description | Active | Created | Actions |
|---|---|---|---|---|
| {{ cat.name }} | {{ cat.description }} | {{ cat.active ? 'Active' : 'Inactive' }} | {{ formatDate(cat.created_at) }} |
|
No items found{{ dtSearch ? ' matching "' + dtSearch + '"' : '' }}
Domains (Districts)
per page
/
| Order | Slug | Name | Color | Active | Actions |
|---|---|---|---|---|---|
| {{ dom.order }} | {{ dom.slug }} |
{{ dom.icon }} {{ dom.name }} | {{ dom.color }} | {{ dom.is_active ? 'Active' : 'Inactive' }} |
|
No items found{{ dtSearch ? ' matching "' + dtSearch + '"' : '' }}
Objectives
per page
| Title | Category | Difficulty | Points | Enabled | Actions |
|---|---|---|---|---|---|
| {{ obj.title }} | {{ obj.category }} | {{ obj.difficulty }} | {{ obj.bonus_points }} | {{ obj.enabled ? 'Active' : 'Inactive' }} |
|
Quizzes
per page
| Question | Category | Topic | Difficulty | Type | Active | Actions |
|---|---|---|---|---|---|---|
| {{ quiz.question }} | {{ quiz.category }} | {{ quiz.topic }} | {{ quiz.difficulty }} | {{ quiz.type }} | {{ quiz.active ? 'Active' : 'Inactive' }} |
|
Maps
| Objects | Created | Actions | |
|---|---|---|---|
| {{ map.email }} | {{ countMapObjects(map) }} objects | {{ formatDate(map.created_at) }} |
|
{{ mapGridView.email }}
| {{ (col - 1 + mapGridMinX) * 10 }} | |
|---|---|
| {{ (rIdx + mapGridMinZ) * 10 }} | {{ cell.category }} |
Scenarios
per page
| Title | Category | Difficulty | Points | Instructions | Active | Actions |
|---|---|---|---|---|---|---|
| {{ sc.title }} | {{ sc.category }} | {{ sc.difficulty }} | {{ sc.points }} | {{ sc.instructions?.length || 0 }} steps | {{ sc.active ? 'Active' : 'Inactive' }} |
|
Puzzles
per page
| Title | Category | Topic | Difficulty | Blocks | Active | Actions |
|---|---|---|---|---|---|---|
| {{ pz.title }} | {{ pz.category }} | {{ pz.topic }} | {{ pz.difficulty }} | {{ pz.commands?.length || 0 }} | {{ pz.is_active ? 'Active' : 'Inactive' }} |
|
Fill the Blank
per page
| Title | Category | Topic | Difficulty | Blanks | Active | Actions |
|---|---|---|---|---|---|---|
| {{ fb.title }} {{ fb.topic }} |
{{ fb.category }} | {{ fb.topic }} | {{ fb.difficulty }} | {{ fb.blanks?.length || 0 }} | {{ fb.active ? 'Active' : 'Inactive' }} |
|
Timed Challenges
per page
| Title | Category | Difficulty | Time | Questions | Active | Actions |
|---|---|---|---|---|---|---|
| {{ tc.title }} | {{ tc.category }} | {{ tc.difficulty }} | {{ tc.time_limit_seconds }}s | {{ tc.question_count }} | {{ tc.active ? 'Active' : 'Inactive' }} |
|
Achievements
per page
| Icon | Name | Category | Condition | Reward | Active | Actions |
|---|---|---|---|---|---|---|
| {{ ach.icon }} | {{ ach.name }} {{ ach.description }} |
{{ ach.category }} | {{ ach.condition_type }} ≥ {{ ach.condition_value }} | {{ ach.points_reward || ach.reward_points || 0 }} pts | {{ ach.active ? 'Active' : 'Inactive' }} |
|
Command Builder
per page
| Title | Category | Topic | Difficulty | Points | Active | Actions |
|---|---|---|---|---|---|---|
| {{ cmd.title }} {{ cmd.correct_command }} |
{{ cmd.category }} | {{ cmd.topic }} | {{ cmd.difficulty }} | {{ cmd.points }} | {{ cmd.active ? 'Active' : 'Inactive' }} |
|
Bug Hunt Exercises
per page
| Title | Category | Topic | Difficulty | Language | Points | Active | Actions |
|---|---|---|---|---|---|---|---|
| {{ ex.title }} | {{ ex.category }} | {{ ex.topic }} | {{ ex.difficulty }} | {{ ex.language }} | {{ ex.points }} | {{ ex.active ? 'Active' : 'Inactive' }} |
|
SQL Challenges
per page
| Title | Category | Topic | Difficulty | Dialect | Points | Active | Actions |
|---|---|---|---|---|---|---|---|
| {{ ch.title }} | {{ ch.category }} | {{ ch.topic }} | {{ ch.difficulty }} | {{ ch.dialect }} | {{ ch.points }} | {{ ch.active ? 'Active' : 'Inactive' }} |
|
Python Challenges
per page
| Title | Category | Topic | Difficulty | Kind | Points | Active | Actions |
|---|---|---|---|---|---|---|---|
| {{ ch.title }} | {{ ch.category }} | {{ ch.topic }} | {{ ch.difficulty }} | {{ ch.kind }} | {{ ch.points }} | {{ ch.active ? 'Active' : 'Inactive' }} |
Git Challenges
per page
| Title | Category | Difficulty | Level | Steps | Points | Active | Actions |
|---|---|---|---|---|---|---|---|
| {{ ch.title }} | {{ ch.category }} | {{ ch.difficulty }} | {{ ch.level }} | {{ (ch.steps || []).length }} | {{ ch.points }} | {{ ch.active ? 'Active' : 'Inactive' }} |
User Activities
{{ count }}
{{ type }}
| Time | User | Type | Subject | Category | Difficulty | Result | Accuracy | Score |
|---|---|---|---|---|---|---|---|---|
| {{ a.timestamp ? new Date(a.timestamp).toLocaleString() : '—' }} | {{ a.email }} | {{ a.activity_type }} | {{ a.subject || '—' }} | {{ a.category || '—' }} | {{ a.difficulty || '—' }} | ✅ Pass ❌ Fail — | {{ a.accuracy != null ? Math.round(a.accuracy * 100) + '%' : '—' }} | {{ a.score != null ? a.score : '—' }} |
No activities found.
🏆 Top Users by Score
| # | Score | |
|---|---|---|
| {{ i + 1 }} | {{ u.email }} | {{ u.score }} |
Training Sessions
| Training | Subject | Code | Date | Status | Actions |
|---|---|---|---|---|---|
| {{ s.training_name }} | {{ s.subject }} | {{ s.session_code }} |
{{ s.training_date || '—' }} | {{ s.status }} |
|
No training sessions found.
{{ trainingDashboard.training_name }}
{{ trainingDashboard.subject }}
{{ trainingDashboard.status }}
| Participant | Challenges | Accuracy | Last activity | |
|---|---|---|---|---|
| {{ p.display_name }} | {{ p.user_id }} | {{ p.session_challenges_completed }} | {{ p.session_accuracy }}% | {{ p.last_activity_at ? new Date(p.last_activity_at).toLocaleString() : '—' }} |
No participants have joined yet.
Formations
| Name | Subject | Chapters | Status | Created By | Actions |
|---|---|---|---|---|---|
| {{ f.name }} | {{ f.subject }} | {{ f.chapters?.length || 0 }} | {{ f.active ? 'Active' : 'Inactive' }} | {{ f.created_by }} |
|
No formations found. Create one to get started.
Game Settings
Changes take effect immediately for new sessions. Frontend values reload on next page load.
No settings found. Run
python -m scripts.seed_settings to seed defaults.
{{ s.key }}
{{ typeof s.value }}
{{ s.description }}
Current: {{ s.value }}
Saved!
Skill Tree
Read-only — edit prerequisites via Objectives page{{ skillTreeStats.completed }}
Objectives defined
{{ skillTreeStats.withPrereqs }}
With prerequisites
{{ skillTreeStats.maxDepth }}
Max depth
| Title | Category | Difficulty | Prerequisites | Depth | Status |
|---|---|---|---|---|---|
| {{ node.title }} | {{ node.category }} | {{ node.difficulty }} | — {{ p }} | {{ node._depth }} | Root Linked |
No objectives found. Create objectives with prerequisites in the Objectives page.
Weekly Boss
{{ wbBoss.title }}
{{ wbBoss.description }}
{{ wbBoss.category }}
{{ wbBoss.difficulty }}
{{ wbBoss.reward_points }} pts
{{ wbBoss.active ? 'Active' : 'Inactive' }}
{{ wbBoss.question_count }} questions
Week: {{ wbBoss.week_key }}
No boss set for the current week.
Completions this week
| # | Score | Accuracy | |
|---|---|---|---|
| {{ i+1 }} | {{ c.email }} | {{ c.score }} | {{ (c.accuracy * 100).toFixed(0) }}% |
| No completions yet | |||