diff --git a/apps/member/forms.py b/apps/member/forms.py index 4dd62c88..33a29ebd 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -154,7 +154,7 @@ class ClubForm(forms.ModelForm): class Meta: model = Club - fields = '__all__' + exclude = ("add_registration_form",) widgets = { "membership_fee_paid": AmountInput(), "membership_fee_unpaid": AmountInput(), diff --git a/apps/member/migrations/0012_club_add_registration_form.py b/apps/member/migrations/0012_club_add_registration_form.py new file mode 100644 index 00000000..aad75f81 --- /dev/null +++ b/apps/member/migrations/0012_club_add_registration_form.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2024-07-15 09:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('member', '0011_profile_vss_charter_read'), + ] + + operations = [ + migrations.AddField( + model_name='club', + name='add_registration_form', + field=models.BooleanField(default=False, verbose_name='add to registration form'), + ), + ] diff --git a/apps/member/models.py b/apps/member/models.py index a18b18f0..4f78ecd3 100644 --- a/apps/member/models.py +++ b/apps/member/models.py @@ -259,6 +259,11 @@ class Club(models.Model): help_text=_('Maximal date of a membership, after which members must renew it.'), ) + add_registration_form = models.BooleanField( + verbose_name=_("add to registration form"), + default=False, + ) + class Meta: verbose_name = _("club") verbose_name_plural = _("clubs") diff --git a/apps/note/templates/note/mails/negative_balance.html b/apps/note/templates/note/mails/negative_balance.html index 8c869a54..70af1f0f 100644 --- a/apps/note/templates/note/mails/negative_balance.html +++ b/apps/note/templates/note/mails/negative_balance.html @@ -23,7 +23,7 @@

Par ailleurs, le BDE ne sert pas d'alcool aux adhérents dont le solde - est inférieur à 0 € depuis plus de 24h. + est inférieur à 0 €.

@@ -43,4 +43,4 @@ {% trans "Mail generated by the Note Kfet on the" %} {% now "j F Y à H:i:s" %}

- \ No newline at end of file + diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index 92e7098b..b59fdb61 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -2591,12 +2591,12 @@ "note", "transaction" ], - "query": "[\"OR\", {\"source__balance__gte\": {\"F\": [\"SUB\", [\"MUL\", [\"F\", \"amount\"], [\"F\", \"quantity\"]], 2000]}}, {\"valid\": false}]", + "query": "[\"OR\", {\"source__balance__gte\": 0}, [\"AND\", [\"NOT\", {\"recurrenttransaction__template__category__name\": \"Alcool\"}], {\"source__balance__gte\": {\"F\": [\"SUB\", [\"MUL\", [\"F\", \"amount\"], [\"F\", \"quantity\"]], 2000]}}], {\"valid\": false}]", "type": "add", "mask": 2, "field": "", "permanent": false, - "description": "Créer une transaction quelconque tant que la source reste au-dessus de -20 €" + "description": "Créer une transaction quelconque tant que la source reste positive s'il s'agit d'alcool, sinon au-dessus de -20€" } }, { diff --git a/apps/registration/forms.py b/apps/registration/forms.py index f6c980c9..89dc5de4 100644 --- a/apps/registration/forms.py +++ b/apps/registration/forms.py @@ -5,7 +5,6 @@ from django import forms from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User from django.utils.translation import gettext_lazy as _ -# from member.models import Club from note.models import NoteSpecial, Alias from note_kfet.inputs import AmountInput @@ -115,12 +114,3 @@ class ValidationForm(forms.Form): required=False, initial=True, ) - -# If the bda exists -# if Club.objects.filter(name__iexact="bda").exists(): -# The user can join the bda club at the inscription -# join_bda = forms.BooleanField( -# label=_("Join BDA Club"), -# required=False, -# initial=True, -# ) diff --git a/apps/registration/views.py b/apps/registration/views.py index 02d6f05e..3dd820d7 100644 --- a/apps/registration/views.py +++ b/apps/registration/views.py @@ -1,6 +1,7 @@ # Copyright (C) 2018-2024 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later +from django import forms from django.conf import settings from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.models import User @@ -238,9 +239,8 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, fee += bde.membership_fee_paid if user.profile.paid else bde.membership_fee_unpaid kfet = Club.objects.get(name="Kfet") fee += kfet.membership_fee_paid if user.profile.paid else kfet.membership_fee_unpaid - if Club.objects.filter(name__iexact="BDA").exists(): - bda = Club.objects.get(name__iexact="BDA") - fee += bda.membership_fee_paid if user.profile.paid else bda.membership_fee_unpaid + for club in Club.objects.filter(add_registration_form=True): + fee += club.membership_fee_paid if user.profile.paid else club.membership_fee_unpaid ctx["total_fee"] = "{:.02f}".format(fee / 100, ) # ctx["declare_soge_account"] = SogeCredit.objects.filter(user=user).exists() @@ -249,6 +249,16 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, def get_form(self, form_class=None): form = super().get_form(form_class) + + # add clubs that are in registration form + for club in Club.objects.filter(add_registration_form=True).order_by("name"): + form_join_club = forms.BooleanField( + label=_("Join %(club)s Club") % {'club': club.name}, + required=False, + initial=False, + ) + form.fields.update({f"join_{club.id}": form_join_club}) + user = self.get_object() form.fields["last_name"].initial = user.last_name form.fields["first_name"].initial = user.first_name @@ -266,11 +276,6 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, form.add_error(None, _("An alias with a similar name already exists.")) return self.form_invalid(form) - # Check if BDA exist to propose membership at regisration - bda_exists = False - if Club.objects.filter(name__iexact="BDA").exists(): - bda_exists = True - # Get form data # soge = form.cleaned_data["soge"] credit_type = form.cleaned_data["credit_type"] @@ -280,8 +285,9 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, bank = form.cleaned_data["bank"] join_bde = form.cleaned_data["join_bde"] join_kfet = form.cleaned_data["join_kfet"] - if bda_exists: - join_bda = form.cleaned_data["join_bda"] + + clubs_registration = Club.objects.filter(add_registration_form=True).order_by("name") + join_clubs = [(club, form.cleaned_data[f"join_{club.id}"]) for club in clubs_registration] # if soge: # # If Société Générale pays the inscription, the user automatically joins the two clubs. @@ -303,11 +309,12 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, kfet_fee = kfet.membership_fee_paid if user.profile.paid else kfet.membership_fee_unpaid # Add extra fee for the full membership fee += kfet_fee if join_kfet else 0 - if bda_exists: - bda = Club.objects.get(name__iexact="BDA") - bda_fee = bda.membership_fee_paid if user.profile.paid else bda.membership_fee_unpaid - # Add extra fee for the bda membership - fee += bda_fee if join_bda else 0 + clubs_fee = dict() + for club, join_club in join_clubs: + club_fee = club.membership_fee_paid if user.profile.paid else club.membership_fee_unpaid + # Add extra fee for the club membership + clubs_fee[club] = club_fee + fee += club_fee if join_club else 0 # # If the bank pays, then we don't credit now. Treasurers will validate the transaction # # and credit the note later. @@ -387,17 +394,18 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, membership.roles.add(Role.objects.get(name="Adhérent Kfet")) membership.save() - if bda_exists and join_bda: - # Create membership for the user to the BDA starting today - membership = Membership( - club=bda, - user=user, - fee=bda_fee, - ) - membership.save() - membership.refresh_from_db() - membership.roles.add(Role.objects.get(name="Membre de club")) - membership.save() + for club, join_club in join_clubs: + if join_club: + # Create membership for the user to the BDA starting today + membership = Membership( + club=club, + user=user, + fee=clubs_fee[club], + ) + membership.save() + membership.refresh_from_db() + membership.roles.add(Role.objects.get(name="Membre de club")) + membership.save() # if soge: # soge_credit = SogeCredit.objects.get(user=user) diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index f46b9aab..cf686e89 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -114,7 +114,7 @@ msgstr "Lieu où l'activité est organisée, par exemple la Kfet." msgid "type" msgstr "type" -#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:313 +#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:318 #: apps/note/models/notes.py:148 apps/treasury/models.py:293 #: apps/wei/models.py:171 apps/wei/templates/wei/attribute_bus_1A.html:13 #: apps/wei/templates/wei/survey.html:15 @@ -508,11 +508,11 @@ msgstr "cotisation pour adhérer (normalien·ne élève)" msgid "membership fee (unpaid students)" msgstr "cotisation pour adhérer (normalien·ne étudiant·e)" -#: apps/member/admin.py:65 apps/member/models.py:325 +#: apps/member/admin.py:65 apps/member/models.py:330 msgid "roles" msgstr "rôles" -#: apps/member/admin.py:66 apps/member/models.py:339 +#: apps/member/admin.py:66 apps/member/models.py:344 msgid "fee" msgstr "cotisation" @@ -563,8 +563,8 @@ msgstr "Taille maximale : 2 Mo" msgid "This image cannot be loaded." msgstr "Cette image ne peut pas être chargée." -#: apps/member/forms.py:151 apps/member/views.py:102 -#: apps/registration/forms.py:34 apps/registration/views.py:266 +#: apps/member/forms.py:148 apps/member/views.py:102 +#: apps/registration/forms.py:34 apps/registration/views.py:276 msgid "An alias with a similar name already exists." msgstr "Un alias avec un nom similaire existe déjà." @@ -853,46 +853,50 @@ msgstr "" "Date maximale d'une fin d'adhésion, après laquelle les adhérent·e·s doivent la " "renouveler." -#: apps/member/models.py:263 apps/member/models.py:319 +#: apps/member/models.py:263 +msgid "add to registration form" +msgstr "ajouter au formulaire d'inscription" + +#: apps/member/models.py:268 apps/member/models.py:324 #: apps/note/models/notes.py:176 msgid "club" msgstr "club" -#: apps/member/models.py:264 +#: apps/member/models.py:269 msgid "clubs" msgstr "clubs" -#: apps/member/models.py:330 +#: apps/member/models.py:335 msgid "membership starts on" msgstr "l'adhésion commence le" -#: apps/member/models.py:334 +#: apps/member/models.py:339 msgid "membership ends on" msgstr "l'adhésion finit le" -#: apps/member/models.py:343 apps/note/models/transactions.py:385 +#: apps/member/models.py:348 apps/note/models/transactions.py:385 msgid "membership" msgstr "adhésion" -#: apps/member/models.py:344 +#: apps/member/models.py:349 msgid "memberships" msgstr "adhésions" -#: apps/member/models.py:348 +#: apps/member/models.py:353 #, python-brace-format msgid "Membership of {user} for the club {club}" msgstr "Adhésion de {user} pour le club {club}" -#: apps/member/models.py:367 +#: apps/member/models.py:372 #, python-brace-format msgid "The role {role} does not apply to the club {club}." msgstr "Le rôle {role} ne s'applique pas au club {club}." -#: apps/member/models.py:376 apps/member/views.py:712 +#: apps/member/models.py:381 apps/member/views.py:712 msgid "User is already a member of the club" msgstr "L'utilisateur·ice est déjà membre du club" -#: apps/member/models.py:388 apps/member/views.py:721 +#: apps/member/models.py:393 apps/member/views.py:721 msgid "User is not a member of the parent club" msgstr "L'utilisateur·ice n'est pas membre du club parent" @@ -2184,18 +2188,23 @@ msgstr "Utilisateur·ice·s en attente d'inscription" msgid "Registration detail" msgstr "Détails de l'inscription" -#: apps/registration/views.py:293 +#: apps/registration/views.py:256 +#, python-format +msgid "Join %(club)s Club" +msgstr "Adhérer au club %(club)s" + +#: apps/registration/views.py:299 msgid "You must join the BDE." msgstr "Vous devez adhérer au BDE." -#: apps/registration/views.py:323 +#: apps/registration/views.py:330 msgid "" "The entered amount is not enough for the memberships, should be at least {}" msgstr "" "Le montant crédité est trop faible pour adhérer, il doit être au minimum de " "{}" -#: apps/registration/views.py:417 +#: apps/registration/views.py:425 msgid "Invalidate pre-registration" msgstr "Invalider l'inscription" @@ -3621,9 +3630,6 @@ msgstr "" "d'adhésion. Vous devez également valider votre adresse email en suivant le " "lien que vous avez reçu." -#~ msgid "Join BDA Club" -#~ msgstr "Adhérer au club BDA" - #, fuzzy #~| msgid "People having you as a friend" #~ msgid "You already have that person as a friend"