diff --git a/apps/member/views.py b/apps/member/views.py index 57e4b1e0..de44bfe7 100644 --- a/apps/member/views.py +++ b/apps/member/views.py @@ -625,9 +625,6 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): # Retrieve form data credit_type = form.cleaned_data["credit_type"] credit_amount = form.cleaned_data["credit_amount"] - last_name = form.cleaned_data["last_name"] - first_name = form.cleaned_data["first_name"] - bank = form.cleaned_data["bank"] soge = form.cleaned_data["soge"] and not user.profile.soge and (club.name == "BDE" or club.name == "Kfet") if not credit_type: @@ -675,16 +672,8 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): error = True if credit_amount: - if not last_name or not first_name or (not bank and credit_type.special_type == "Chèque"): - if not last_name: - form.add_error('last_name', _("This field is required.")) - error = True - if not first_name: - form.add_error('first_name', _("This field is required.")) - error = True - if not bank and credit_type.special_type == "Chèque": - form.add_error('bank', _("This field is required.")) - error = True + # Check that special information for payment are filled + error = SpecialTransaction.validate_payment_form(form) or error return not error diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py index ac236ffe..3db82e07 100644 --- a/apps/note/models/transactions.py +++ b/apps/note/models/transactions.py @@ -333,6 +333,36 @@ class SpecialTransaction(Transaction): self.clean() super().save(*args, **kwargs) + @staticmethod + def validate_payment_form(form): + """ + Ensure that last name and first name are filled for a form that creates a SpecialTransaction, + and check that if the user pays with a check, then the bank field is filled. + + Return True iff there is no error. + Whenever there is an error, they are inserted in the form errors. + """ + + credit_type = form.cleaned_data["credit_type"] + last_name = form.cleaned_data["last_name"] + first_name = form.cleaned_data["first_name"] + bank = form.cleaned_data["bank"] + + error = True + + if not last_name or not first_name or (not bank and credit_type.special_type == "Chèque"): + if not last_name: + form.add_error('last_name', _("This field is required.")) + error = True + if not first_name: + form.add_error('first_name', _("This field is required.")) + error = True + if not bank and credit_type.special_type == "Chèque": + form.add_error('bank', _("This field is required.")) + error = True + + return not error + class Meta: verbose_name = _("Special transaction") verbose_name_plural = _("Special transactions") diff --git a/apps/registration/views.py b/apps/registration/views.py index c0c32d15..d8238975 100644 --- a/apps/registration/views.py +++ b/apps/registration/views.py @@ -248,9 +248,13 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, @transaction.atomic def form_valid(self, form): + """ + Finally validate the registration, with creating the membership. + """ user = self.get_object() if Alias.objects.filter(normalized_name=Alias.normalize(user.username)).exists(): + # Don't try to hack an existing account. form.add_error(None, _("An alias with a similar name already exists.")) return self.form_invalid(form) @@ -265,14 +269,16 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, join_kfet = form.cleaned_data["join_kfet"] if soge: - # If Société Générale pays the inscription, the user joins the two clubs + # If Société Générale pays the inscription, the user automatically joins the two clubs. join_bde = True join_kfet = True if not join_bde: + # This software belongs to the BDE. form.add_error('join_bde', _("You must join the BDE.")) return super().form_invalid(form) + # Calculate required registration fee fee = 0 bde = Club.objects.get(name="BDE") bde_fee = bde.membership_fee_paid if user.profile.paid else bde.membership_fee_unpaid @@ -298,15 +304,9 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, .format(pretty_money(fee))) return self.form_invalid(form) - if credit_type is not None and credit_amount > 0: - if not last_name or not first_name or (not bank and credit_type.special_type == "Chèque"): - if not last_name: - form.add_error('last_name', _("This field is required.")) - if not first_name: - form.add_error('first_name', _("This field is required.")) - if not bank and credit_type.special_type == "Chèque": - form.add_error('bank', _("This field is required.")) - return self.form_invalid(form) + # Check that payment information are filled, like last name and first name + if credit_type is not None and credit_amount > 0 and SpecialTransaction.validate_payment_form(form): + return self.form_invalid(form) # Save the user and finally validate the registration # Saving the user creates the associated note