deck contribution sprint 1: TableSeat.deck_variant FK + select_role wiring — TDD

- 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 <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Disco DeDisco
2026-04-27 22:38:07 -04:00
parent 42be0c63dc
commit 94a864b05b
4 changed files with 45 additions and 0 deletions

View File

@@ -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'),
),
]

View File

@@ -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):

View File

@@ -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(

View File

@@ -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,