From 852651d126686b5feef1d59a165755e89b64ca63 Mon Sep 17 00:00:00 2001 From: Ehouarn Date: Tue, 15 Jul 2025 18:10:28 +0200 Subject: [PATCH] Rename 'caution' fields into 'deposit' --- apps/wei/api/views.py | 2 +- apps/wei/forms/registration.py | 12 +-- ..._remove_weiclub_caution_amount_and_more.py | 40 ++++++++++ apps/wei/models.py | 12 +-- apps/wei/tables.py | 4 +- apps/wei/templates/wei/base.html | 6 +- .../wei/templates/wei/weimembership_form.html | 12 +-- apps/wei/tests/test_wei_registration.py | 24 +++--- apps/wei/views.py | 76 +++++++++---------- 9 files changed, 114 insertions(+), 74 deletions(-) create mode 100644 apps/wei/migrations/0015_remove_weiclub_caution_amount_and_more.py diff --git a/apps/wei/api/views.py b/apps/wei/api/views.py index f6eecbfc..9f25e4d3 100644 --- a/apps/wei/api/views.py +++ b/apps/wei/api/views.py @@ -77,7 +77,7 @@ class WEIRegistrationViewSet(ReadProtectedModelViewSet): filter_backends = [DjangoFilterBackend, RegexSafeSearchFilter] filterset_fields = ['user', 'user__username', 'user__first_name', 'user__last_name', 'user__email', 'user__note__alias__name', 'user__note__alias__normalized_name', 'wei', 'wei__name', - 'wei__email', 'wei__year', 'soge_credit', 'caution_check', 'birth_date', 'gender', + 'wei__email', 'wei__year', 'soge_credit', 'deposit_check', 'birth_date', 'gender', 'clothing_cut', 'clothing_size', 'first_year', 'emergency_contact_name', 'emergency_contact_phone', ] search_fields = ['$user__username', '$user__first_name', '$user__last_name', '$user__email', diff --git a/apps/wei/forms/registration.py b/apps/wei/forms/registration.py index 969c8eba..7dd40558 100644 --- a/apps/wei/forms/registration.py +++ b/apps/wei/forms/registration.py @@ -24,7 +24,7 @@ class WEIForm(forms.ModelForm): "membership_end": DatePickerInput(), "date_start": DatePickerInput(), "date_end": DatePickerInput(), - "caution_amount": AmountInput(), + "deposit_amount": AmountInput(), } @@ -43,7 +43,7 @@ class WEIRegistrationForm(forms.ModelForm): fields = [ 'user', 'soge_credit', 'birth_date', 'gender', 'clothing_size', 'health_issues', 'emergency_contact_name', 'emergency_contact_phone', - 'first_year', 'information_json', 'caution_check' + 'first_year', 'information_json', 'deposit_check' ] widgets = { "user": Autocomplete( @@ -58,7 +58,7 @@ class WEIRegistrationForm(forms.ModelForm): 'minDate': '1900-01-01', 'maxDate': '2100-01-01' }), - "caution_check": forms.BooleanField( + "deposit_check": forms.BooleanField( required=False, ), } @@ -66,10 +66,10 @@ class WEIRegistrationForm(forms.ModelForm): class WEIRegistration2AForm(WEIRegistrationForm): class Meta(WEIRegistrationForm.Meta): - fields = WEIRegistrationForm.Meta.fields + ['caution_type'] + fields = WEIRegistrationForm.Meta.fields + ['deposit_type'] widgets = WEIRegistrationForm.Meta.widgets.copy() widgets.update({ - "caution_type": forms.RadioSelect(), + "deposit_type": forms.RadioSelect(), }) @@ -173,7 +173,7 @@ class WEIMembership1AForm(WEIMembershipForm): """ Used to confirm registrations of first year members without choosing a bus now. """ - caution_check = None + deposit_check = None roles = None def clean(self): diff --git a/apps/wei/migrations/0015_remove_weiclub_caution_amount_and_more.py b/apps/wei/migrations/0015_remove_weiclub_caution_amount_and_more.py new file mode 100644 index 00000000..950b4965 --- /dev/null +++ b/apps/wei/migrations/0015_remove_weiclub_caution_amount_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 4.2.23 on 2025-07-15 16:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wei', '0014_weiclub_fee_soge_credit'), + ] + + operations = [ + migrations.RemoveField( + model_name='weiclub', + name='caution_amount', + ), + migrations.RemoveField( + model_name='weiregistration', + name='caution_check', + ), + migrations.RemoveField( + model_name='weiregistration', + name='caution_type', + ), + migrations.AddField( + model_name='weiclub', + name='deposit_amount', + field=models.PositiveIntegerField(default=0, verbose_name='deposit amount'), + ), + migrations.AddField( + model_name='weiregistration', + name='deposit_check', + field=models.BooleanField(default=False, verbose_name='Deposit check given'), + ), + migrations.AddField( + model_name='weiregistration', + name='deposit_type', + field=models.CharField(choices=[('check', 'Check'), ('note', 'Note transaction')], default='check', max_length=16, verbose_name='deposit type'), + ), + ] diff --git a/apps/wei/models.py b/apps/wei/models.py index cf31997f..2c2a0635 100644 --- a/apps/wei/models.py +++ b/apps/wei/models.py @@ -33,8 +33,8 @@ class WEIClub(Club): verbose_name=_("date end"), ) - caution_amount = models.PositiveIntegerField( - verbose_name=_("caution amount"), + deposit_amount = models.PositiveIntegerField( + verbose_name=_("deposit amount"), default=0, ) @@ -202,19 +202,19 @@ class WEIRegistration(models.Model): verbose_name=_("Credit from Société générale"), ) - caution_check = models.BooleanField( + deposit_check = models.BooleanField( default=False, - verbose_name=_("Caution check given") + verbose_name=_("Deposit check given") ) - caution_type = models.CharField( + deposit_type = models.CharField( max_length=16, choices=( ('check', _("Check")), ('note', _("Note transaction")), ), default='check', - verbose_name=_("caution type"), + verbose_name=_("deposit type"), ) birth_date = models.DateField( diff --git a/apps/wei/tables.py b/apps/wei/tables.py index c8837e44..9daadcb6 100644 --- a/apps/wei/tables.py +++ b/apps/wei/tables.py @@ -123,7 +123,7 @@ class WEIRegistrationTable(tables.Table): } model = WEIRegistration template_name = 'django_tables2/bootstrap4.html' - fields = ('user', 'user__first_name', 'user__last_name', 'first_year', 'caution_check', + fields = ('user', 'user__first_name', 'user__last_name', 'first_year', 'deposit_check', 'edit', 'validate', 'delete',) row_attrs = { 'class': 'table-row', @@ -163,7 +163,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__caution_check', ) + 'year', 'bus', 'team', 'registration__deposit_check', ) row_attrs = { 'class': 'table-row', 'id': lambda record: "row-" + str(record.pk), diff --git a/apps/wei/templates/wei/base.html b/apps/wei/templates/wei/base.html index 975b71c8..efb619ac 100644 --- a/apps/wei/templates/wei/base.html +++ b/apps/wei/templates/wei/base.html @@ -49,9 +49,9 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endif %} {% endif %} - {% if club.caution_amount > 0 %} -
{% trans 'Caution amount'|capfirst %}
-
{{ club.caution_amount|pretty_money }}
+ {% if club.deposit_amount > 0 %} +
{% trans 'Deposit amount'|capfirst %}
+
{{ club.deposit_amount|pretty_money }}
{% endif %} {% if "note.view_note"|has_perm:club.note %} diff --git a/apps/wei/templates/wei/weimembership_form.html b/apps/wei/templates/wei/weimembership_form.html index 483e1297..6d5c0b37 100644 --- a/apps/wei/templates/wei/weimembership_form.html +++ b/apps/wei/templates/wei/weimembership_form.html @@ -95,8 +95,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% trans "The algorithm didn't run." %}
{% endif %} {% else %} -
{% trans 'caution check given'|capfirst %}
-
{{ registration.caution_check|yesno }}
+
{% trans 'Deposit check given'|capfirst %}
+
{{ registration.deposit_check|yesno }}
{% with information=registration.information %}
{% trans 'preferred bus'|capfirst %}
@@ -149,12 +149,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
  • {% blocktrans trimmed with amount=fee|pretty_money %} Membership fees: {{ amount }} {% endblocktrans %}
  • - {% if registration.caution_type == 'note' %} -
  • {% blocktrans trimmed with amount=club.caution_amount|pretty_money %} + {% if registration.deposit_type == 'note' %} +
  • {% blocktrans trimmed with amount=club.deposit_amount|pretty_money %} Deposit (by Note transaction): {{ amount }} {% endblocktrans %}
  • {% else %} -
  • {% blocktrans trimmed with amount=club.caution_amount|pretty_money %} +
  • {% blocktrans trimmed with amount=club.deposit_amount|pretty_money %} Deposit (by check): {{ amount }} {% endblocktrans %}
  • {% endif %} @@ -167,7 +167,7 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endblocktrans %}

    - {% if not registration.caution_check and not registration.first_year and registration.caution_type == 'check' %} + {% if not registration.deposit_check and not registration.first_year and registration.caution_type == 'check' %}
    {% trans "The user didn't give her/his caution check." %}
    diff --git a/apps/wei/tests/test_wei_registration.py b/apps/wei/tests/test_wei_registration.py index 62e73235..185ee374 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, - caution_check=True, + deposit_check=True, birth_date=date(2000, 1, 1), gender="nonbinary", clothing_cut="male", @@ -127,7 +127,7 @@ class TestWEIRegistration(TestCase): year=self.year + 1, date_start=str(self.year + 1) + "-09-01", date_end=str(self.year + 1) + "-09-03", - caution_amount=12000, + deposit_amount=12000, )) qs = WEIClub.objects.filter(name="Create WEI Test", year=self.year + 1) self.assertTrue(qs.exists()) @@ -163,7 +163,7 @@ class TestWEIRegistration(TestCase): membership_end="2000-09-30", date_start="2000-09-01", date_end="2000-09-03", - caution_amount=12000, + deposit_amount=12000, )) qs = WEIClub.objects.filter(name="Update WEI Test", id=self.wei.id) self.assertRedirects(response, reverse("wei:wei_detail", kwargs=dict(pk=self.wei.pk)), 302, 200) @@ -322,7 +322,7 @@ class TestWEIRegistration(TestCase): bus=[], team=[], roles=[], - caution_type='check' + deposit_type='check' )) self.assertEqual(response.status_code, 200) self.assertFalse(response.context["membership_form"].is_valid()) @@ -340,7 +340,7 @@ class TestWEIRegistration(TestCase): bus=[self.bus.id], team=[self.team.id], roles=[role.id for role in WEIRole.objects.filter(~Q(name="1A") & ~Q(name="GC WEI")).all()], - caution_type='check' + deposit_type='check' )) qs = WEIRegistration.objects.filter(user_id=user.id) self.assertTrue(qs.exists()) @@ -360,7 +360,7 @@ class TestWEIRegistration(TestCase): bus=[self.bus.id], team=[self.team.id], roles=[role.id for role in WEIRole.objects.filter(~Q(name="1A")).all()], - caution_type='check' + deposit_type='check' )) self.assertEqual(response.status_code, 200) self.assertTrue("This user is already registered to this WEI." in str(response.context["form"].errors)) @@ -513,7 +513,7 @@ class TestWEIRegistration(TestCase): team=[self.team.id], roles=[role.id for role in WEIRole.objects.filter(name="Adhérent⋅e WEI").all()], information_json=self.registration.information_json, - caution_type='check' + deposit_type='check' ) ) qs = WEIRegistration.objects.filter(user_id=self.user.id, soge_credit=False, clothing_size="M") @@ -568,7 +568,7 @@ class TestWEIRegistration(TestCase): team=[self.team.id], roles=[role.id for role in WEIRole.objects.filter(name="Adhérent⋅e WEI").all()], information_json=self.registration.information_json, - caution_type='check' + deposit_type='check' ) ) qs = WEIRegistration.objects.filter(user_id=self.user.id, clothing_size="L") @@ -592,7 +592,7 @@ class TestWEIRegistration(TestCase): team=[], roles=[], information_json=self.registration.information_json, - caution_type='check' + deposit_type='check' ) ) self.assertFalse(response.context["membership_form"].is_valid()) @@ -642,7 +642,7 @@ class TestWEIRegistration(TestCase): last_name="admin", first_name="admin", bank="Société générale", - caution_check=True, + deposit_check=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", - caution_check=True, + deposit_check=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, - caution_check=True, + deposit_check=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 dbfd1774..4ac679f9 100644 --- a/apps/wei/views.py +++ b/apps/wei/views.py @@ -560,12 +560,12 @@ class WEIRegister1AView(ProtectQuerysetMixin, ProtectedCreateView): # Cacher les champs pendant l'inscription initiale if "first_year" in form.fields: del form.fields["first_year"] - if "caution_check" in form.fields: - del form.fields["caution_check"] + if "deposit_check" in form.fields: + del form.fields["deposit_check"] if "information_json" in form.fields: del form.fields["information_json"] - if "caution_type" in form.fields: - del form.fields["caution_type"] + if "deposit_type" in form.fields: + del form.fields["deposit_type"] if "soge_credit" in form.fields: form.fields["soge_credit"].help_text = _('Check if you will open a Société Générale account') @@ -670,16 +670,16 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView): # Cacher les champs pendant l'inscription initiale if "first_year" in form.fields: del form.fields["first_year"] - if "caution_check" in form.fields: - del form.fields["caution_check"] + if "deposit_check" in form.fields: + del form.fields["deposit_check"] if "information_json" in form.fields: del form.fields["information_json"] - # S'assurer que le champ caution_type est obligatoire - if "caution_type" in form.fields: - form.fields["caution_type"].required = True - form.fields["caution_type"].help_text = _("Choose how you want to pay the deposit") - form.fields["caution_type"].widget = forms.RadioSelect(choices=form.fields["caution_type"].choices) + # S'assurer que le champ deposit_type est obligatoire + if "deposit_type" in form.fields: + form.fields["deposit_type"].required = True + form.fields["deposit_type"].help_text = _("Choose how you want to pay the deposit") + form.fields["deposit_type"].widget = forms.RadioSelect(choices=form.fields["deposit_type"].choices) return form @@ -708,7 +708,7 @@ class WEIRegister2AView(ProtectQuerysetMixin, ProtectedCreateView): form.instance.information = information # Sauvegarder le type de caution - form.instance.caution_type = form.cleaned_data["caution_type"] + form.instance.deposit_type = form.cleaned_data["deposit_type"] form.instance.save() if 'treasury' in settings.INSTALLED_APPS: @@ -780,15 +780,15 @@ 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 caution_check pour tout le monde dans le formulaire de modification - if "caution_check" in form.fields: - del form.fields["caution_check"] + # 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"] - # S'assurer que le champ caution_type est obligatoire pour les 2A+ - if not self.object.first_year and "caution_type" in form.fields: - form.fields["caution_type"].required = True - form.fields["caution_type"].help_text = _("Choose how you want to pay the deposit") - form.fields["caution_type"].widget = forms.RadioSelect(choices=form.fields["caution_type"].choices) + # S'assurer que le champ deposit_type est obligatoire pour les 2A+ + if not self.object.first_year and "deposit_type" in form.fields: + form.fields["deposit_type"].required = True + form.fields["deposit_type"].help_text = _("Choose how you want to pay the deposit") + form.fields["deposit_type"].widget = forms.RadioSelect(choices=form.fields["deposit_type"].choices) return form @@ -850,8 +850,8 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update form.instance.information = information # Sauvegarder le type de caution pour les 2A+ - if "caution_type" in form.cleaned_data: - form.instance.caution_type = form.cleaned_data["caution_type"] + if "deposit_type" in form.cleaned_data: + form.instance.deposit_type = form.cleaned_data["deposit_type"] form.instance.save() return super().form_valid(form) @@ -957,8 +957,8 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): # Calculer le montant total nécessaire (frais + caution si transaction) total_needed = fee - if registration.caution_type == 'note': - total_needed += registration.wei.caution_amount + if registration.deposit_type == 'note': + total_needed += registration.wei.deposit_amount context["total_needed"] = total_needed form = context["form"] @@ -988,22 +988,22 @@ 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 caution_check uniquement pour les non-première année et le rendre obligatoire + # Ajouter le champ deposit_check uniquement pour les non-première année et le rendre obligatoire if not registration.first_year: - if registration.caution_type == 'check': - form.fields["caution_check"] = forms.BooleanField( + if registration.deposit_type == 'check': + form.fields["deposit_check"] = forms.BooleanField( required=True, - initial=registration.caution_check, - label=_("Caution check given"), + initial=registration.deposit_check, + label=_("Deposit check given"), help_text=_("Please make sure the check is given before validating the registration") ) else: - form.fields["caution_check"] = forms.BooleanField( + form.fields["deposit_check"] = forms.BooleanField( required=True, initial=False, label=_("Create deposit transaction"), help_text=_("A transaction of %(amount).2f€ will be created from the user's Note account") % { - 'amount': registration.wei.caution_amount / 100 + 'amount': registration.wei.deposit_amount / 100 } ) @@ -1039,8 +1039,8 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): club = registration.wei user = registration.user - if "caution_check" in form.data: - registration.caution_check = form.data["caution_check"] == "on" + if "deposit_check" in form.data: + registration.deposit_check = form.data["deposit_check"] == "on" registration.save() membership = form.instance membership.user = user @@ -1084,8 +1084,8 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): # Calculer le montant total nécessaire (frais + caution si transaction) total_needed = fee - if registration.caution_type == 'note': - total_needed += club.caution_amount + if registration.deposit_type == 'note': + total_needed += club.deposit_amount # Vérifier que l'utilisateur a assez d'argent pour tout payer if user.note.balance + credit_amount < total_needed: @@ -1136,14 +1136,14 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView): membership.roles.add(WEIRole.objects.get(name="Adhérent⋅e WEI")) # Créer la transaction de caution si nécessaire - if registration.caution_type == 'note': + if registration.deposit_type == 'note': from note.models import Transaction Transaction.objects.create( source=user.note, destination=club.note, quantity=1, - amount=club.caution_amount, - reason=_("Caution %(name)s") % {'name': club.name}, + amount=club.deposit_amount, + reason=_("Deposit %(name)s") % {'name': club.name}, valid=True, )