charasheet/src/character/views.py

225 lines
7.4 KiB
Python
Raw Normal View History

2022-10-30 10:12:49 +01:00
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
2022-10-30 23:33:28 +01:00
from django_htmx.http import trigger_client_event
2022-10-30 10:12:49 +01:00
2022-10-31 23:23:28 +01:00
from character.forms import AddPathForm, EquipmentForm
2022-10-31 22:50:17 +01:00
from character.models import Capability, Character, Path
2022-10-30 10:12:49 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def characters_list(request):
2022-10-31 14:47:13 +01:00
context = {
"characters": Character.objects.filter(player=request.user).select_related(
"race", "profile"
)
}
2022-10-31 10:25:26 +01:00
return render(request, "character/list.html", context)
@login_required
def character_create(request):
return redirect("admin:character_character_add")
2022-10-31 10:25:26 +01:00
@login_required
def character_view(request, pk: int):
2022-10-30 17:56:36 +01:00
character = get_object_or_404(
Character.objects.filter(player=request.user)
.select_related("player", "racial_capability", "profile", "race")
.prefetch_related("capabilities__path", "weapons"),
2022-10-30 17:56:36 +01:00
pk=pk,
)
2022-10-31 23:23:28 +01:00
add_path_form = AddPathForm(character)
context = {"character": character, "add_path_form": add_path_form}
2022-10-30 10:12:49 +01:00
return render(request, "character/view.html", context)
2022-10-30 17:37:09 +01:00
2022-10-31 23:23:28 +01:00
@login_required
def add_path(request, pk: int):
character = get_object_or_404(Character.objects.filter(player=request.user), pk=pk)
form = AddPathForm(character, request.POST)
context = {"character": character}
if form.is_valid():
path: Path = form.cleaned_data.get("path")
cap = path.get_next_capability(character)
character.capabilities.add(cap)
context["add_path_form"] = AddPathForm(character)
else:
context["add_path_form"] = form
return render(request, "character/paths_and_capabilities.html", context)
2022-10-30 17:37:09 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def character_health_change(request, pk: int):
2022-10-30 17:56:36 +01:00
character = get_object_or_404(
Character.objects.filter(player=request.user).only(
"health_max", "health_remaining"
),
pk=pk,
2022-10-30 17:56:36 +01:00
)
2022-10-30 18:42:55 +01:00
value = get_updated_value(request, character.health_remaining, character.health_max)
2022-10-30 17:56:36 +01:00
character.health_remaining = value
2022-10-30 17:37:09 +01:00
character.save(update_fields=["health_remaining"])
2022-10-30 18:45:30 +01:00
return HttpResponse(value)
2022-10-30 17:47:42 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def character_mana_change(request, pk: int):
2022-10-30 17:56:36 +01:00
character = get_object_or_404(
Character.objects.filter(player=request.user)
.only("mana_remaining", "level", "value_intelligence", "profile")
.select_related("profile"),
2022-10-30 22:44:28 +01:00
pk=pk,
2022-10-30 17:56:36 +01:00
)
2022-10-30 18:42:55 +01:00
value = get_updated_value(request, character.mana_remaining, character.mana_max)
2022-10-30 17:56:36 +01:00
character.mana_remaining = value
character.save(update_fields=["mana_remaining"])
2022-10-30 18:45:30 +01:00
return HttpResponse(value)
2022-10-30 17:56:36 +01:00
2022-10-30 21:55:05 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def character_recovery_points_change(request, pk: int):
2022-10-30 21:55:05 +01:00
character = get_object_or_404(
Character.objects.filter(player=request.user).only("recovery_points_remaining"),
pk=pk,
2022-10-30 21:55:05 +01:00
)
value = get_updated_value(
request, character.recovery_points_remaining, character.recovery_points_max
)
character.recovery_points_remaining = value
character.save(update_fields=["recovery_points_remaining"])
return HttpResponse(value)
2022-10-30 23:33:28 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def character_defense_misc_change(request, pk: int):
character = get_object_or_404(
Character.objects.filter(player=request.user).only("defense_misc"), pk=pk
)
2022-10-30 23:33:28 +01:00
value = get_updated_value(request, character.defense_misc, float("inf"))
character.defense_misc = value
character.save(update_fields=["defense_misc"])
response = HttpResponse(value)
return trigger_client_event(response, "update_defense", {})
2022-10-30 22:02:21 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def character_luck_points_change(request, pk: int):
2022-10-30 22:02:21 +01:00
character = get_object_or_404(
Character.objects.filter(player=request.user).only(
"luck_points_remaining", "value_charisma"
),
pk=pk,
2022-10-30 22:02:21 +01:00
)
value = get_updated_value(
request, character.luck_points_remaining, character.luck_points_max
)
character.luck_points_remaining = value
character.save(update_fields=["luck_points_remaining"])
return HttpResponse(value)
2022-10-31 10:25:26 +01:00
def get_updated_value(request, remaining_value: int, max_value: int | float) -> int:
2022-10-30 18:42:55 +01:00
form_value = request.GET.get("value")
if form_value == "ko":
remaining_value = 0
elif form_value == "max":
remaining_value = max_value
2022-10-30 17:47:42 +01:00
else:
2022-10-30 18:42:55 +01:00
form_value = int(form_value)
remaining_value += form_value
remaining_value = min([max_value, remaining_value])
remaining_value = max([0, remaining_value])
return remaining_value
2022-10-30 18:33:30 +01:00
2022-10-30 23:33:28 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def character_get_defense(request, pk: int):
2022-10-30 23:33:28 +01:00
character = get_object_or_404(
Character.objects.filter(player=request.user).only(
"defense_misc", "armor", "shield", "value_dexterity"
),
2022-10-30 23:33:28 +01:00
pk=pk,
)
return HttpResponse(character.defense)
2022-10-30 18:33:30 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def character_notes_change(request, pk: int):
2022-10-30 18:36:18 +01:00
return update_text_field(request, pk, "notes")
2022-10-30 18:33:30 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def character_equipment_change(request, pk: int):
2022-10-31 00:06:20 +01:00
field = "equipment"
character = get_object_or_404(
Character.objects.filter(player=request.user).only(field), pk=pk
)
2022-10-31 00:06:20 +01:00
context = {"character": character}
if request.method == "GET":
return render(request, f"character/{field}_update.html", context)
form = EquipmentForm(request.POST, instance=character)
if form.is_valid():
form.save()
return render(request, f"character/{field}_display.html", context)
else:
context["errors"] = form.errors
return render(request, f"character/{field}_update.html", context)
2022-10-30 18:36:18 +01:00
2022-10-30 23:44:02 +01:00
@login_required
2022-10-31 10:25:26 +01:00
def character_damage_reduction_change(request, pk: int):
2022-10-30 23:44:02 +01:00
return update_text_field(request, pk, "damage_reduction")
2022-10-30 18:36:18 +01:00
def update_text_field(request, pk, field):
character = get_object_or_404(
Character.objects.filter(player=request.user).only(field), pk=pk
)
2022-10-30 18:33:30 +01:00
context = {"character": character}
if request.method == "GET":
2022-10-30 18:36:18 +01:00
return render(request, f"character/{field}_update.html", context)
setattr(character, field, request.POST.get(field))
2022-10-30 18:45:30 +01:00
character.save(update_fields=[field])
2022-10-30 18:36:18 +01:00
return render(request, f"character/{field}_display.html", context)
2022-10-31 22:32:14 +01:00
@login_required
def add_next_in_path(request, character_pk: int, path_pk: int):
character = get_object_or_404(
Character.objects.filter(player=request.user), pk=character_pk
)
path = get_object_or_404(Path, pk=path_pk)
capability = path.get_next_capability(character)
character.capabilities.add(capability)
2022-10-31 22:50:17 +01:00
context = {
"capabilities": character.capabilities.filter(path=path).order_by("rank"),
"path": path,
"character": character,
}
return render(request, "character/path.html", context)
@login_required
def remove_last_in_path(request, character_pk: int, path_pk: int):
character = get_object_or_404(
Character.objects.filter(player=request.user), pk=character_pk
)
path = get_object_or_404(Path, pk=path_pk)
last_rank = max(
character.capabilities.filter(path=path).values_list("rank", flat=True)
)
cap = Capability.objects.get(path=path, rank=last_rank)
character.capabilities.remove(cap)
capabilities = character.capabilities.filter(path=path).order_by("rank")
if len(capabilities) == 0:
return HttpResponse()
context = {
"capabilities": capabilities,
"path": path,
"character": character,
}
return render(request, "character/path.html", context)