diff --git a/src/character/forms.py b/src/character/forms.py
index f96cbe1..2bc8c42 100644
--- a/src/character/forms.py
+++ b/src/character/forms.py
@@ -1,9 +1,21 @@
from django import forms
-from character.models import Character
+from character.models import Character, Path
class EquipmentForm(forms.ModelForm):
class Meta:
model = Character
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"
diff --git a/src/character/models/capabilities.py b/src/character/models/capabilities.py
index 1bc0eea..20c94dd 100644
--- a/src/character/models/capabilities.py
+++ b/src/character/models/capabilities.py
@@ -40,6 +40,12 @@ class Path(DocumentedModel, UniquelyNamedModel, TimeStampedModel, models.Model):
verbose_name = "Voie"
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
def display_name(self) -> str:
to_remove = ["voie de la", "voie de l'", "voie du", "voie des", "voie de"]
diff --git a/src/character/templates/character/paths_and_capabilities.html b/src/character/templates/character/paths_and_capabilities.html
new file mode 100644
index 0000000..e997d8b
--- /dev/null
+++ b/src/character/templates/character/paths_and_capabilities.html
@@ -0,0 +1,23 @@
+
+
+
+ {% for path, capabilities in character.get_capabilities_by_path.items %}
+ {% include "character/path.html" %}
+ {% endfor %}
+
+
diff --git a/src/character/templates/character/view.html b/src/character/templates/character/view.html
index 850ae1d..eb63d64 100644
--- a/src/character/templates/character/view.html
+++ b/src/character/templates/character/view.html
@@ -1,4 +1,5 @@
{% extends "common/base.html" %}
+{% load django_bootstrap5 %}
{% load character_extras %}
{% block title %}{{ character.name }}{% endblock %}
@@ -336,10 +337,6 @@
Voies & Capacités
-
- {% for path, capabilities in character.get_capabilities_by_path.items %}
- {% include "character/path.html" %}
- {% endfor %}
-
+ {% include "character/paths_and_capabilities.html" %}
{% include "character/notes_display.html" %}
{% endblock %}
diff --git a/src/character/urls.py b/src/character/urls.py
index e2287de..7a0e8e9 100644
--- a/src/character/urls.py
+++ b/src/character/urls.py
@@ -48,4 +48,5 @@ urlpatterns = [
views.remove_last_in_path,
name="remove_last_in_path",
),
+ path("/add_path/", views.add_path, name="add_path"),
]
diff --git a/src/character/views.py b/src/character/views.py
index 3d956ca..3c732e7 100644
--- a/src/character/views.py
+++ b/src/character/views.py
@@ -3,7 +3,7 @@ from django.http import HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
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
@@ -30,10 +30,26 @@ def character_view(request, pk: int):
.prefetch_related("capabilities__path", "weapons"),
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)
+@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
def character_health_change(request, pk: int):
character = get_object_or_404(