{% extends "base.html" %} {% block title %}My Profile — Python 108{% endblock %} {% block content %}
{{ level_info.icon }}

{{ user['username'] }}

Level {{ level_info.level }} — {{ level_info.name }}
{{ total_xp }} XP total · {{ earned_keys|length }} / 30 badges earned
{{ stats.programs_done }}
Programs
{{ stats.exercises_done }}
Exercises
{{ streak.current_streak }}
Streak 🔥

Level Progress

{% for lvl in levels %}
{{ lvl.icon }}
{{ lvl.level }}
{{ lvl.name }}
{{ lvl.xp_required }} XP
{% endfor %}
{% if level_info.next_level %}
{{ level_info.icon }} Lv{{ level_info.level }} {{ level_info.xp_in_level }} / {{ level_info.xp_needed }} XP {{ level_info.next_level.icon }} Lv{{ level_info.next_level.level }}
{% endif %}
{% for cat_name, badges in categories.items() %}

{{ cat_name }} badges — {{ badges | selectattr('earned') | list | length }}/{{ badges|length }}

{% for b in badges %}
{{ b.icon }}
{{ b.name }}
{{ b.desc }}
{% if b.earned %}
Earned {{ b.earned_at }}
{% else %}
🔒 Locked
{% endif %}
{% endfor %}
{% endfor %}

Recent XP Activity

{% if xp_log %}
{% for entry in xp_log %}
{{ entry['action'].replace('_',' ').title() }} {{ entry['note'] }} +{{ entry['xp_earned'] }} XP {{ entry['created_at'][:10] }}
{% endfor %}
{% else %}

No XP earned yet — complete a program to start!

{% endif %}
{% endblock %}