Remove Soge at signup

This commit is contained in:
jbdoderlein 2022-07-18 20:16:12 +02:00
parent 6348105dcd
commit 6379ee57de
5 changed files with 20 additions and 160 deletions

3
.gitignore vendored
View file

@ -53,3 +53,6 @@ shell.nix
ansible/host_vars/*.yaml ansible/host_vars/*.yaml
!ansible/host_vars/bde* !ansible/host_vars/bde*
ansible/hosts ansible/hosts
apps/member/migrations
apps/wei/migrations

View file

@ -161,12 +161,6 @@ class ClubForm(forms.ModelForm):
class MembershipForm(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( credit_type = forms.ModelChoiceField(
queryset=NoteSpecial.objects, queryset=NoteSpecial.objects,
label=_("Credit type"), label=_("Credit type"),

View file

@ -53,22 +53,13 @@ class Profile(models.Model):
max_length=8, max_length=8,
verbose_name=_("department"), verbose_name=_("department"),
choices=[ choices=[
('A0', _("Informatics (A0)")), ('INFO', _("Informatique")),
('A1', _("Mathematics (A1)")), ('MATH', _("Mathématiques")),
('A2', _("Physics (A2)")), ('DEM', _("Droit - économie - management")),
("A'2", _("Applied physics (A'2)")), ('MECATRO', _("Mécatronique")),
("A''2", _("Chemistry (A''2)")), ('2SEP', _("Sciences du sport et éducation physique")),
('A3', _("Biology (A3)")), ('SE', _("Sciences pour lEnvironnement")),
('B1234', _("SAPHIRE (B1234)")), ('EXT', _("Externe")),
('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)")),
] ]
) )
@ -98,8 +89,7 @@ class Profile(models.Model):
max_length=2, max_length=2,
choices=[ choices=[
('', _("No")), ('', _("No")),
('fr', _("Yes (receive them in french)")), ('fr', _("Yes")),
('en', _("Yes (receive them in english)")),
], ],
verbose_name=_("Register on the mailing list to stay informed of the events of the campus (1 mail/week)"), 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): def section_generated(self):
return str(self.ens_year) + self.department 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: class Meta:
verbose_name = _('user profile') verbose_name = _('user profile')
verbose_name_plural = _('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: if hasattr(self, '_force_renew_parent') and self._force_renew_parent:
new_membership._force_renew_parent = True 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: if hasattr(self, '_force_save') and self._force_save:
new_membership._force_save = True new_membership._force_save = True
new_membership.save() new_membership.save()
@ -380,8 +361,6 @@ class Membership(models.Model):
# Renew the previous membership of the parent club # Renew the previous membership of the parent club
parent_membership = parent_membership.first() parent_membership = parent_membership.first()
parent_membership._force_renew_parent = True parent_membership._force_renew_parent = True
if hasattr(self, '_soge'):
parent_membership._soge = True
if hasattr(self, '_force_save'): if hasattr(self, '_force_save'):
parent_membership._force_save = True parent_membership._force_save = True
parent_membership.renew() parent_membership.renew()
@ -393,8 +372,7 @@ class Membership(models.Model):
date_start=self.date_start, date_start=self.date_start,
) )
parent_membership._force_renew_parent = True parent_membership._force_renew_parent = True
if hasattr(self, '_soge'):
parent_membership._soge = True
if hasattr(self, '_force_save'): if hasattr(self, '_force_save'):
parent_membership._force_save = True parent_membership._force_save = True
parent_membership.save() parent_membership.save()
@ -479,26 +457,7 @@ class Membership(models.Model):
reason="Adhésion " + self.club.name, reason="Adhésion " + self.club.name,
) )
transaction._force_save = True transaction._force_save = True
if hasattr(self, '_soge') and "treasury" in settings.INSTALLED_APPS\ transaction.save(force_insert=True)
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)
def __str__(self): def __str__(self):
return _("Membership of {user} for the club {club}").format(user=self.user.username, club=self.club.name, ) return _("Membership of {user} for the club {club}").format(user=self.user.username, club=self.club.name, )

View file

@ -14,7 +14,7 @@ from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from note.models import Alias, NoteSpecial from note.models import Alias, NoteSpecial
from permission.models import Role from permission.models import Role
from treasury.models import SogeCredit
from ..api.views import ClubViewSet, MembershipViewSet, ProfileViewSet from ..api.views import ClubViewSet, MembershipViewSet, ProfileViewSet
from ..models import Club, Membership, Profile 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( response = self.client.post(reverse("member:club_add_member", args=(club.pk,)), data=dict(
user=user.pk, user=user.pk,
date_start="{:%Y-%m-%d}".format(date.today()), date_start="{:%Y-%m-%d}".format(date.today()),
soge=False,
credit_type=NoteSpecial.objects.get(special_type="Espèces").id, credit_type=NoteSpecial.objects.get(special_type="Espèces").id,
credit_amount=4200, credit_amount=4200,
last_name="TOTO", last_name="TOTO",
@ -240,7 +239,6 @@ class TestMemberships(TestCase):
response = self.client.post(reverse("member:club_renew_membership", args=(membership.pk,)), data=dict( response = self.client.post(reverse("member:club_renew_membership", args=(membership.pk,)), data=dict(
user=user.pk, user=user.pk,
date_start="{:%Y-%m-%d}".format(date.today()), date_start="{:%Y-%m-%d}".format(date.today()),
soge=bde_parent,
credit_type=NoteSpecial.objects.get(special_type="Chèque").id, credit_type=NoteSpecial.objects.get(special_type="Chèque").id,
credit_amount=14242, credit_amount=14242,
last_name="TOTO", last_name="TOTO",
@ -252,35 +250,7 @@ class TestMemberships(TestCase):
response = self.client.get(club.get_absolute_url()) response = self.client.get(club.get_absolute_url())
self.assertEqual(response.status_code, 200) 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): def test_change_roles(self):
""" """
@ -327,11 +297,11 @@ class TestMemberships(TestCase):
email="updated@example.com", email="updated@example.com",
phone_number="+33600000000", phone_number="+33600000000",
section="", section="",
department="A0", department="INFO",
promotion=timezone.now().year, promotion=timezone.now().year,
address="Earth", address="Earth",
paid=True, paid=True,
ml_events_registration="en", ml_events_registration="",
ml_sports_registration=True, ml_sports_registration=True,
ml_art_registration=True, ml_art_registration=True,
report_frequency=7, report_frequency=7,
@ -416,7 +386,7 @@ class TestMemberAPI(TestAPI):
self.user.profile.email_confirmed = True self.user.profile.email_confirmed = True
self.user.profile.phone_number = "0600000000" self.user.profile.phone_number = "0600000000"
self.user.profile.section = "1A0" self.user.profile.section = "1A0"
self.user.profile.department = "A0" self.user.profile.department = "INFO"
self.user.profile.address = "Earth" self.user.profile.address = "Earth"
self.user.profile.save() self.user.profile.save()

View file

@ -610,16 +610,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView):
context["clubs_renewal"] = clubs_renewal context["clubs_renewal"] = clubs_renewal
context["additional_fee_renewal"] = additional_fee_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. else: # This is a renewal. Fields can be pre-completed.
context["renewal"] = True context["renewal"] = True
@ -651,26 +642,6 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView):
form.fields['last_name'].initial = user.last_name form.fields['last_name'].initial = user.last_name
form.fields['first_name'].initial = user.first_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 context['club'] = club
@ -686,12 +657,11 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView):
# Retrieve form data # Retrieve form data
credit_type = form.cleaned_data["credit_type"] credit_type = form.cleaned_data["credit_type"]
credit_amount = form.cleaned_data["credit_amount"] 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: if not credit_type:
credit_amount = 0 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", club__name="Kfet",
user=user, user=user,
date_start__lte=date.today(), date_start__lte=date.today(),
@ -762,13 +732,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView):
last_name = form.cleaned_data["last_name"] last_name = form.cleaned_data["last_name"]
first_name = form.cleaned_data["first_name"] first_name = form.cleaned_data["first_name"]
bank = form.cleaned_data["bank"] 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: if credit_type is None:
credit_amount = 0 credit_amount = 0
@ -830,36 +794,6 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView):
form.instance._force_save = True form.instance._force_save = True
form.instance.save() 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 return ret
def get_success_url(self): def get_success_url(self):