deck contribution sprint 2 + Carte Blanche safeguards — TDD
Sprint 2 UI (game kit applet): - _applet-game-kit.html: in-use deck → two disabled × buttons, .tt-deck-game-name; in-use Carte Blanche → two disabled × buttons, data-current-room-name, .tt-token-room-name; tooltip content mirrors kit bag panel (Default, card count, description, Stock version) - gameboard.js buildMiniContent: 'In-Use' for tokens w. data-current-room-name set - _kit_bag_panel.html: Deck section always renders (placeholder when unequipped) View safeguards: - select_role: look up existing deck from prior seat in same room before equipped_deck (Carte Blanche multi-seat); only unequip when using equipped_deck - drop_token Carte: reject 409 if token.current_room is a different room; unequip from equipped_trinket on drop ITs: SelectRoleMultiSeatTest (2), DropTokenViewTest +3 (carte drop, unequip, lock) 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:
@@ -4,7 +4,20 @@ from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.utils import timezone
|
||||
|
||||
from apps.applets.utils import applet_context, apply_applet_toggle
|
||||
from apps.epic.models import DeckVariant, Room
|
||||
|
||||
|
||||
def _annotate_deck_in_use(decks, user):
|
||||
"""Attach .in_use_room_name to each deck — the name of the active room using it, or None."""
|
||||
active = {
|
||||
ts.deck_variant_id: ts.room.name
|
||||
for ts in TableSeat.objects.filter(
|
||||
gamer=user, deck_variant__isnull=False,
|
||||
).select_related("room")
|
||||
}
|
||||
for deck in decks:
|
||||
deck.in_use_room_name = active.get(deck.pk)
|
||||
return decks
|
||||
from apps.epic.models import DeckVariant, Room, TableSeat
|
||||
from apps.epic.utils import rooms_for_user
|
||||
from apps.lyric.models import Token
|
||||
|
||||
@@ -31,7 +44,7 @@ def gameboard(request):
|
||||
"carte": carte,
|
||||
"equipped_trinket_id": request.user.equipped_trinket_id,
|
||||
"equipped_deck_id": request.user.equipped_deck_id,
|
||||
"deck_variants": list(request.user.unlocked_decks.all()),
|
||||
"deck_variants": _annotate_deck_in_use(list(request.user.unlocked_decks.all()), request.user),
|
||||
"free_tokens": free_tokens,
|
||||
"free_count": len(free_tokens),
|
||||
"applets": applet_context(request.user, "gameboard"),
|
||||
@@ -55,7 +68,7 @@ def toggle_game_applets(request):
|
||||
"carte": request.user.tokens.filter(token_type=Token.CARTE).first(),
|
||||
"equipped_trinket_id": request.user.equipped_trinket_id,
|
||||
"equipped_deck_id": request.user.equipped_deck_id,
|
||||
"deck_variants": list(request.user.unlocked_decks.all()),
|
||||
"deck_variants": _annotate_deck_in_use(list(request.user.unlocked_decks.all()), request.user),
|
||||
"free_tokens": free_tokens,
|
||||
"free_count": len(free_tokens),
|
||||
"my_games": rooms_for_user(request.user),
|
||||
|
||||
Reference in New Issue
Block a user