c08dd145c33f2caa5b7b2f10da041a60a775033d
<title> | <body> | <ts> mirroring post.html's .post-line shape — _my_posts_applet_item / _my_buds_applet_item / _my_notes_item / _my_scrolls_item / _my_games_item all gain a .applet-list-entry.row-3col w. <a class="row-title"> (clickable, 35c/32+... server-side truncated via new lyric_extras.truncate_title filter) + <span class="row-body"> (most-recent activity excerpt, dimmed 0.6 opacity, CSS-text-overflow: ellipsis clipped to whatever space remains — no server-side trunc here so the full line lives in the DOM for inspectors) + <time class="row-ts"> (relative_ts formatted, same minmax(3rem,auto) rightward column allocation post.html's .post-line-time uses, font-size 0.75rem + opacity 0.5 + right-aligned + nowrap); SCSS grid minmax(4rem,auto) 1fr minmax(3rem,auto) lifted from .post-line's template so the timestamp column lines up across post.html / scroll.html / every applet list; per-applet data shapes — _recent_posts annotates each Post w. latest_line (Line FK ordered by -id, None for empty Note-unlock posts); _recent_buds select_related('to_user__active_title') warms the bud's donned-Note FK in one query for the buds row body ("the {{ bud.active_title_display }}" + "since {{ bud.active_title.earned_at|relative_ts }}" — the "since " prefix is unique to this row since the ts is "when they donned it", not the row's own creation); _recent_notes attaches description from _NOTE_META per slug; annotate_latest_event(rooms) helper added to apps.epic.utils (next to rooms_for_user) — attaches room.latest_event per Room w. one .events.order_by('-timestamp').first() per item, used by _billboard_context for my_rooms (My Scrolls applet) AND by apps.gameboard.views.gameboard + toggle_game_applets for my_games (My Games applet), keeping the My Scrolls + My Games shapes symmetric; _billboard_context.my_rooms = annotate_latest_event(...) swaps rooms_for_user(...).order_by("-created_at") materialisation point — bud row's "no active title" branch silently drops body + ts cells so unrecognised buds still surface but don't fabricate a "since None" line; new truncate_title filter is the existing _truncate_post_title view helper hoisted into the template namespace (literal ... past 35 chars, None-safe); 5 ITs in BillboardViewTest cover row content / row absence on missing activity / "since" prefix uniquely on the buds row + 1 in GameboardViewTest for My Games row event prose; deferred row-prose body content cap on <span class="row-body"> purely to CSS text-overflow: ellipsis per user's "middle col should take up the remaining space" steer (initial pass also server-side trunc'd the body to 35c; removed) — TDD
Code architected by Disco DeDisco <discodedisco@outlook.com> Git commit message Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
woodpecker main.yaml: serialise test-FTs-room behind test-FTs-non-room — both FT steps share the workspace AND fall back to SQLite (only test-UTs-n-ITs sets
DATABASE_URL to the postgres service), so running them concurrently collided on src/test_db.sqlite3: the second-to-start container hit a half-created DB and the runner's Type 'yes' to delete the existing test database prompt EOFed under non-interactive CI stdin (pipeline run #296); fix flips test-FTs-room.depends_on from test-two-browser-FTs → test-FTs-non-room so the heavy room cluster strictly follows the non-room bucket; section comment rewritten from "Parallel FT split" → "FT split (sequential for now)" w. the run #296 EOFError documented + two re-parallelisation paths spelled out for later (per-step distinct sqlite paths via DATABASE_URL=sqlite:////tmp/test_db_<bucket>.sqlite3 OR per-step distinct postgres DBs); the two stale "parallel" mentions (collectstatic note in test-two-browser-FTs + inline comment in test-FTs-room) also updated; screendumps + build-and-push depends_on unchanged — Woodpecker resolves the transitive ordering fine
Description
No description provided
Languages
Python
45%
JavaScript
37.6%
HTML
9%
SCSS
8.2%
Jinja
0.1%