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:
@@ -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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -185,6 +185,10 @@ class TableSeat(models.Model):
|
|||||||
"TarotCard", null=True, blank=True,
|
"TarotCard", null=True, blank=True,
|
||||||
on_delete=models.SET_NULL, related_name="significator_seats",
|
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):
|
class DeckVariant(models.Model):
|
||||||
|
|||||||
@@ -680,6 +680,27 @@ class SelectRoleViewTest(TestCase):
|
|||||||
)
|
)
|
||||||
mock_notify.assert_called_once_with(self.room.id)
|
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):
|
def test_select_role_requires_login(self):
|
||||||
self.client.logout()
|
self.client.logout()
|
||||||
response = self.client.post(
|
response = self.client.post(
|
||||||
|
|||||||
@@ -575,6 +575,7 @@ def select_role(request, room_id):
|
|||||||
if room.table_seats.filter(role=role).exists():
|
if room.table_seats.filter(role=role).exists():
|
||||||
return HttpResponse(status=409)
|
return HttpResponse(status=409)
|
||||||
active_seat.role = role
|
active_seat.role = role
|
||||||
|
active_seat.deck_variant = request.user.equipped_deck
|
||||||
active_seat.save()
|
active_seat.save()
|
||||||
record(room, GameEvent.ROLE_SELECTED, actor=request.user,
|
record(room, GameEvent.ROLE_SELECTED, actor=request.user,
|
||||||
role=role, slot_number=active_seat.slot_number,
|
role=role, slot_number=active_seat.slot_number,
|
||||||
|
|||||||
Reference in New Issue
Block a user