From 94a864b05b703fdf63089a2cc6b6a0cc34d8a447 Mon Sep 17 00:00:00 2001 From: Disco DeDisco Date: Mon, 27 Apr 2026 22:38:07 -0400 Subject: [PATCH] =?UTF-8?q?deck=20contribution=20sprint=201:=20TableSeat.d?= =?UTF-8?q?eck=5Fvariant=20FK=20+=20select=5Frole=20wiring=20=E2=80=94=20T?= =?UTF-8?q?DD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - epic.TableSeat gains deck_variant FK → DeckVariant (nullable, SET_NULL) - select_role view assigns request.user.equipped_deck to seat on role confirmation - Migration 0006_add_deck_variant_to_tableseat - ITs: test_select_role_assigns_equipped_deck_to_seat, test_select_role_no_deck_leaves_deck_variant_null Code architected by Disco DeDisco Git commit message Co-Authored-By: Claude Sonnet 4.6 --- .../0006_add_deck_variant_to_tableseat.py | 19 +++++++++++++++++ src/apps/epic/models.py | 4 ++++ src/apps/epic/tests/integrated/test_views.py | 21 +++++++++++++++++++ src/apps/epic/views.py | 1 + 4 files changed, 45 insertions(+) create mode 100644 src/apps/epic/migrations/0006_add_deck_variant_to_tableseat.py diff --git a/src/apps/epic/migrations/0006_add_deck_variant_to_tableseat.py b/src/apps/epic/migrations/0006_add_deck_variant_to_tableseat.py new file mode 100644 index 0000000..43579bc --- /dev/null +++ b/src/apps/epic/migrations/0006_add_deck_variant_to_tableseat.py @@ -0,0 +1,19 @@ +# Generated by Django 6.0 on 2026-04-28 02:35 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('epic', '0005_seed_astro_reference_tables'), + ] + + operations = [ + migrations.AddField( + model_name='tableseat', + name='deck_variant', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='active_seats', to='epic.deckvariant'), + ), + ] diff --git a/src/apps/epic/models.py b/src/apps/epic/models.py index 6bf6e97..a2f1883 100644 --- a/src/apps/epic/models.py +++ b/src/apps/epic/models.py @@ -185,6 +185,10 @@ class TableSeat(models.Model): "TarotCard", null=True, blank=True, on_delete=models.SET_NULL, related_name="significator_seats", ) + deck_variant = models.ForeignKey( + "DeckVariant", null=True, blank=True, + on_delete=models.SET_NULL, related_name="active_seats", + ) class DeckVariant(models.Model): diff --git a/src/apps/epic/tests/integrated/test_views.py b/src/apps/epic/tests/integrated/test_views.py index 588327b..964e7e8 100644 --- a/src/apps/epic/tests/integrated/test_views.py +++ b/src/apps/epic/tests/integrated/test_views.py @@ -680,6 +680,27 @@ class SelectRoleViewTest(TestCase): ) mock_notify.assert_called_once_with(self.room.id) + def test_select_role_assigns_equipped_deck_to_seat(self): + earthman = DeckVariant.objects.get(slug="earthman") + self.founder.equipped_deck = earthman + self.founder.save(update_fields=["equipped_deck"]) + self.client.post( + reverse("epic:select_role", kwargs={"room_id": self.room.id}), + data={"role": "PC"}, + ) + seat = TableSeat.objects.get(room=self.room, slot_number=1) + self.assertEqual(seat.deck_variant, earthman) + + def test_select_role_no_deck_leaves_deck_variant_null(self): + self.founder.equipped_deck = None + self.founder.save(update_fields=["equipped_deck"]) + self.client.post( + reverse("epic:select_role", kwargs={"room_id": self.room.id}), + data={"role": "PC"}, + ) + seat = TableSeat.objects.get(room=self.room, slot_number=1) + self.assertIsNone(seat.deck_variant) + def test_select_role_requires_login(self): self.client.logout() response = self.client.post( diff --git a/src/apps/epic/views.py b/src/apps/epic/views.py index 8371d37..0702713 100644 --- a/src/apps/epic/views.py +++ b/src/apps/epic/views.py @@ -575,6 +575,7 @@ def select_role(request, room_id): if room.table_seats.filter(role=role).exists(): return HttpResponse(status=409) active_seat.role = role + active_seat.deck_variant = request.user.equipped_deck active_seat.save() record(room, GameEvent.ROLE_SELECTED, actor=request.user, role=role, slot_number=active_seat.slot_number,