diff --git a/.gitignore b/.gitignore index 91e55e2..caa056f 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,6 @@ shell.nix ansible/host_vars/*.yaml !ansible/host_vars/bde* ansible/hosts + +apps/member/migrations +apps/wei/migrations diff --git a/apps/member/forms.py b/apps/member/forms.py index ab24ded..ffa3b4c 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -161,12 +161,6 @@ class ClubForm(forms.ModelForm): class MembershipForm(forms.ModelForm): - soge = forms.BooleanField( - label=_("Inscription paid by Société Générale"), - required=False, - help_text=_("Check this case if the Société Générale paid the inscription."), - ) - credit_type = forms.ModelChoiceField( queryset=NoteSpecial.objects, label=_("Credit type"), diff --git a/apps/member/models.py b/apps/member/models.py index 0b471f1..a2976f7 100644 --- a/apps/member/models.py +++ b/apps/member/models.py @@ -53,22 +53,13 @@ class Profile(models.Model): max_length=8, verbose_name=_("department"), choices=[ - ('A0', _("Informatics (A0)")), - ('A1', _("Mathematics (A1)")), - ('A2', _("Physics (A2)")), - ("A'2", _("Applied physics (A'2)")), - ("A''2", _("Chemistry (A''2)")), - ('A3', _("Biology (A3)")), - ('B1234', _("SAPHIRE (B1234)")), - ('B1', _("Mechanics (B1)")), - ('B2', _("Civil engineering (B2)")), - ('B3', _("Mechanical engineering (B3)")), - ('B4', _("EEA (B4)")), - ('C', _("Design (C)")), - ('D2', _("Economy-management (D2)")), - ('D3', _("Social sciences (D3)")), - ('E', _("English (E)")), - ('EXT', _("External (EXT)")), + ('INFO', _("Informatique")), + ('MATH', _("Mathématiques")), + ('DEM', _("Droit - économie - management")), + ('MECATRO', _("Mécatronique")), + ('2SEP', _("Sciences du sport et éducation physique")), + ('SE', _("Sciences pour l’Environnement")), + ('EXT', _("Externe")), ] ) @@ -98,8 +89,7 @@ class Profile(models.Model): max_length=2, choices=[ ('', _("No")), - ('fr', _("Yes (receive them in french)")), - ('en', _("Yes (receive them in english)")), + ('fr', _("Yes")), ], verbose_name=_("Register on the mailing list to stay informed of the events of the campus (1 mail/week)"), ) @@ -151,13 +141,6 @@ class Profile(models.Model): def section_generated(self): return str(self.ens_year) + self.department - @property - def soge(self): - if "treasury" in settings.INSTALLED_APPS: - from treasury.models import SogeCredit - return SogeCredit.objects.filter(user=self.user, credit_transaction__isnull=False).exists() - return False - class Meta: verbose_name = _('user profile') verbose_name_plural = _('user profile') @@ -360,8 +343,6 @@ class Membership(models.Model): ) if hasattr(self, '_force_renew_parent') and self._force_renew_parent: new_membership._force_renew_parent = True - if hasattr(self, '_soge') and self._soge: - new_membership._soge = True if hasattr(self, '_force_save') and self._force_save: new_membership._force_save = True new_membership.save() @@ -380,8 +361,6 @@ class Membership(models.Model): # Renew the previous membership of the parent club parent_membership = parent_membership.first() parent_membership._force_renew_parent = True - if hasattr(self, '_soge'): - parent_membership._soge = True if hasattr(self, '_force_save'): parent_membership._force_save = True parent_membership.renew() @@ -393,8 +372,7 @@ class Membership(models.Model): date_start=self.date_start, ) parent_membership._force_renew_parent = True - if hasattr(self, '_soge'): - parent_membership._soge = True + if hasattr(self, '_force_save'): parent_membership._force_save = True parent_membership.save() @@ -479,26 +457,7 @@ class Membership(models.Model): reason="Adhésion " + self.club.name, ) transaction._force_save = True - if hasattr(self, '_soge') and "treasury" in settings.INSTALLED_APPS\ - and (self.club.name == "BDE" or self.club.name == "Kfet" - or ("wei" in settings.INSTALLED_APPS and hasattr(self.club, "weiclub") and self.club.weiclub)): - # If the soge pays, then the transaction is unvalidated in a first time, then submitted for control - # to treasurers. - transaction.valid = False - from treasury.models import SogeCredit - if SogeCredit.objects.filter(user=self.user).exists(): - soge_credit = SogeCredit.objects.get(user=self.user) - else: - soge_credit = SogeCredit(user=self.user) - soge_credit._force_save = True - soge_credit.save(force_insert=True) - soge_credit.refresh_from_db() - transaction.save(force_insert=True) - transaction.refresh_from_db() - soge_credit.transactions.add(transaction) - soge_credit.save() - else: - transaction.save(force_insert=True) + transaction.save(force_insert=True) def __str__(self): return _("Membership of {user} for the club {club}").format(user=self.user.username, club=self.club.name, ) diff --git a/apps/member/tests/test_memberships.py b/apps/member/tests/test_memberships.py index 2dc6dd4..a46a23e 100644 --- a/apps/member/tests/test_memberships.py +++ b/apps/member/tests/test_memberships.py @@ -14,7 +14,7 @@ from django.urls import reverse from django.utils import timezone from note.models import Alias, NoteSpecial from permission.models import Role -from treasury.models import SogeCredit + from ..api.views import ClubViewSet, MembershipViewSet, ProfileViewSet from ..models import Club, Membership, Profile @@ -201,7 +201,6 @@ class TestMemberships(TestCase): response = self.client.post(reverse("member:club_add_member", args=(club.pk,)), data=dict( user=user.pk, date_start="{:%Y-%m-%d}".format(date.today()), - soge=False, credit_type=NoteSpecial.objects.get(special_type="Espèces").id, credit_amount=4200, last_name="TOTO", @@ -240,7 +239,6 @@ class TestMemberships(TestCase): response = self.client.post(reverse("member:club_renew_membership", args=(membership.pk,)), data=dict( user=user.pk, date_start="{:%Y-%m-%d}".format(date.today()), - soge=bde_parent, credit_type=NoteSpecial.objects.get(special_type="Chèque").id, credit_amount=14242, last_name="TOTO", @@ -252,35 +250,7 @@ class TestMemberships(TestCase): response = self.client.get(club.get_absolute_url()) self.assertEqual(response.status_code, 200) - def test_auto_join_kfet_when_join_bde_with_soge(self): - """ - When we join the BDE club with a Soge registration, a Kfet membership is automatically created. - We check that it is the case. - """ - user = User.objects.create(username="new1A") - user.profile.registration_valid = True - user.profile.email_confirmed = True - user.profile.save() - user.save() - - bde = Club.objects.get(name="BDE") - kfet = Club.objects.get(name="Kfet") - - response = self.client.post(reverse("member:club_add_member", args=(bde.pk,)), data=dict( - user=user.pk, - date_start="{:%Y-%m-%d}".format(date.today()), - soge=True, - credit_type=NoteSpecial.objects.get(special_type="Virement bancaire").id, - credit_amount=(bde.membership_fee_paid + kfet.membership_fee_paid) / 100, - last_name="TOTO", - first_name="Toto", - bank="Société générale", - )) - self.assertRedirects(response, user.profile.get_absolute_url(), 302, 200) - - self.assertTrue(Membership.objects.filter(user=user, club=bde).exists()) - self.assertTrue(Membership.objects.filter(user=user, club=kfet).exists()) - self.assertTrue(SogeCredit.objects.filter(user=user).exists()) + def test_change_roles(self): """ @@ -327,11 +297,11 @@ class TestMemberships(TestCase): email="updated@example.com", phone_number="+33600000000", section="", - department="A0", + department="INFO", promotion=timezone.now().year, address="Earth", paid=True, - ml_events_registration="en", + ml_events_registration="", ml_sports_registration=True, ml_art_registration=True, report_frequency=7, @@ -416,7 +386,7 @@ class TestMemberAPI(TestAPI): self.user.profile.email_confirmed = True self.user.profile.phone_number = "0600000000" self.user.profile.section = "1A0" - self.user.profile.department = "A0" + self.user.profile.department = "INFO" self.user.profile.address = "Earth" self.user.profile.save() diff --git a/apps/member/views.py b/apps/member/views.py index 2f6348a..5605330 100644 --- a/apps/member/views.py +++ b/apps/member/views.py @@ -610,16 +610,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): context["clubs_renewal"] = clubs_renewal context["additional_fee_renewal"] = additional_fee_renewal - # If the concerned club is the BDE, then we add the option that Société générale pays the membership. - if club.name != "BDE": - del form.fields['soge'] - else: - fee = 0 - bde = Club.objects.get(name="BDE") - fee += bde.membership_fee_paid - kfet = Club.objects.get(name="Kfet") - fee += kfet.membership_fee_paid - context["total_fee"] = "{:.02f}".format(fee / 100, ) + else: # This is a renewal. Fields can be pre-completed. context["renewal"] = True @@ -651,26 +642,6 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): form.fields['last_name'].initial = user.last_name form.fields['first_name'].initial = user.first_name - # If this is a renewal of a BDE membership, Société générale can pays, if it has not been already done. - if (club.name != "BDE" and club.name != "Kfet") or user.profile.soge: - del form.fields['soge'] - else: - fee = 0 - bde = Club.objects.get(name="BDE") - if not Membership.objects.filter( - club=bde, - user=user, - date_start__gte=bde.membership_start, - ).exists(): - fee += bde.membership_fee_paid if user.profile.paid else bde.membership_fee_unpaid - kfet = Club.objects.get(name="Kfet") - if not Membership.objects.filter( - club=kfet, - user=user, - date_start__gte=bde.membership_start, - ).exists(): - fee += kfet.membership_fee_paid if user.profile.paid else kfet.membership_fee_unpaid - context["total_fee"] = "{:.02f}".format(fee / 100, ) context['club'] = club @@ -686,12 +657,11 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): # Retrieve form data credit_type = form.cleaned_data["credit_type"] credit_amount = form.cleaned_data["credit_amount"] - soge = form.cleaned_data["soge"] and not user.profile.soge and (club.name == "BDE" or club.name == "Kfet") if not credit_type: credit_amount = 0 - if not soge and user.note.balance + credit_amount < fee and not Membership.objects.filter( + if user.note.balance + credit_amount < fee and not Membership.objects.filter( club__name="Kfet", user=user, date_start__lte=date.today(), @@ -762,13 +732,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): 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 Société générale pays, then we store that information but the payment must be controlled by treasurers - # later. The membership transaction will be invalidated. - if soge: - credit_type = None - form.instance._soge = True if credit_type is None: credit_amount = 0 @@ -830,36 +794,6 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): form.instance._force_save = True form.instance.save() - # If Société générale pays, then we assume that this is the BDE membership, and we auto-renew the - # Kfet membership. - if soge and club.name == "BDE": - kfet = Club.objects.get(name="Kfet") - fee = kfet.membership_fee_paid if user.profile.paid else kfet.membership_fee_unpaid - - # Get current membership, to get the end date - old_membership = Membership.objects.filter( - club=kfet, - user=user, - ).order_by("-date_start") - - if not old_membership.filter(date_start__gte=kfet.membership_start).exists(): - # If the membership is not already renewed - membership = Membership( - club=kfet, - user=user, - fee=fee, - date_start=max(old_membership.first().date_end + timedelta(days=1), kfet.membership_start) - if old_membership.exists() else form.instance.date_start, - ) - membership._force_save = True - membership._soge = True - membership.save() - membership.refresh_from_db() - if old_membership.exists(): - membership.roles.set(old_membership.get().roles.all()) - membership.roles.set(Role.objects.filter(Q(name="Adhérent Kfet") | Q(name="Membre de club")).all()) - membership.save() - return ret def get_success_url(self):