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,
|
||||
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):
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user