feat: add DiceBear avatar proxy with style picker on signup and profile pages

Implement avatar generation via local proxy at `/avatar/{style}/{seed}` that fetches from DiceBear 9.x API with in-memory caching and fallback to initial-based SVG. Add avatar style selection dropdown to signup form and profile edit page, storing `avatar_style` in user records. Update comment rendering to support nested threading with parent-child relationships in post view. Add `avatar_url` and `avatar_styles` template globals, register avatar router in main app, and include avatar CSS classes for rounded image display.
This commit is contained in:
2026-05-10 19:33:53 +00:00
parent 15a3b990fe
commit f4343c3d05
26 changed files with 745 additions and 456 deletions
+4
View File
@@ -94,10 +94,12 @@ def browser_context(browser):
def page(browser_context):
p = browser_context.new_page()
p.set_default_timeout(10000)
p.bring_to_front()
yield p
p.close()
def signup_user(page, user):
page.bring_to_front()
page.goto(f"{BASE_URL}/auth/signup")
page.fill("#username", user["username"])
page.fill("#email", user["email"])
@@ -108,6 +110,7 @@ def signup_user(page, user):
def login_user(page, user):
page.bring_to_front()
page.goto(f"{BASE_URL}/auth/login")
page.fill("#email", user["email"])
page.fill("#password", user["password"])
@@ -152,6 +155,7 @@ def bob(browser, seeded_db):
ctx = browser.new_context(viewport={"width": 1400, "height": 900})
p = ctx.new_page()
p.set_default_timeout(10000)
p.bring_to_front()
login_user(p, seeded_db["bob"])
yield p, seeded_db["bob"]
p.close()