Skip to content

Commit 5adffc0

Browse files
authored
Add blades formset in signage form (#5641)
1 parent 85802a3 commit 5adffc0

11 files changed

Lines changed: 143 additions & 73 deletions

File tree

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ CHANGELOG
88
**Improvements**
99

1010
* Remove ``deleted`` attribute from blade model
11+
* Allow to add multiple blades from signage form
1112

1213
**Documentation**
1314

geotrek/signage/forms.py

Lines changed: 59 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,33 @@
1212
from geotrek.common.forms import CommonForm
1313
from geotrek.core.widgets import PointTopologyWidget
1414
from geotrek.infrastructure.forms import BaseInfrastructureForm
15-
from geotrek.signage.models import Blade, Line, LinePictogram, Signage
15+
from geotrek.signage.models import Blade, BladeCondition, Line, LinePictogram, Signage
16+
17+
18+
class CleanDuplicatedNumbersMixin:
19+
duplication_error_message = None
20+
21+
def clean(self):
22+
"""Checks that no objects have the same number."""
23+
if any(self.errors):
24+
# Don't bother validating the formset unless each form is valid on its own
25+
return
26+
27+
numbers = {}
28+
29+
for form in self.forms:
30+
if self.can_delete and self._should_delete_form(form):
31+
continue
32+
number = form.cleaned_data.get("number")
33+
numbers.setdefault(number, []).append(form)
34+
35+
duplicates = {n: forms for n, forms in numbers.items() if len(forms) > 1}
36+
37+
if duplicates:
38+
for forms in duplicates.values():
39+
for form in forms:
40+
form.add_error("number", self.duplication_error_message)
41+
raise ValidationError(self.duplication_error_message)
1642

1743

1844
class LineForm(forms.ModelForm):
@@ -54,29 +80,8 @@ class Meta:
5480
)
5581

5682

57-
class BaseLineFormSet(BaseInlineFormSet):
58-
def clean(self):
59-
"""Checks that no two lines have the same number."""
60-
if any(self.errors):
61-
# Don't bother validating the formset unless each form is valid on its own
62-
return
63-
64-
msg = _("This order number is already used by another line.")
65-
numbers = {}
66-
67-
for form in self.forms:
68-
if self.can_delete and self._should_delete_form(form):
69-
continue
70-
number = form.cleaned_data.get("number")
71-
numbers.setdefault(number, []).append(form)
72-
73-
duplicates = {n: forms for n, forms in numbers.items() if len(forms) > 1}
74-
75-
if duplicates:
76-
for forms in duplicates.values():
77-
for form in forms:
78-
form.add_error("number", msg)
79-
raise ValidationError(msg)
83+
class BaseLineFormSet(CleanDuplicatedNumbersMixin, BaseInlineFormSet):
84+
duplication_error_message = _("This order number is already used by another line.")
8085

8186

8287
LineFormset = inlineformset_factory(
@@ -172,6 +177,35 @@ class Meta:
172177
fields = ["id", "number", "direction", "type", "conditions", "color"]
173178

174179

180+
class BladeFormsetForm(forms.ModelForm):
181+
def __init__(self, *args, **kwargs):
182+
super().__init__(*args, **kwargs)
183+
184+
fields_for_layout = Div(
185+
"id", "number", "direction", "type", "conditions", "color"
186+
)
187+
188+
self.helper = FormHelper()
189+
self.helper.form_tag = False
190+
self.helper.layout = Layout(*fields_for_layout)
191+
self.fields["conditions"].widget = autocomplete.Select2Multiple(
192+
attrs={"data-theme": "bootstrap4"},
193+
)
194+
self.fields["conditions"].queryset = BladeCondition.objects.all()
195+
196+
class Meta:
197+
fields = ["id", "number", "direction", "type", "conditions", "color"]
198+
199+
200+
class BaseBladeFormSet(CleanDuplicatedNumbersMixin, BaseInlineFormSet):
201+
duplication_error_message = _("This order number is already used by another blade.")
202+
203+
204+
BladeFormset = inlineformset_factory(
205+
Signage, Blade, form=BladeFormsetForm, formset=BaseBladeFormSet, extra=1
206+
)
207+
208+
175209
if settings.TREKKING_TOPOLOGY_ENABLED:
176210

177211
class BaseSignageForm(BaseInfrastructureForm):
@@ -207,6 +241,7 @@ class SignageForm(BaseSignageForm):
207241
"manager",
208242
"sealing",
209243
"access",
244+
Fieldset(_("Blades")),
210245
)
211246
]
212247

geotrek/signage/locale/de/LC_MESSAGES/django.po

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: PACKAGE VERSION\n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2026-07-13 13:27+0000\n"
10+
"POT-Creation-Date: 2026-08-14 08:17+0000\n"
1111
"PO-Revision-Date: 2025-10-22 09:01+0000\n"
1212
"Last-Translator: Anonymous <noreply@weblate.org>\n"
1313
"Language-Team: German <https://weblate.makina-corpus.net/projects/geotrek-admin/signage/de/>\n"
@@ -54,6 +54,12 @@ msgstr ""
5454
msgid "Position of the blade on the signage (top=1). Assigning a position that has already been used will shift the positions of the other blades"
5555
msgstr ""
5656

57+
msgid "This order number is already used by another blade."
58+
msgstr ""
59+
60+
msgid "Blades"
61+
msgstr ""
62+
5763
msgid "Sealing"
5864
msgstr ""
5965

@@ -141,9 +147,6 @@ msgstr ""
141147
msgid "Blade"
142148
msgstr ""
143149

144-
msgid "Blades"
145-
msgstr ""
146-
147150
msgid "Text"
148151
msgstr ""
149152

@@ -193,9 +196,6 @@ msgstr ""
193196
msgid "Add a new signage"
194197
msgstr ""
195198

196-
msgid "Edit"
197-
msgstr ""
198-
199199
msgid "Add"
200200
msgstr ""
201201

geotrek/signage/locale/en/LC_MESSAGES/django.po

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ msgid ""
88
msgstr ""
99
"Project-Id-Version: PACKAGE VERSION\n"
1010
"Report-Msgid-Bugs-To: \n"
11-
"POT-Creation-Date: 2026-07-13 13:27+0000\n"
11+
"POT-Creation-Date: 2026-08-14 08:17+0000\n"
1212
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -54,6 +54,12 @@ msgstr ""
5454
msgid "Position of the blade on the signage (top=1). Assigning a position that has already been used will shift the positions of the other blades"
5555
msgstr ""
5656

57+
msgid "This order number is already used by another blade."
58+
msgstr ""
59+
60+
msgid "Blades"
61+
msgstr ""
62+
5763
msgid "Sealing"
5864
msgstr ""
5965

@@ -141,9 +147,6 @@ msgstr ""
141147
msgid "Blade"
142148
msgstr ""
143149

144-
msgid "Blades"
145-
msgstr ""
146-
147150
msgid "Text"
148151
msgstr ""
149152

@@ -193,9 +196,6 @@ msgstr ""
193196
msgid "Add a new signage"
194197
msgstr ""
195198

196-
msgid "Edit"
197-
msgstr ""
198-
199199
msgid "Add"
200200
msgstr ""
201201

geotrek/signage/locale/es/LC_MESSAGES/django.po

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: PACKAGE VERSION\n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2026-07-13 13:27+0000\n"
10+
"POT-Creation-Date: 2026-08-14 08:17+0000\n"
1111
"PO-Revision-Date: 2025-10-22 09:01+0000\n"
1212
"Last-Translator: Anonymous <noreply@weblate.org>\n"
1313
"Language-Team: Spanish <https://weblate.makina-corpus.net/projects/geotrek-admin/signage/es/>\n"
@@ -54,6 +54,12 @@ msgstr ""
5454
msgid "Position of the blade on the signage (top=1). Assigning a position that has already been used will shift the positions of the other blades"
5555
msgstr ""
5656

57+
msgid "This order number is already used by another blade."
58+
msgstr ""
59+
60+
msgid "Blades"
61+
msgstr ""
62+
5763
msgid "Sealing"
5864
msgstr ""
5965

@@ -141,9 +147,6 @@ msgstr ""
141147
msgid "Blade"
142148
msgstr ""
143149

144-
msgid "Blades"
145-
msgstr ""
146-
147150
msgid "Text"
148151
msgstr ""
149152

@@ -193,9 +196,6 @@ msgstr ""
193196
msgid "Add a new signage"
194197
msgstr ""
195198

196-
msgid "Edit"
197-
msgstr ""
198-
199199
msgid "Add"
200200
msgstr ""
201201

geotrek/signage/locale/fr/LC_MESSAGES/django.po

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: \n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2026-07-13 13:27+0000\n"
10+
"POT-Creation-Date: 2026-08-14 08:17+0000\n"
1111
"PO-Revision-Date: 2025-10-22 09:00+0000\n"
1212
"Last-Translator: Anonymous <noreply@weblate.org>\n"
1313
"Language-Team: French <https://weblate.makina-corpus.net/projects/geotrek-admin/signage/fr/>\n"
@@ -54,6 +54,12 @@ msgstr "Lignes"
5454
msgid "Position of the blade on the signage (top=1). Assigning a position that has already been used will shift the positions of the other blades"
5555
msgstr "Position de la lame sur la signalétique (haut = 1). Si vous attribuez une position déjà utilisée, cela déplacera les positions des autres lames"
5656

57+
msgid "This order number is already used by another blade."
58+
msgstr "Ce numéro d'ordre est déjà utilisé par une autre lame."
59+
60+
msgid "Blades"
61+
msgstr "Lames"
62+
5763
msgid "Sealing"
5864
msgstr "Scellement"
5965

@@ -141,9 +147,6 @@ msgstr "Commune"
141147
msgid "Blade"
142148
msgstr "Lame"
143149

144-
msgid "Blades"
145-
msgstr "Lames"
146-
147150
msgid "Text"
148151
msgstr "Texte"
149152

@@ -193,9 +196,6 @@ msgstr "Ajouter une lame"
193196
msgid "Add a new signage"
194197
msgstr "Ajouter une signalétique"
195198

196-
msgid "Edit"
197-
msgstr "Modifier"
198-
199199
msgid "Add"
200200
msgstr "Ajouter"
201201

geotrek/signage/locale/it/LC_MESSAGES/django.po

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: PACKAGE VERSION\n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2026-07-13 13:27+0000\n"
10+
"POT-Creation-Date: 2026-08-14 08:17+0000\n"
1111
"PO-Revision-Date: 2025-10-22 09:01+0000\n"
1212
"Last-Translator: Anonymous <noreply@weblate.org>\n"
1313
"Language-Team: Italian <https://weblate.makina-corpus.net/projects/geotrek-admin/signage/it/>\n"
@@ -54,6 +54,12 @@ msgstr ""
5454
msgid "Position of the blade on the signage (top=1). Assigning a position that has already been used will shift the positions of the other blades"
5555
msgstr ""
5656

57+
msgid "This order number is already used by another blade."
58+
msgstr ""
59+
60+
msgid "Blades"
61+
msgstr ""
62+
5763
msgid "Sealing"
5864
msgstr ""
5965

@@ -141,9 +147,6 @@ msgstr ""
141147
msgid "Blade"
142148
msgstr ""
143149

144-
msgid "Blades"
145-
msgstr ""
146-
147150
msgid "Text"
148151
msgstr ""
149152

@@ -193,9 +196,6 @@ msgstr ""
193196
msgid "Add a new signage"
194197
msgstr ""
195198

196-
msgid "Edit"
197-
msgstr ""
198-
199199
msgid "Add"
200200
msgstr ""
201201

geotrek/signage/locale/nl/LC_MESSAGES/django.po

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: PACKAGE VERSION\n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2026-07-13 13:27+0000\n"
10+
"POT-Creation-Date: 2026-08-14 08:17+0000\n"
1111
"PO-Revision-Date: 2025-10-22 09:01+0000\n"
1212
"Last-Translator: Anonymous <noreply@weblate.org>\n"
1313
"Language-Team: Dutch <https://weblate.makina-corpus.net/projects/geotrek-admin/signage/nl/>\n"
@@ -54,6 +54,12 @@ msgstr ""
5454
msgid "Position of the blade on the signage (top=1). Assigning a position that has already been used will shift the positions of the other blades"
5555
msgstr ""
5656

57+
msgid "This order number is already used by another blade."
58+
msgstr ""
59+
60+
msgid "Blades"
61+
msgstr ""
62+
5763
msgid "Sealing"
5864
msgstr ""
5965

@@ -141,9 +147,6 @@ msgstr ""
141147
msgid "Blade"
142148
msgstr ""
143149

144-
msgid "Blades"
145-
msgstr ""
146-
147150
msgid "Text"
148151
msgstr ""
149152

@@ -193,9 +196,6 @@ msgstr ""
193196
msgid "Add a new signage"
194197
msgstr ""
195198

196-
msgid "Edit"
197-
msgstr ""
198-
199199
msgid "Add"
200200
msgstr ""
201201

geotrek/signage/templates/signage/signage_form.html

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@
77
{% crispy form %}
88

99
<fieldset class="formset">
10+
{{ blade_formset.non_form_errors }}
1011
{{ blade_formset.management_form }}
1112
{% for blade_form in blade_formset.forms %}
12-
<div class="form-row inline controls controls-row {{ blade_from.prefix }}">
13+
<div class="form-row inline controls controls-row {{ blade_form.prefix }}">
14+
{% if blade_form.instance.pk %}{{ blade_form.DELETE }}{% endif %}
1315
{% crispy blade_form %}
14-
{% if blade_form.instance.pk %}
15-
<a href="{% url 'signage:blade_edit' pk=blade_form.instance.pk %}">{% trans "Edit" %}</a>
16-
{% endif %}
1716
</div>
1817
{% endfor %}
1918
</fieldset>

0 commit comments

Comments
 (0)