mirror of
https://github.com/Crocmagnon/charasheet.git
synced 2024-11-22 22:48:03 +01:00
Allow adding new paths from sheet
This commit is contained in:
parent
f43116c635
commit
eeebbb4ca7
6 changed files with 63 additions and 8 deletions
|
@ -1,9 +1,21 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
from character.models import Character
|
from character.models import Character, Path
|
||||||
|
|
||||||
|
|
||||||
class EquipmentForm(forms.ModelForm):
|
class EquipmentForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Character
|
model = Character
|
||||||
fields = ["equipment", "money_pp", "money_po", "money_pa", "money_pc"]
|
fields = ["equipment", "money_pp", "money_po", "money_pa", "money_pc"]
|
||||||
|
|
||||||
|
|
||||||
|
class AddPathForm(forms.Form):
|
||||||
|
path = forms.ModelChoiceField(Path.objects.none())
|
||||||
|
|
||||||
|
def __init__(self, character: Character, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
paths = {cap.path_id for cap in character.capabilities.all()}
|
||||||
|
self.fields["path"].queryset = Path.objects.exclude(pk__in=paths).order_by(
|
||||||
|
"profile__name", "race__name"
|
||||||
|
)
|
||||||
|
self.fields["path"].widget.attrs["class"] = "form-select"
|
||||||
|
|
|
@ -40,6 +40,12 @@ class Path(DocumentedModel, UniquelyNamedModel, TimeStampedModel, models.Model):
|
||||||
verbose_name = "Voie"
|
verbose_name = "Voie"
|
||||||
verbose_name_plural = "Voies"
|
verbose_name_plural = "Voies"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
name = f"{self.display_name}"
|
||||||
|
if self.related_to:
|
||||||
|
name += f" ({self.related_to.name})"
|
||||||
|
return name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def display_name(self) -> str:
|
def display_name(self) -> str:
|
||||||
to_remove = ["voie de la", "voie de l'", "voie du", "voie des", "voie de"]
|
to_remove = ["voie de la", "voie de l'", "voie du", "voie des", "voie de"]
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
<div id="paths-and-capabilities">
|
||||||
|
<form>
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col col-lg-6">
|
||||||
|
<div class="input-group">
|
||||||
|
{{ add_path_form.path }}
|
||||||
|
<button class="btn btn-primary"
|
||||||
|
hx-target="#paths-and-capabilities"
|
||||||
|
hx-swap="outerHTML"
|
||||||
|
hx-post="{% url "character:add_path" pk=character.pk %}">
|
||||||
|
Sélectionner
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div class="row mt-2 gy-3">
|
||||||
|
{% for path, capabilities in character.get_capabilities_by_path.items %}
|
||||||
|
{% include "character/path.html" %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -1,4 +1,5 @@
|
||||||
{% extends "common/base.html" %}
|
{% extends "common/base.html" %}
|
||||||
|
{% load django_bootstrap5 %}
|
||||||
{% load character_extras %}
|
{% load character_extras %}
|
||||||
|
|
||||||
{% block title %}{{ character.name }}{% endblock %}
|
{% block title %}{{ character.name }}{% endblock %}
|
||||||
|
@ -336,10 +337,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h2>Voies & Capacités</h2>
|
<h2>Voies & Capacités</h2>
|
||||||
<div class="row gy-3">
|
{% include "character/paths_and_capabilities.html" %}
|
||||||
{% for path, capabilities in character.get_capabilities_by_path.items %}
|
|
||||||
{% include "character/path.html" %}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
{% include "character/notes_display.html" %}
|
{% include "character/notes_display.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -48,4 +48,5 @@ urlpatterns = [
|
||||||
views.remove_last_in_path,
|
views.remove_last_in_path,
|
||||||
name="remove_last_in_path",
|
name="remove_last_in_path",
|
||||||
),
|
),
|
||||||
|
path("<int:pk>/add_path/", views.add_path, name="add_path"),
|
||||||
]
|
]
|
||||||
|
|
|
@ -3,7 +3,7 @@ from django.http import HttpResponse
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
from django_htmx.http import trigger_client_event
|
from django_htmx.http import trigger_client_event
|
||||||
|
|
||||||
from character.forms import EquipmentForm
|
from character.forms import AddPathForm, EquipmentForm
|
||||||
from character.models import Capability, Character, Path
|
from character.models import Capability, Character, Path
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,10 +30,26 @@ def character_view(request, pk: int):
|
||||||
.prefetch_related("capabilities__path", "weapons"),
|
.prefetch_related("capabilities__path", "weapons"),
|
||||||
pk=pk,
|
pk=pk,
|
||||||
)
|
)
|
||||||
context = {"character": character}
|
add_path_form = AddPathForm(character)
|
||||||
|
context = {"character": character, "add_path_form": add_path_form}
|
||||||
return render(request, "character/view.html", context)
|
return render(request, "character/view.html", context)
|
||||||
|
|
||||||
|
|
||||||
|
@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)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def character_health_change(request, pk: int):
|
def character_health_change(request, pk: int):
|
||||||
character = get_object_or_404(
|
character = get_object_or_404(
|
||||||
|
|
Loading…
Reference in a new issue