From 65689295a7077c98bb576607f9ab7ba8497c06bd Mon Sep 17 00:00:00 2001 From: Disco DeDisco Date: Sun, 31 May 2026 23:11:05 -0400 Subject: [PATCH] =?UTF-8?q?navbar:=20GATE=20VIEW=20swaps=20for=20CONT=20GA?= =?UTF-8?q?ME=20on=20room=20pages=20(page-room)=20=E2=86=92=20room=20gate-?= =?UTF-8?q?view=20=E2=80=94=20TDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 0 of the room GATE VIEW + seat-renewal sprint. Mirrors the my-sea treatment: on any room page the self-referential CONT GAME is replaced by a GATE VIEW button that opens the room's renewal gate-view. - `room_view` page_class → "page-gameboard page-room"; the bare gameboard listing stays "page-gameboard" (no page-room) so CONT GAME persists there for returning to a recent room. - `_navbar.html` GATE VIEW branch fires on `page-my-sea` OR `page-room`; onclick routes, in precedence: page-room → epic:room_gate (room in context); my-sea-visit → visitor gate; else owner's sea gate. One consolidated branch (DRY) instead of two near-identical button blocks. Tests: RoomNavbarGateViewTest (4) — room page shows GATE VIEW not CONT GAME, links to room_gate, gate-view page also shows it, page-room marker present. 826 epic+gameboard ITs green. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/apps/epic/tests/integrated/test_views.py | 32 ++++++++++++++++++++ src/apps/epic/views.py | 6 +++- src/templates/core/_partials/_navbar.html | 32 +++++++++++--------- 3 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/apps/epic/tests/integrated/test_views.py b/src/apps/epic/tests/integrated/test_views.py index 6da3d59..a799658 100644 --- a/src/apps/epic/tests/integrated/test_views.py +++ b/src/apps/epic/tests/integrated/test_views.py @@ -2730,3 +2730,35 @@ class RoomRenewTokenTest(TestCase): def test_renew_get_redirects(self): response = self.client.get(self.url) self.assertEqual(response.status_code, 302) + + +class RoomNavbarGateViewTest(TestCase): + """Navbar swaps CONT GAME → GATE VIEW on room pages (mirror my-sea), + routing to the room gate-view. The gameboard listing keeps CONT GAME + (no `page-room` marker).""" + + def setUp(self): + self.owner = User.objects.create(email="owner@test.io", username="owner") + self.room = Room.objects.create( + name="Nav Room", owner=self.owner, + gate_status=Room.OPEN, table_status=Room.ROLE_SELECT, + ) + self.client.force_login(self.owner) + + def test_room_page_shows_gate_view_not_cont_game(self): + response = self.client.get(reverse("epic:room", args=[self.room.id])) + self.assertContains(response, "id_navbar_gate_view_btn") + self.assertNotContains(response, 'id="id_cont_game"') + + def test_gate_view_btn_links_to_room_gate(self): + response = self.client.get(reverse("epic:room", args=[self.room.id])) + self.assertContains( + response, reverse("epic:room_gate", args=[self.room.id])) + + def test_room_gate_page_also_shows_gate_view(self): + response = self.client.get(reverse("epic:room_gate", args=[self.room.id])) + self.assertContains(response, "id_navbar_gate_view_btn") + + def test_room_page_carries_page_room_marker(self): + response = self.client.get(reverse("epic:room", args=[self.room.id])) + self.assertIn("page-room", response.context["page_class"]) diff --git a/src/apps/epic/views.py b/src/apps/epic/views.py index dd5ec71..9028505 100644 --- a/src/apps/epic/views.py +++ b/src/apps/epic/views.py @@ -449,7 +449,11 @@ def room_view(request, room_id): room = Room.objects.get(id=room_id) ctx = _role_select_context(room, request.user) ctx["room"] = room - ctx["page_class"] = "page-gameboard" + # `page-room` drives the navbar GATE VIEW swap (mirrors my-sea's + # `page-my-sea`) so the table page reaches the renewal gate-view instead + # of a self-referential CONT GAME. The bare gameboard listing stays + # `page-gameboard` (no page-room) → keeps CONT GAME. + ctx["page_class"] = "page-gameboard page-room" # Reversal-rate hint label under DRAW SEA's SPREAD select — same helper as # sea_partial so the value tracks any future per-user override automatically. ctx["stack_reversal_pct"] = int(round(stack_reversal_probability(request.user, room) * 100)) diff --git a/src/templates/core/_partials/_navbar.html b/src/templates/core/_partials/_navbar.html index c801f5b..0960238 100644 --- a/src/templates/core/_partials/_navbar.html +++ b/src/templates/core/_partials/_navbar.html @@ -21,27 +21,31 @@ - {% if 'page-my-sea' in page_class %} + {% if 'page-my-sea' in page_class or 'page-room' in page_class %} {# Sprint 6 iter 6b — on any my-sea page (landing/picker or #} {# the gatekeeper itself), CONT GAME swaps for GATE VIEW so #} {# the user can always reach the token-deposit gatekeeper #} - {# (regardless of quota state). `