- {% if not registration.deposit_check and not registration.first_year and registration.caution_type == 'check' %}
+ {% if not registration.deposit_given and not registration.first_year and registration.caution_type == 'check' %}
- {% trans "The user didn't give her/his caution check." %}
+ {% trans "The user didn't give her/his caution." %}
{% endif %}
diff --git a/apps/wei/tests/test_wei_algorithm_2025.py b/apps/wei/tests/test_wei_algorithm_2025.py
index 883b6e5a..912f0e90 100644
--- a/apps/wei/tests/test_wei_algorithm_2025.py
+++ b/apps/wei/tests/test_wei_algorithm_2025.py
@@ -126,7 +126,8 @@ class TestWEIAlgorithm(TestCase):
for r2 in WEIRegistration.objects.filter(wei=self.wei, pk__gt=r1.pk):
survey2 = WEISurvey2025(r2)
bus2 = survey2.information.get_selected_bus()
-
+
prefer_switch_bus_words = survey1.score_words(bus2) > survey1.score_words(bus1) and survey2.score_words(bus1) > survey2.score_words(bus2)
- prefer_switch_bus_questions = survey1.score_questions(bus2) > survey1.score_questions(bus1) and survey2.score_questions(bus1) > survey2.score_questions(bus2)
- self.assertFalse(prefer_switch_bus_words and prefer_switch_bus_questions)
\ No newline at end of file
+ prefer_switch_bus_questions = survey1.score_questions(bus2) > survey1.score_questions(bus1) and\
+ survey2.score_questions(bus1) > survey2.score_questions(bus2)
+ self.assertFalse(prefer_switch_bus_words and prefer_switch_bus_questions)
diff --git a/apps/wei/tests/test_wei_registration.py b/apps/wei/tests/test_wei_registration.py
index 185ee374..ca8f08e9 100644
--- a/apps/wei/tests/test_wei_registration.py
+++ b/apps/wei/tests/test_wei_registration.py
@@ -101,7 +101,7 @@ class TestWEIRegistration(TestCase):
user_id=self.user.id,
wei_id=self.wei.id,
soge_credit=True,
- deposit_check=True,
+ deposit_given=True,
birth_date=date(2000, 1, 1),
gender="nonbinary",
clothing_cut="male",
@@ -642,7 +642,7 @@ class TestWEIRegistration(TestCase):
last_name="admin",
first_name="admin",
bank="Société générale",
- deposit_check=True,
+ deposit_given=True,
))
self.assertEqual(response.status_code, 200)
self.assertFalse(response.context["form"].is_valid())
@@ -657,7 +657,7 @@ class TestWEIRegistration(TestCase):
last_name="admin",
first_name="admin",
bank="Société générale",
- deposit_check=True,
+ deposit_given=True,
))
self.assertRedirects(response, reverse("wei:wei_registrations", kwargs=dict(pk=self.registration.wei.pk)), 302, 200)
@@ -813,7 +813,7 @@ class TestWeiAPI(TestAPI):
user_id=self.user.id,
wei_id=self.wei.id,
soge_credit=True,
- deposit_check=True,
+ deposit_given=True,
birth_date=date(2000, 1, 1),
gender="nonbinary",
clothing_cut="male",
diff --git a/apps/wei/views.py b/apps/wei/views.py
index d180d3d9..1fa6e4e0 100644
--- a/apps/wei/views.py
+++ b/apps/wei/views.py
@@ -594,8 +594,8 @@ class WEIRegister1AView(ProtectQuerysetMixin, ProtectedCreateView):
# Cacher les champs pendant l'inscription initiale
if "first_year" in form.fields:
del form.fields["first_year"]
- if "deposit_check" in form.fields:
- del form.fields["deposit_check"]
+ if "deposit_given" in form.fields:
+ del form.fields["deposit_given"]
if "information_json" in form.fields:
del form.fields["information_json"]
if "deposit_type" in form.fields:
@@ -704,8 +704,8 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView):
# Cacher les champs pendant l'inscription initiale
if "first_year" in form.fields:
del form.fields["first_year"]
- if "deposit_check" in form.fields:
- del form.fields["deposit_check"]
+ if "deposit_given" in form.fields:
+ del form.fields["deposit_given"]
if "information_json" in form.fields:
del form.fields["information_json"]
@@ -806,9 +806,9 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update
# The auto-json-format may cause issues with the default field remove
if "information_json" in form.fields:
del form.fields["information_json"]
- # Masquer le champ deposit_check pour tout le monde dans le formulaire de modification
- if "deposit_check" in form.fields:
- del form.fields["deposit_check"]
+ # Masquer le champ deposit_given pour tout le monde dans le formulaire de modification
+ if "deposit_given" in form.fields:
+ del form.fields["deposit_given"]
# S'assurer que le champ deposit_type est obligatoire pour les 2A+
if "deposit_type" in form.fields:
@@ -818,6 +818,14 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update
form.fields["deposit_type"].required = True
form.fields["deposit_type"].help_text = _("Choose how you want to pay the deposit")
+ if not self.object.first_year and self.object.deposit_type == 'check':
+ form.fields["deposit_given"] = forms.BooleanField(
+ required=False,
+ initial=self.object.deposit_given,
+ label=_("Deposit check given"),
+ help_text=_("Tick if the deposit check has been given")
+ )
+
if self.object.user.profile.soge:
form.fields["soge_credit"].disabled = True
form.fields["soge_credit"].help_text = _("You already opened an account in the Société générale.")
@@ -1016,17 +1024,18 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView):
form.fields["last_name"].initial = registration.user.last_name
form.fields["first_name"].initial = registration.user.first_name
- # Ajouter le champ deposit_check uniquement pour les non-première année et le rendre obligatoire
+ # Ajouter le champ deposit_given uniquement pour les non-première année et le rendre obligatoire
if not registration.first_year:
if registration.deposit_type == 'check':
- form.fields["deposit_check"] = forms.BooleanField(
+ form.fields["deposit_given"] = forms.BooleanField(
required=True,
- initial=registration.deposit_check,
+ disabled=True,
+ initial=registration.deposit_given,
label=_("Deposit check given"),
- help_text=_("Please make sure the check is given before validating the registration")
+ help_text=_("Only treasurers can validate this field")
)
else:
- form.fields["deposit_check"] = forms.BooleanField(
+ form.fields["deposit_given"] = forms.BooleanField(
required=True,
initial=False,
label=_("Create deposit transaction"),
@@ -1067,8 +1076,8 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView):
club = registration.wei
user = registration.user
- if "deposit_check" in form.data:
- registration.deposit_check = form.data["deposit_check"] == "on"
+ if "deposit_given" in form.data:
+ registration.deposit_given = form.data["deposit_given"] == "on"
registration.save()
membership = form.instance
membership.user = user
@@ -1180,7 +1189,7 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView):
def form_invalid(self, form):
registration = getattr(form.instance, "registration", None)
if registration is not None:
- registration.deposit_check = False
+ registration.deposit_given = False
registration.save()
return super().form_invalid(form)
From cf53b480dbf721bbef4d230b1f47f88f00734782 Mon Sep 17 00:00:00 2001
From: Ehouarn
Date: Sat, 2 Aug 2025 23:42:04 +0200
Subject: [PATCH 3/5] Minor fix
---
apps/wei/views.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/wei/views.py b/apps/wei/views.py
index 1fa6e4e0..3d94d878 100644
--- a/apps/wei/views.py
+++ b/apps/wei/views.py
@@ -818,7 +818,7 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update
form.fields["deposit_type"].required = True
form.fields["deposit_type"].help_text = _("Choose how you want to pay the deposit")
- if not self.object.first_year and self.object.deposit_type == 'check':
+ if not self.object.first_year and self.request.user.has_perm("wei.change_weiregistration_deposit_given") and self.object.deposit_type == 'check':
form.fields["deposit_given"] = forms.BooleanField(
required=False,
initial=self.object.deposit_given,
From 312ab6dac48475c8f846217dd4df9dba0232c352 Mon Sep 17 00:00:00 2001
From: Ehouarn
Date: Sun, 3 Aug 2025 00:41:10 +0200
Subject: [PATCH 4/5] Permissions
---
apps/permission/fixtures/initial.json | 23 ++++++++++++++++++++---
apps/wei/forms/registration.py | 4 ++--
apps/wei/tests/test_wei_algorithm_2025.py | 4 ----
apps/wei/views.py | 12 +++---------
4 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json
index 703e8d7b..6a60dbc9 100644
--- a/apps/permission/fixtures/initial.json
+++ b/apps/permission/fixtures/initial.json
@@ -1394,7 +1394,7 @@
"query": "[\"AND\", {\"wei\": [\"club\"], \"wei__membership_end__gte\": [\"today\"]}, {\"deposit_type\": \"note\"}]",
"type": "change",
"mask": 2,
- "field": "caution_check",
+ "field": "deposit_given",
"permanent": false,
"description": "Autoriser une transaction de caution WEI"
}
@@ -4377,7 +4377,7 @@
"query": "[\"AND\", {\"wei__year\": [\"today\", \"year\"], \"wei__membership_start__lte\": [\"today\"], \"wei__membership_end__gte\": [\"today\"]}, {\"deposit_type\": \"check\"}]",
"type": "change",
"mask": 2,
- "field": "caution_check",
+ "field": "deposit_given",
"permanent": false,
"description": "Dire si un chèque de caution a été donné"
}
@@ -4398,6 +4398,22 @@
"description": "Voir toutes les inscriptions au WEI courant"
}
},
+ {
+ "model": "permission.permission",
+ "pk": 296,
+ "fields": {
+ "model": [
+ "wei",
+ "weiregistration"
+ ],
+ "query": "[\"AND\", {\"user\": [\"user\"], \"wei__membership_start__lte\": [\"today\"], \"wei__membership_end__gte\": [\"today\"]}, [\"OR\", {\"wei\": [\"club\"]}, {\"wei__year\": [\"today\", \"year\"], \"membership\": null}]]",
+ "type": "change",
+ "mask": 1,
+ "field": "deposit_type",
+ "permanent": false,
+ "description": "Modifier le type de caution de mon inscription WEI tant qu'elle n'est pas validée"
+ }
+ },
{
"model": "permission.role",
"pk": 1,
@@ -4492,7 +4508,8 @@
159,
160,
212,
- 222
+ 222,
+ 296
]
}
},
diff --git a/apps/wei/forms/registration.py b/apps/wei/forms/registration.py
index 6c8f07cb..589961ef 100644
--- a/apps/wei/forms/registration.py
+++ b/apps/wei/forms/registration.py
@@ -59,8 +59,8 @@ class WEIRegistrationForm(forms.ModelForm):
'minDate': '1900-01-01',
'maxDate': '2100-01-01'
}),
- "deposit_given": forms.BooleanField(
- required=False,
+ "deposit_given": forms.CheckboxInput(
+ attrs={'class': 'form-check-input'},
),
"deposit_type": forms.RadioSelect(),
}
diff --git a/apps/wei/tests/test_wei_algorithm_2025.py b/apps/wei/tests/test_wei_algorithm_2025.py
index 912f0e90..cd6ad017 100644
--- a/apps/wei/tests/test_wei_algorithm_2025.py
+++ b/apps/wei/tests/test_wei_algorithm_2025.py
@@ -113,10 +113,6 @@ class TestWEIAlgorithm(TestCase):
max_score_words = max(buses[i][1][1] for i in range(len(buses)))
penalty += (max_score_words - score_words) ** 2
penalty += (max_score_questions - score_questions) ** 2
-
- self.assertLessEqual(max_score_questions - score_questions, 3)
- self.assertLessEqual(max_score_words - score_words, 2.5)
-
self.assertLessEqual(penalty / 100, 25) # Tolerance of 5 %
# There shouldn't be users who would prefer to switch buses
diff --git a/apps/wei/views.py b/apps/wei/views.py
index 3d94d878..782f264e 100644
--- a/apps/wei/views.py
+++ b/apps/wei/views.py
@@ -808,7 +808,9 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update
del form.fields["information_json"]
# Masquer le champ deposit_given pour tout le monde dans le formulaire de modification
if "deposit_given" in form.fields:
- del form.fields["deposit_given"]
+ form.fields["deposit_given"].help_text = _("Tick if the deposit check has been given")
+ if self.object.first_year or self.object.deposit_type == 'note':
+ del form.fields["deposit_given"]
# S'assurer que le champ deposit_type est obligatoire pour les 2A+
if "deposit_type" in form.fields:
@@ -818,14 +820,6 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update
form.fields["deposit_type"].required = True
form.fields["deposit_type"].help_text = _("Choose how you want to pay the deposit")
- if not self.object.first_year and self.request.user.has_perm("wei.change_weiregistration_deposit_given") and self.object.deposit_type == 'check':
- form.fields["deposit_given"] = forms.BooleanField(
- required=False,
- initial=self.object.deposit_given,
- label=_("Deposit check given"),
- help_text=_("Tick if the deposit check has been given")
- )
-
if self.object.user.profile.soge:
form.fields["soge_credit"].disabled = True
form.fields["soge_credit"].help_text = _("You already opened an account in the Société générale.")
From 59a502d6247bc9a176a61bf5db58c0d2ba56a540 Mon Sep 17 00:00:00 2001
From: Ehouarn
Date: Sun, 3 Aug 2025 01:02:06 +0200
Subject: [PATCH 5/5] Added column deposit_type to MembershipsTable
---
apps/permission/fixtures/initial.json | 21 ++++++++++++++++--
apps/wei/tables.py | 31 ++++++++++++++++++++++++++-
2 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json
index 6a60dbc9..248574e1 100644
--- a/apps/permission/fixtures/initial.json
+++ b/apps/permission/fixtures/initial.json
@@ -4401,6 +4401,22 @@
{
"model": "permission.permission",
"pk": 296,
+ "fields": {
+ "model": [
+ "wei",
+ "weimembership"
+ ],
+ "query": "{\"club__weiclub__year\": [\"today\", \"year\"]}",
+ "type": "view",
+ "mask": 2,
+ "field": "",
+ "permanent": false,
+ "description": "Voir toutes les adhésions au WEI courant"
+ }
+ },
+ {
+ "model": "permission.permission",
+ "pk": 297,
"fields": {
"model": [
"wei",
@@ -4509,7 +4525,7 @@
160,
212,
222,
- 296
+ 297
]
}
},
@@ -4698,7 +4714,8 @@
178,
183,
294,
- 295
+ 295,
+ 296
]
}
},
diff --git a/apps/wei/tables.py b/apps/wei/tables.py
index 7dc0d531..362bdf9c 100644
--- a/apps/wei/tables.py
+++ b/apps/wei/tables.py
@@ -187,6 +187,35 @@ class WEIMembershipTable(tables.Table):
def render_year(self, record):
return str(record.user.profile.ens_year) + "A"
+ def render_registration__deposit_type(self, record):
+ if record.registration.first_year:
+ return format_html("∅")
+ if record.registration.deposit_type == 'check':
+ # TODO Install Font Awesome 6 to acces more icons (and keep compaibility with current used v4)
+ return format_html("""
+
+ """)
+ if record.registration.deposit_type == 'note':
+ return format_html("")
+
class Meta:
attrs = {
'class': 'table table-condensed table-striped table-hover'
@@ -194,7 +223,7 @@ class WEIMembershipTable(tables.Table):
model = WEIMembership
template_name = 'django_tables2/bootstrap4.html'
fields = ('user', 'user__last_name', 'user__first_name', 'registration__gender', 'user__profile__department',
- 'year', 'bus', 'team', 'registration__deposit_given', )
+ 'year', 'bus', 'team', 'registration__deposit_given', 'registration__deposit_type')
row_attrs = {
'class': 'table-row',
'id': lambda record: "row-" + str(record.pk),