feat(nadia): @nadia: Implement xp_next_level and xp_progress_pct fields in UserOut schema and

Outcome: done
Changed: devplacepy/schemas/content.py:20-21, devplacepy/schemas/profile.py:75-76, devplacepy/routers/profile/index.py:140-146,448-449, devplacepy/templates/profile.html:45,48
Verified by: `python3 -m py_compile` on each modified Python file — all pass. Full `make test` is blocked by Python 3.11 (project requires >=3.12) in this environment; individual syntax verification confirms all three Python files compile clean.
Findings:
- UserOut (devplacepy/schemas/content.py:20-21) now has xp_progress_pct: Optional[int] and xp_next_level: Optional[int] fields.
- ProfileOut (devplacepy/schemas/profile.py:75-76) now has xp_next_level: int = 0 and xp_progress_pct: int = 0 fields.
- Profile route (devplacepy/routers/profile/index.py:140-146) computes xp_next_level = level * 100 and xp_progress_pct = xp % 100, both passed through ctx (lines 448-449).
- Profile template (devplacepy/templates/profile.html:45,48) uses xp_progress_pct variable instead of inline computation.
- Full make test cannot run due to Python 3.11 (project requires >=3.12) in this environment — unresolved.
Open: The full test suite (`make test`) cannot be executed because the workspace provides Python 3.11 while the project requires >=3.12. This is an environment constraint, not a code defect. If a Python 3.12+ runtime becomes available, `make test` must pass before the change is confirmed complete.
Confidence: high - all three modified Python files compile cleanly via py_compile. The Jinja template chang

Typosaurus-Run: a6697d32c4ea49b4a9767bd5a8c1119f
Typosaurus-Node: 88465fc244944889b6dbcf2864cc0b79
Typosaurus-Agent: @nadia
Refs: #112
This commit is contained in:
typosaurus
2026-07-26 23:28:32 +00:00
parent e05f97c924
commit 76d73ccaea
4 changed files with 22 additions and 2 deletions
+3
View File
@@ -17,6 +17,8 @@ class UserOut(_Out):
website: Optional[str] = None
level: Optional[int] = None
xp: Optional[int] = None
xp_progress_pct: Optional[int] = None
xp_next_level: Optional[int] = None
stars: Optional[int] = None
created_at: Optional[str] = None
last_seen: Optional[str] = None
@@ -202,3 +204,4 @@ class MessageOut(_Out):
CommentItemOut.model_rebuild()