Baltimorean "Ard!" → "Baltimorean" rename across inline surfaces (banner / scroll line / my-notes Title row); navbar DON greeting keeps "Ayo, Ard!" as the sole Ard! flair — and a companion PronounsAppletFlowTest sync-point fix for the 200/Brief response path introduced by the Baltimorean unlock loop in 435a192 ; FT fix (functional_tests/test_game_kit.py) — PronounsAppletFlowTest.test_pronoun_flip_propagates_to_billscroll_and_most_recent was written pre-Baltimorean when set_pronouns always returned 204 → reload; the Baltimorean loop split the response into 200-w-brief (first-bawlmorese, no reload — Brief banner would be lost) vs 204-reload (other pronouns), so the test's step-4 wait_for(.gk-pronoun-card.active[data-pronoun='bawlmorese']) hung indefinitely on the Brief banner because the active class only updates after the reload that no longer happens; sync point swapped to wait_for(.note-banner) — the Brief banner's appearance is the natural post-commit signal that the server saved the pronoun (after which step-5/6 navigate to billboard + scroll to verify "yos" prose) ; rename core (drama/models.py) — Note.grant_if_new else branch's attr_combo inline attribution now uses note.display_name instead of note.display_title, so the scroll line reads "Look!—new Note unlocked. Baltimorean recognizes @disco the Baltimorean." instead of "…the Ard!." (for stargazer/schizo/nomad display_name == display_title so the line is unchanged; only baltimorean's two values diverge — display_title="Ard!" for navbar flair, display_name="Baltimorean" for everywhere else); Brief.title field also swapped from display_title to display_name so the banner title slot reads "Baltimorean" not "Ard!" — admin-grant branch (_ADMIN_NOTE_SLUGS: super-schizo, super-nomad) still uses display_title for the "honorary title of {X}" phrase because that branch DOES want the don-able title there ("Schizoid Man" / "Stranger") ; my-notes card "Title:" row rename — added card_title key to _NOTE_DISPLAY["baltimorean"] ({"greeting": "Ayo,", "title": "Ard!", "card_title": "Baltimorean"}) + new Note.card_title property that falls through _NOTE_DISPLAY[slug]["card_title"] then defaults to display_title; billboard/views.py _my_notes_context swaps "recognition_title": n.display_title → n.card_title so the my-notes Baltimorean card shows "Title: Baltimorean" instead of "Title: Ard!" — super-schizo's card still reads "Title: Schizoid Man" because card_title falls back to display_title for slugs w.o an override ; ONLY Ard! surface remaining: navbar DON greeting via User.active_title.display_title (lyric/models.py:158) — display_title itself was deliberately untouched so the navbar still flips Welcome, Earthman → Ayo, Ard! after DON, which is the entire point of the Baltimorean flair ; existing DB rows w. stored "the Ard!" Line.text + Brief.title="Ard!" from prior dev-DB grants will NOT update — those columns are persisted at grant_if_new time, not computed live; user has accepted dev-DB wipe-and-re-acquire as the path forward, so no data migration ; tests — drama/tests/unit/test_models.py +2 UTs (test_baltimorean_card_title_is_baltimorean pins the override, test_stargazer_card_title_falls_back_to_display_title pins the fallback for non-overridden slugs); drama/tests/integrated/test_note_brief.py test_first_grant_creates_post_line_and_brief updated assertion brief.title == note.display_name (was display_title) to reflect the new contract; dashboard/tests/integrated/test_views.py test_brief_payload_carries_baltimorean_title expects "Baltimorean" not "Ard!"; functional_tests/test_bill_baltimorean.py T1 banner title check swapped "Ard!" → "Baltimorean" + module docstring line 10 updated — T4 (navbar DON greeting flip to "Ayo, Ard!") preserved verbatim, the one surface where Ard! still lives ; full FT suite for baltimorean 6/6 green in 53s; drama + dashboard + billboard ITs/UTs 290 green in 16.5s — TDD
Code architected by Disco DeDisco <discodedisco@outlook.com> Git commit message Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -216,7 +216,7 @@ def my_notes(request):
|
|||||||
{
|
{
|
||||||
"obj": n,
|
"obj": n,
|
||||||
"title": _NOTE_META.get(n.slug, {}).get("title", n.slug),
|
"title": _NOTE_META.get(n.slug, {}).get("title", n.slug),
|
||||||
"recognition_title": n.display_title,
|
"recognition_title": n.card_title,
|
||||||
"description": _NOTE_META.get(n.slug, {}).get("description", ""),
|
"description": _NOTE_META.get(n.slug, {}).get("description", ""),
|
||||||
"palette_options": _NOTE_META.get(n.slug, {}).get("palette_options", []),
|
"palette_options": _NOTE_META.get(n.slug, {}).get("palette_options", []),
|
||||||
"swatch_label": _NOTE_META.get(n.slug, {}).get("swatch_label"),
|
"swatch_label": _NOTE_META.get(n.slug, {}).get("swatch_label"),
|
||||||
|
|||||||
@@ -768,7 +768,7 @@ class SetPronounsBawlmoreseUnlockTest(TestCase):
|
|||||||
def test_brief_payload_carries_baltimorean_title(self):
|
def test_brief_payload_carries_baltimorean_title(self):
|
||||||
response = self.client.post(self.url, data={"pronouns": "bawlmorese"})
|
response = self.client.post(self.url, data={"pronouns": "bawlmorese"})
|
||||||
brief = response.json()["brief"]
|
brief = response.json()["brief"]
|
||||||
self.assertEqual(brief["title"], "Ard!")
|
self.assertEqual(brief["title"], "Baltimorean")
|
||||||
|
|
||||||
def test_brief_payload_square_url_jumps_to_my_notes(self):
|
def test_brief_payload_square_url_jumps_to_my_notes(self):
|
||||||
"""NOTE_UNLOCK Briefs carry a `square_url` pointing at /billboard/my-notes/
|
"""NOTE_UNLOCK Briefs carry a `square_url` pointing at /billboard/my-notes/
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ _NOTE_DISPLAY = {
|
|||||||
"nomad": {"greeting": "Welcome,", "title": "Nomad"},
|
"nomad": {"greeting": "Welcome,", "title": "Nomad"},
|
||||||
"super-schizo": {"greeting": "21<span class='ord'>st</span> Century", "title": "Schizoid Man"},
|
"super-schizo": {"greeting": "21<span class='ord'>st</span> Century", "title": "Schizoid Man"},
|
||||||
"super-nomad": {"greeting": "Howdy,", "title": "Stranger"},
|
"super-nomad": {"greeting": "Howdy,", "title": "Stranger"},
|
||||||
"baltimorean": {"greeting": "Ayo,", "title": "Ard!"},
|
"baltimorean": {"greeting": "Ayo,", "title": "Ard!", "card_title": "Baltimorean"},
|
||||||
}
|
}
|
||||||
|
|
||||||
# Note slugs whose grant prose uses the long admin format ("The administration
|
# Note slugs whose grant prose uses the long admin format ("The administration
|
||||||
@@ -249,6 +249,15 @@ class Note(models.Model):
|
|||||||
def display_greeting(self):
|
def display_greeting(self):
|
||||||
return _NOTE_DISPLAY.get(self.slug, {}).get("greeting", "Welcome,")
|
return _NOTE_DISPLAY.get(self.slug, {}).get("greeting", "Welcome,")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def card_title(self):
|
||||||
|
"""The string shown in the my-notes card's "Title:" row. Defaults to
|
||||||
|
`display_title` (the don-able title — most slugs render the title you
|
||||||
|
DON here, e.g. "Schizoid Man" for super-schizo). Baltimorean overrides
|
||||||
|
so the card reads "Baltimorean" instead of the navbar-only "Ard!"
|
||||||
|
flair."""
|
||||||
|
return _NOTE_DISPLAY.get(self.slug, {}).get("card_title", self.display_title)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def display_name(self):
|
def display_name(self):
|
||||||
"""The Note's *name* (e.g., "Stargazer", "Super-Schizo") — the heading
|
"""The Note's *name* (e.g., "Stargazer", "Super-Schizo") — the heading
|
||||||
@@ -316,9 +325,13 @@ class Note(models.Model):
|
|||||||
"This does not entail any additional corporate benefits."
|
"This does not entail any additional corporate benefits."
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
# Inline attribution reads "{handle} the {Note name}", not the
|
||||||
|
# don-able title. For most slugs the two coincide ("the Stargazer")
|
||||||
|
# but Baltimorean's title is the navbar flair "Ard!" — "the Ard!"
|
||||||
|
# reads oddly inline; "the Baltimorean" matches the Note name.
|
||||||
attr_combo = (
|
attr_combo = (
|
||||||
f'<span class="post-attribution">{handle} '
|
f'<span class="post-attribution">{handle} '
|
||||||
f'the {note.display_title}</span>'
|
f'the {note.display_name}</span>'
|
||||||
)
|
)
|
||||||
line_text = (
|
line_text = (
|
||||||
f"Look!—new Note unlocked. {note_anchor} "
|
f"Look!—new Note unlocked. {note_anchor} "
|
||||||
@@ -339,6 +352,6 @@ class Note(models.Model):
|
|||||||
post=post,
|
post=post,
|
||||||
line=line,
|
line=line,
|
||||||
kind=Brief.KIND_NOTE_UNLOCK,
|
kind=Brief.KIND_NOTE_UNLOCK,
|
||||||
title=note.display_title,
|
title=note.display_name,
|
||||||
)
|
)
|
||||||
return note, created, brief
|
return note, created, brief
|
||||||
|
|||||||
@@ -30,8 +30,9 @@ class GrantIfNewSpawnsBriefTest(TestCase):
|
|||||||
self.assertEqual(brief.owner, self.user)
|
self.assertEqual(brief.owner, self.user)
|
||||||
# The Brief's line is one of the Post's lines
|
# The Brief's line is one of the Post's lines
|
||||||
self.assertIn(brief.line, list(post.lines.all()))
|
self.assertIn(brief.line, list(post.lines.all()))
|
||||||
# Brief title matches Note display title
|
# Brief title matches Note display name (the Note's name — used in the
|
||||||
self.assertEqual(brief.title, note.display_title)
|
# banner's title slot and inline "the {name}" attribution).
|
||||||
|
self.assertEqual(brief.title, note.display_name)
|
||||||
|
|
||||||
def test_second_grant_same_slug_returns_no_brief(self):
|
def test_second_grant_same_slug_returns_no_brief(self):
|
||||||
Note.grant_if_new(self.user, "stargazer")
|
Note.grant_if_new(self.user, "stargazer")
|
||||||
|
|||||||
@@ -27,6 +27,12 @@ class NoteDisplayBaltimoreanTest(SimpleTestCase):
|
|||||||
through to `slug.title()` → 'Baltimorean'."""
|
through to `slug.title()` → 'Baltimorean'."""
|
||||||
self.assertEqual(_note("baltimorean").display_name, "Baltimorean")
|
self.assertEqual(_note("baltimorean").display_name, "Baltimorean")
|
||||||
|
|
||||||
|
def test_baltimorean_card_title_is_baltimorean(self):
|
||||||
|
"""The my-notes card's "Title:" row uses `card_title`, which Baltimorean
|
||||||
|
explicitly overrides to "Baltimorean" so the navbar-only "Ard!" flair
|
||||||
|
doesn't leak onto the card."""
|
||||||
|
self.assertEqual(_note("baltimorean").card_title, "Baltimorean")
|
||||||
|
|
||||||
|
|
||||||
class NoteDisplayStargazerTest(SimpleTestCase):
|
class NoteDisplayStargazerTest(SimpleTestCase):
|
||||||
"""Smoke tests for the existing stargazer entry — pins the contract that
|
"""Smoke tests for the existing stargazer entry — pins the contract that
|
||||||
@@ -37,3 +43,8 @@ class NoteDisplayStargazerTest(SimpleTestCase):
|
|||||||
|
|
||||||
def test_stargazer_display_greeting_is_welcome(self):
|
def test_stargazer_display_greeting_is_welcome(self):
|
||||||
self.assertEqual(_note("stargazer").display_greeting, "Welcome,")
|
self.assertEqual(_note("stargazer").display_greeting, "Welcome,")
|
||||||
|
|
||||||
|
def test_stargazer_card_title_falls_back_to_display_title(self):
|
||||||
|
"""Slugs without a `card_title` override fall through to display_title —
|
||||||
|
for stargazer that's "Stargazer" (don-able title == Note name)."""
|
||||||
|
self.assertEqual(_note("stargazer").card_title, "Stargazer")
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Baltimorean Note and fires the slide-down Brief banner.
|
|||||||
|
|
||||||
End-to-end loop captured here:
|
End-to-end loop captured here:
|
||||||
1. Game Kit → pronouns applet → click `bawlmorese` card → guard portal "OK"
|
1. Game Kit → pronouns applet → click `bawlmorese` card → guard portal "OK"
|
||||||
2. Brief banner slides in with title "Ard!" + Look! prose + FYI/NVM/?-square
|
2. Brief banner slides in with title "Baltimorean" + Look! prose + FYI/NVM/?-square
|
||||||
3. Navigate to /billboard/my-notes/ → Baltimorean item w. the Aaron quote
|
3. Navigate to /billboard/my-notes/ → Baltimorean item w. the Aaron quote
|
||||||
4. DON the Baltimorean Note → navbar greeting flips
|
4. DON the Baltimorean Note → navbar greeting flips
|
||||||
"Welcome, Earthman" → "Ayo, Ard!"
|
"Welcome, Earthman" → "Ayo, Ard!"
|
||||||
@@ -106,10 +106,10 @@ class BaltimoreanNoteFromGameKitTest(FunctionalTest):
|
|||||||
banner = self.wait_for_slow(lambda: self.browser.find_element(
|
banner = self.wait_for_slow(lambda: self.browser.find_element(
|
||||||
By.CSS_SELECTOR, ".note-banner"
|
By.CSS_SELECTOR, ".note-banner"
|
||||||
))
|
))
|
||||||
# The title slot carries the recognition title — for baltimorean
|
# The title slot carries the Note name — "Baltimorean". The don-able
|
||||||
# that's "Ard!" (vs stargazer's "Stargazer").
|
# title "Ard!" only surfaces in the navbar greeting after DON.
|
||||||
self.assertIn(
|
self.assertIn(
|
||||||
"Ard!",
|
"Baltimorean",
|
||||||
banner.find_element(By.CSS_SELECTOR, ".note-banner__title").text,
|
banner.find_element(By.CSS_SELECTOR, ".note-banner__title").text,
|
||||||
)
|
)
|
||||||
# Look! prose lands in the description.
|
# Look! prose lands in the description.
|
||||||
|
|||||||
@@ -198,12 +198,13 @@ class PronounsAppletFlowTest(FunctionalTest):
|
|||||||
self.assertIn("Set pronoun preference?", portal.text)
|
self.assertIn("Set pronoun preference?", portal.text)
|
||||||
self.assertIn("yo/yo/yos", portal.text)
|
self.assertIn("yo/yo/yos", portal.text)
|
||||||
|
|
||||||
# 4. Click OK — the page reloads, .active class moves to bawlmorese.
|
# 4. Click OK — first-time bawlmorese unlocks the Baltimorean Note, so
|
||||||
|
# the server returns 200 w. a Brief payload (no reload — the banner
|
||||||
|
# would be lost). Wait for the banner to confirm the commit landed
|
||||||
|
# before navigating away.
|
||||||
portal.find_element(By.CSS_SELECTOR, ".guard-yes").click()
|
portal.find_element(By.CSS_SELECTOR, ".guard-yes").click()
|
||||||
self.wait_for(
|
self.wait_for(
|
||||||
lambda: self.browser.find_element(
|
lambda: self.browser.find_element(By.CSS_SELECTOR, ".note-banner")
|
||||||
By.CSS_SELECTOR, ".gk-pronoun-card.active[data-pronoun='bawlmorese']"
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# 5. Navigate to the Billboard — Most Recent Scroll applet must now
|
# 5. Navigate to the Billboard — Most Recent Scroll applet must now
|
||||||
|
|||||||
Reference in New Issue
Block a user