new _kit_bag_panel.html partial in core to allow user to manage equipped kit items from anywhere on site; #id_kit_btn moved from _footer.html partial directly into a base.html include; new trinket for superusers now incl. in apps.lyric.models; apps.gameboard.views handles this new type of PASS token; apps.epic.views allows payment with several different token types based on rarity & expiration hierarchy; kit bag and PASS functionality now handled in apps.dashboard.views; /kit-bag/ now pathed in .urls; styles abound; fully passing test suite (tho much work to be done, chiefly with stacking like coins in FEFO order)
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
This commit is contained in:
@@ -13,4 +13,5 @@ urlpatterns = [
|
||||
path('wallet/toggle-applets', views.toggle_wallet_applets, name='toggle_wallet_applets'),
|
||||
path('wallet/setup-intent', views.setup_intent, name='setup_intent'),
|
||||
path('wallet/save-payment-method', views.save_payment_method, name='save_payment_method'),
|
||||
path('kit-bag/', views.kit_bag, name='kit_bag'),
|
||||
]
|
||||
|
||||
@@ -146,6 +146,7 @@ def toggle_applets(request):
|
||||
def wallet(request):
|
||||
return render(request, "apps/dashboard/wallet.html", {
|
||||
"wallet": request.user.wallet,
|
||||
"pass_token": request.user.tokens.filter(token_type=Token.PASS).first(),
|
||||
"coin": request.user.tokens.filter(token_type=Token.COIN).first(),
|
||||
"free_tokens": list(request.user.tokens.filter(token_type=Token.FREE)),
|
||||
"tithe_tokens": list(request.user.tokens.filter(token_type=Token.TITHE)),
|
||||
@@ -153,6 +154,12 @@ def wallet(request):
|
||||
"page_class": "page-wallet",
|
||||
})
|
||||
|
||||
|
||||
@login_required(login_url="/")
|
||||
def kit_bag(request):
|
||||
tokens = list(request.user.tokens.all())
|
||||
return render(request, "core/_partials/_kit_bag_panel.html", {"tokens": tokens})
|
||||
|
||||
@login_required(login_url="/")
|
||||
def toggle_wallet_applets(request):
|
||||
checked = request.POST.getlist("applets")
|
||||
@@ -166,6 +173,7 @@ def toggle_wallet_applets(request):
|
||||
return render(request, "apps/wallet/_partials/_applets.html", {
|
||||
"applets": applet_context(request.user, "wallet"),
|
||||
"wallet": request.user.wallet,
|
||||
"pass_token": request.user.tokens.filter(token_type=Token.PASS).first(),
|
||||
"coin": request.user.tokens.filter(token_type=Token.COIN).first(),
|
||||
"free_tokens": list(request.user.tokens.filter(token_type=Token.FREE)),
|
||||
"tithe_tokens": list(request.user.tokens.filter(token_type=Token.TITHE)),
|
||||
|
||||
@@ -78,7 +78,12 @@ def drop_token(request, room_id):
|
||||
return redirect("epic:gatekeeper", room_id=room_id)
|
||||
if room.gate_slots.filter(gamer=request.user, status=GateSlot.FILLED).exists():
|
||||
return redirect("epic:gatekeeper", room_id=room_id)
|
||||
if select_token(request.user) is None:
|
||||
token_id = request.POST.get("token_id")
|
||||
if token_id:
|
||||
token = request.user.tokens.filter(id=token_id).first()
|
||||
else:
|
||||
token = select_token(request.user)
|
||||
if token is None:
|
||||
return HttpResponse(status=402)
|
||||
slot = room.gate_slots.filter(
|
||||
status=GateSlot.EMPTY
|
||||
@@ -88,6 +93,7 @@ def drop_token(request, room_id):
|
||||
slot.status = GateSlot.RESERVED
|
||||
slot.reserved_at = timezone.now()
|
||||
slot.save()
|
||||
request.session["kit_token_id"] = str(token.id)
|
||||
return redirect("epic:gatekeeper", room_id=room_id)
|
||||
|
||||
|
||||
@@ -99,7 +105,12 @@ def confirm_token(request, room_id):
|
||||
gamer=request.user, status=GateSlot.RESERVED
|
||||
).first()
|
||||
if slot:
|
||||
token = select_token(request.user)
|
||||
token_id = request.session.pop("kit_token_id", None)
|
||||
token = None
|
||||
if token_id:
|
||||
token = request.user.tokens.filter(id=token_id).first()
|
||||
if not token:
|
||||
token = select_token(request.user)
|
||||
if token:
|
||||
debit_token(request.user, slot, token)
|
||||
return redirect("epic:gatekeeper", room_id=room_id)
|
||||
|
||||
@@ -17,10 +17,12 @@ GAMEBOARD_APPLET_ORDER = [
|
||||
|
||||
@login_required(login_url="/")
|
||||
def gameboard(request):
|
||||
pass_token = request.user.tokens.filter(token_type=Token.PASS).first() if request.user.is_staff else None
|
||||
coin = request.user.tokens.filter(token_type=Token.COIN).first()
|
||||
free_tokens = list(request.user.tokens.filter(token_type=Token.FREE))
|
||||
return render(
|
||||
request, "apps/gameboard/gameboard.html", {
|
||||
"pass_token": pass_token,
|
||||
"coin": coin,
|
||||
"free_tokens": free_tokens,
|
||||
"applets": applet_context(request.user, "gameboard"),
|
||||
@@ -45,6 +47,7 @@ def toggle_game_applets(request):
|
||||
if request.headers.get("HX-Request"):
|
||||
return render(request, "apps/gameboard/_partials/_applets.html", {
|
||||
"applets": applet_context(request.user, "gameboard"),
|
||||
"pass_token": request.user.tokens.filter(token_type=Token.PASS).first() if request.user.is_staff else None,
|
||||
"coin": request.user.tokens.filter(token_type=Token.COIN).first(),
|
||||
"free_tokens": list(request.user.tokens.filter(token_type=Token.FREE)),
|
||||
"my_games": Room.objects.filter(
|
||||
|
||||
@@ -92,7 +92,7 @@ class Token(models.Model):
|
||||
return self.get_token_type_display()
|
||||
|
||||
def tooltip_description(self):
|
||||
if self.token_type in (self.COIN, self.FREE):
|
||||
if self.token_type in (self.COIN, self.FREE, self.PASS):
|
||||
return "Admit 1 Entry"
|
||||
if self.token_type == self.TITHE:
|
||||
return "+ Writ bonus"
|
||||
@@ -116,6 +116,8 @@ class Token(models.Model):
|
||||
def tooltip_shoptalk(self):
|
||||
if self.token_type == self.COIN:
|
||||
return "\u2026and another after that, and another after that\u2026"
|
||||
if self.token_type == self.PASS:
|
||||
return "\u2018Entry fee\u2019? Do you know who you\u2019re talking to?"
|
||||
return None
|
||||
|
||||
def tooltip_text(self):
|
||||
|
||||
Reference in New Issue
Block a user