add Carte Blanche trinket: equip system, gatekeeper multi-slot, mini tooltip portal; new token type Token.CARTE ('carte') with fa-money-check icon; migrations 0010-0012:
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
CARTE type, User.equipped_trinket FK, Token.slots_claimed field; post_save signal sets equipped_trinket=COIN for new users, PASS for staff; kit bag now shows only the equipped trinket in Trinkets section; Game Kit applet mini tooltip portal shows Equipped or Equip Trinket per token; AJAX POST equip-trinket id updates equippedId in-place; equip btn now works for COIN, PASS, and CARTE (data-token-id added to all three); Gatekeeper CARTE flow: drop_token sets current_room (no slot reserved); each empty slot up to slots_claimed+1 gets a drop-token-btn; slots_claimed high-water mark advances on fill, never decrements; highest CARTE-filled slot gets NVM (release_slot); token_return_btn resets current_room + slots_claimed + un-fills all CARTE slots; gate_status always returns full template so launch-game-btn persists via HTMX when gate_status == OPEN; room.html includes gatekeeper when GATHERING or OPEN; new FT test_trinket_carte_blanche.py (2 tests, both passing); 299 tests green
This commit is contained in:
@@ -190,11 +190,9 @@ class GatekeeperTest(FunctionalTest):
|
||||
room.refresh_from_db()
|
||||
room.gate_status = Room.OPEN
|
||||
room.save()
|
||||
# 4. Gatekeeper disappears via htmx
|
||||
# 4. Gate shows launch button via htmx when all slots filled
|
||||
self.wait_for(
|
||||
lambda: self.assertEqual(
|
||||
len(self.browser.find_elements(By.CSS_SELECTOR, ".gate-modal")), 0
|
||||
)
|
||||
lambda: self.browser.find_element(By.CSS_SELECTOR, ".launch-game-btn")
|
||||
)
|
||||
|
||||
def test_owner_can_delete_room_via_gear_menu(self):
|
||||
@@ -573,6 +571,8 @@ class GameKitInsertTest(FunctionalTest):
|
||||
self.gamer.is_staff = True
|
||||
self.gamer.save()
|
||||
pass_token = Token.objects.create(user=self.gamer, token_type=Token.PASS)
|
||||
self.gamer.equipped_trinket = pass_token
|
||||
self.gamer.save(update_fields=["equipped_trinket"])
|
||||
self.browser.get(self.gate_url)
|
||||
self._select_token_from_kit(pass_token)
|
||||
self.browser.find_element(By.CSS_SELECTOR, "button.token-rails").click()
|
||||
|
||||
Reference in New Issue
Block a user