From d785155abedb7e0a86ab0151bf4fad8ee1656f76 Mon Sep 17 00:00:00 2001
From: korenstin <korenstin@crans.org>
Date: Mon, 15 Jul 2024 14:27:55 +0200
Subject: [PATCH] Fix #126 (join_bda)

---
 apps/member/forms.py                          |  2 +-
 .../0012_club_add_registration_form.py        | 18 ++++++
 apps/member/models.py                         |  5 ++
 apps/registration/forms.py                    | 10 ----
 apps/registration/views.py                    | 60 +++++++++++--------
 locale/fr/LC_MESSAGES/django.po               | 46 +++++++-------
 6 files changed, 84 insertions(+), 57 deletions(-)
 create mode 100644 apps/member/migrations/0012_club_add_registration_form.py

diff --git a/apps/member/forms.py b/apps/member/forms.py
index 3d892705..211bc06a 100644
--- a/apps/member/forms.py
+++ b/apps/member/forms.py
@@ -151,7 +151,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/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..0273c011 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=_(f"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 c6ca48b0..5792898e 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
@@ -507,11 +507,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,7 +563,7 @@ msgid "This image cannot be loaded."
 msgstr "Cette image ne peut pas être chargée."
 
 #: apps/member/forms.py:148 apps/member/views.py:102
-#: apps/registration/forms.py:34 apps/registration/views.py:266
+#: 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à."
 
@@ -852,46 +852,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"
 
@@ -2183,18 +2187,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"
 
@@ -3620,9 +3629,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"
-- 
GitLab