Files
python-tdd/src/apps/epic/views.py

94 lines
3.1 KiB
Python
Raw Normal View History

from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import redirect, render
from apps.epic.models import Room, RoomInvite, debit_token
from apps.lyric.models import Token
@login_required
def create_room(request):
if request.method == "POST":
name = request.POST.get("name", "").strip()
if name:
room = Room.objects.create(name=name, owner=request.user)
return redirect("epic:gatekeeper", room_id=room.id)
return redirect("/gameboard/")
def gatekeeper(request, room_id):
room = Room.objects.get(id=room_id)
slots = room.gate_slots.order_by("slot_number")
user_has_slot = (
request.user.is_authenticated
and room.gate_slots.filter(gamer=request.user).exists()
)
return render(request, "apps/gameboard/room.html", {
"room": room,
"slots": slots,
"user_has_slot": user_has_slot,
})
@login_required
def drop_token(request, room_id, slot_number):
if request.method == "POST":
room = Room.objects.get(id=room_id)
slot = room.gate_slots.get(slot_number=slot_number)
token = (
request.user.tokens.filter(token_type=Token.COIN).first()
or request.user.tokens.filter(token_type=Token.FREE).first()
or request.user.tokens.filter(token_type=Token.TITHE).first()
)
if token:
debit_token(request.user, slot, token)
return redirect("epic:gatekeeper", room_id=room_id)
@login_required
def invite_gamer(request, room_id):
if request.method == "POST":
room = Room.objects.get(id=room_id)
email = request.POST.get("invitee_email", "").strip()
if email:
RoomInvite.objects.get_or_create(
room=room,
inviter=request.user,
invitee_email=email,
defaults={"status": RoomInvite.PENDING}
)
return redirect("epic:gatekeeper", room_id=room_id)
@login_required
def delete_room(request, room_id):
if request.method == "POST":
room = Room.objects.get(id=room_id)
if request.user == room.owner:
room.delete()
return redirect("/gameboard/")
@login_required
def abandon_room(request, room_id):
if request.method == "POST":
room = Room.objects.get(id=room_id)
room.gate_slots.filter(gamer=request.user).update(
gamer=None, status="EMPTY", filled_at=None
)
room.invites.filter(
invitee_email=request.user.email,
status=RoomInvite.PENDING
).delete()
return redirect("/gameboard/")
def gate_status(request, room_id):
room = Room.objects.get(id=room_id)
if room.gate_status == Room.OPEN:
return HttpResponse("")
slots = room.gate_slots.order_by("slot_number")
user_has_slot = (
request.user.is_authenticated
and slots.filter(gamer=request.user).exists()
)
return render(request, "apps/gameboard/_partials/_gatekeeper.html", {
"room": room,
"slots": slots,
"user_has_slot": user_has_slot,
})