diff --git a/apps/activity/forms.py b/apps/activity/forms.py index 1ca98ce..a37a2bf 100644 --- a/apps/activity/forms.py +++ b/apps/activity/forms.py @@ -20,9 +20,9 @@ from .models import Activity, Guest class ActivityForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - # By default, the Kfet club is attended - self.fields["attendees_club"].initial = Club.objects.get(name="Kfet") - self.fields["attendees_club"].widget.attrs["placeholder"] = "Kfet" + # By default, the BDE club is attended + self.fields["attendees_club"].initial = Club.objects.get(name="BDE") + self.fields["attendees_club"].widget.attrs["placeholder"] = "BDE" clubs = list(Club.objects.filter(PermissionBackend .filter_queryset(get_current_request(), Club, "view")).all()) shuffle(clubs) diff --git a/apps/activity/migrations/0001_initial.py b/apps/activity/migrations/0001_initial.py index ba2d68d..ab4e9bc 100644 --- a/apps/activity/migrations/0001_initial.py +++ b/apps/activity/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.16 on 2020-09-04 21:41 +# Generated by Django 2.2.28 on 2022-08-17 20:53 from django.db import migrations, models import django.utils.timezone diff --git a/apps/activity/migrations/0002_auto_20200904_2341.py b/apps/activity/migrations/0002_auto_20220817_2253.py similarity index 98% rename from apps/activity/migrations/0002_auto_20200904_2341.py rename to apps/activity/migrations/0002_auto_20220817_2253.py index 4afa74d..fa1be59 100644 --- a/apps/activity/migrations/0002_auto_20200904_2341.py +++ b/apps/activity/migrations/0002_auto_20220817_2253.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.16 on 2020-09-04 21:41 +# Generated by Django 2.2.28 on 2022-08-17 20:53 from django.conf import settings from django.db import migrations, models @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('activity', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('member', '0001_initial'), + ('activity', '0001_initial'), ('note', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ diff --git a/apps/activity/models.py b/apps/activity/models.py index f8e5fab..b9541cb 100644 --- a/apps/activity/models.py +++ b/apps/activity/models.py @@ -73,7 +73,7 @@ class Activity(models.Model): max_length=255, blank=True, default="", - help_text=_("Place where the activity is organized, eg. Kfet."), + help_text=_("Place where the activity is organized, eg. BDE."), ) activity_type = models.ForeignKey( @@ -102,7 +102,7 @@ class Activity(models.Model): on_delete=models.PROTECT, related_name='+', verbose_name=_('attendees club'), - help_text=_("Club that is authorized to join the activity. Mostly the Kfet club."), + help_text=_("Club that is authorized to join the activity."), ) date_start = models.DateTimeField( diff --git a/apps/activity/templates/activity/activity_entry.html b/apps/activity/templates/activity/activity_entry.html index 0286bdb..b78dabf 100644 --- a/apps/activity/templates/activity/activity_entry.html +++ b/apps/activity/templates/activity/activity_entry.html @@ -150,8 +150,7 @@ SPDX-License-Identifier: GPL-3.0-or-later "source": credit_id, "destination": target.attr('data-inviter'), "last_name": last_name, - "first_name": first_name, - "bank": "" + "first_name": first_name }).done(function () { makeTransaction(); reset(); diff --git a/apps/activity/tests/test_activities.py b/apps/activity/tests/test_activities.py index 456cd55..cbcd1cb 100644 --- a/apps/activity/tests/test_activities.py +++ b/apps/activity/tests/test_activities.py @@ -38,8 +38,8 @@ class TestActivities(TestCase): location="Earth", activity_type=ActivityType.objects.get(name="Activit\u00e9 gratuite ouverte"), creater=self.user, - organizer=Club.objects.get(name="Kfet"), - attendees_club=Club.objects.get(name="Kfet"), + organizer=Club.objects.get(name="BDE"), + attendees_club=Club.objects.get(name="BDE"), date_start=timezone.now(), date_end=timezone.now() + timedelta(days=2), valid=True, @@ -72,8 +72,8 @@ class TestActivities(TestCase): location="Earth", activity_type=ActivityType.objects.get(name="Soir\u00e9e").id, creater=self.user.id, - organizer=Club.objects.get(name="Kfet").id, - attendees_club=Club.objects.get(name="Kfet").id, + organizer=Club.objects.get(name="BDE").id, + attendees_club=Club.objects.get(name="BDE").id, date_start="{:%Y-%m-%d %H:%M}".format(timezone.now()), date_end="{:%Y-%m-%d %H:%M}".format(timezone.now() + timedelta(days=2)), valid=True, @@ -102,8 +102,8 @@ class TestActivities(TestCase): location="Earth", activity_type=ActivityType.objects.get(name="Soir\u00e9e").id, creater=self.user.id, - organizer=Club.objects.get(name="Kfet").id, - attendees_club=Club.objects.get(name="Kfet").id, + organizer=Club.objects.get(name="BDE").id, + attendees_club=Club.objects.get(name="BDE").id, date_start="{:%Y-%m-%d %H:%M}".format(timezone.now()), date_end="{:%Y-%m-%d %H:%M}".format(timezone.now() + timedelta(days=2)), valid=True, @@ -188,8 +188,8 @@ class TestActivityAPI(TestAPI): location="Earth", activity_type=ActivityType.objects.get(name="Activit\u00e9 gratuite ouverte"), creater=self.user, - organizer=Club.objects.get(name="Kfet"), - attendees_club=Club.objects.get(name="Kfet"), + organizer=Club.objects.get(name="BDE"), + attendees_club=Club.objects.get(name="BDE"), date_start=timezone.now(), date_end=timezone.now() + timedelta(days=2), valid=True, diff --git a/apps/activity/views.py b/apps/activity/views.py index 1f966c6..214e230 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -340,7 +340,7 @@ UID:{md5((activity.name + "$" + str(activity.id) + str(activity.date_start)).enc SUMMARY;CHARSET=UTF-8:{self.multilines(activity.name, 75, 22)} DTSTART;TZID=Europe/Berlin:{"{:%Y%m%dT%H%M%S}".format(activity.date_start)} DTEND;TZID=Europe/Berlin:{"{:%Y%m%dT%H%M%S}".format(activity.date_end)} -LOCATION:{self.multilines(activity.location, 75, 9) if activity.location else "Kfet"} +LOCATION:{self.multilines(activity.location, 75, 9) if activity.location else "BDA"} DESCRIPTION;CHARSET=UTF-8:""" + self.multilines(activity.description.replace("\n", "\\n"), 75, 26) + """ -- {activity.organizer.name} END:VEVENT diff --git a/apps/member/forms.py b/apps/member/forms.py index 991aa32..014395e 100644 --- a/apps/member/forms.py +++ b/apps/member/forms.py @@ -186,11 +186,6 @@ class MembershipForm(forms.ModelForm): required=False, ) - bank = forms.CharField( - label=_("Bank"), - required=False, - ) - class Meta: model = Membership fields = ('user', 'date_start') diff --git a/apps/member/migrations/0001_initial.py b/apps/member/migrations/0001_initial.py index be35756..2a7c29c 100644 --- a/apps/member/migrations/0001_initial.py +++ b/apps/member/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.16 on 2020-09-04 21:41 +# Generated by Django 2.2.28 on 2022-08-17 20:53 import datetime from django.conf import settings @@ -40,12 +40,12 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=50, null=True, region=None, verbose_name='phone number')), - ('section', models.CharField(blank=True, help_text='e.g. "1A0", "9A♥", "SAPHIRE"', max_length=255, null=True, verbose_name='section')), - ('department', models.CharField(choices=[('A0', 'Informatics (A0)'), ('A1', 'Mathematics (A1)'), ('A2', 'Physics (A2)'), ("A'2", "Applied physics (A'2)"), ('A2', "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)')], max_length=8, verbose_name='department')), - ('promotion', models.PositiveSmallIntegerField(default=2020, help_text='Year of entry to the school (None if not ENS student)', null=True, verbose_name='promotion')), - ('address', models.CharField(blank=True, max_length=255, null=True, verbose_name='address')), + ('section', models.CharField(blank=True, default='', help_text='e.g. "1A0", "9A♥", "SAPHIRE"', max_length=255, verbose_name='section')), + ('department', models.CharField(choices=[('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')], max_length=8, verbose_name='department')), + ('promotion', models.PositiveSmallIntegerField(default=2022, help_text='Year of entry to the school (None if not ENS student)', null=True, verbose_name='promotion')), + ('address', models.CharField(blank=True, default='', max_length=255, verbose_name='address')), ('paid', models.BooleanField(default=False, help_text='Tells if the user receive a salary.', verbose_name='paid')), - ('ml_events_registration', models.CharField(blank=True, choices=[(None, 'No'), ('fr', 'Yes (receive them in french)'), ('en', 'Yes (receive them in english)')], default=None, max_length=2, null=True, verbose_name='Register on the mailing list to stay informed of the events of the campus (1 mail/week)')), + ('ml_events_registration', models.CharField(blank=True, choices=[('', 'No'), ('fr', 'Yes')], default='', max_length=2, verbose_name='Register on the mailing list to stay informed of the events of the campus (1 mail/week)')), ('ml_sport_registration', models.BooleanField(default=False, verbose_name='Register on the mailing list to stay informed of the sport events of the campus (1 mail/week)')), ('ml_art_registration', models.BooleanField(default=False, verbose_name='Register on the mailing list to stay informed of the art events of the campus (1 mail/week)')), ('report_frequency', models.PositiveSmallIntegerField(default=0, verbose_name='report frequency (in days)')), diff --git a/apps/member/migrations/0002_auto_20200904_2341.py b/apps/member/migrations/0002_auto_20200904_2341.py deleted file mode 100644 index 3dd9d04..0000000 --- a/apps/member/migrations/0002_auto_20200904_2341.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 2.2.16 on 2020-09-04 21:41 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('permission', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('member', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='membership', - name='roles', - field=models.ManyToManyField(to='permission.Role', verbose_name='roles'), - ), - migrations.AddField( - model_name='membership', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='memberships', to=settings.AUTH_USER_MODEL, verbose_name='user'), - ), - migrations.AddField( - model_name='club', - name='parent_club', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='member.Club', verbose_name='parent club'), - ), - migrations.AddIndex( - model_name='profile', - index=models.Index(fields=['user'], name='member_prof_user_id_30c316_idx'), - ), - migrations.AddIndex( - model_name='membership', - index=models.Index(fields=['user'], name='member_memb_user_id_945dbc_idx'), - ), - ] diff --git a/apps/member/migrations/0003_create_bde_and_kfet.py b/apps/member/migrations/0003_create_bde_and_kfet.py deleted file mode 100644 index 2dbcd9d..0000000 --- a/apps/member/migrations/0003_create_bde_and_kfet.py +++ /dev/null @@ -1,71 +0,0 @@ -from django.db import migrations - - -def create_bde_and_kfet(apps, schema_editor): - """ - The clubs BDE and Kfet are pre-injected. - """ - Club = apps.get_model("member", "club") - NoteClub = apps.get_model("note", "noteclub") - Alias = apps.get_model("note", "alias") - ContentType = apps.get_model('contenttypes', 'ContentType') - polymorphic_ctype_id = ContentType.objects.get_for_model(NoteClub).id - - Club.objects.get_or_create( - id=1, - name="BDE", - email="tresorerie.bde@example.com", - require_memberships=True, - membership_fee_paid=500, - membership_fee_unpaid=500, - membership_duration=396, - membership_start="2021-08-01", - membership_end="2022-09-30", - ) - Club.objects.get_or_create( - id=2, - name="Kfet", - parent_club_id=1, - email="tresorerie.bde@example.com", - require_memberships=True, - membership_fee_paid=3500, - membership_fee_unpaid=3500, - membership_duration=396, - membership_start="2021-08-01", - membership_end="2022-09-30", - ) - - NoteClub.objects.get_or_create( - id=5, - club_id=1, - polymorphic_ctype_id=polymorphic_ctype_id, - ) - NoteClub.objects.get_or_create( - id=6, - club_id=2, - polymorphic_ctype_id=polymorphic_ctype_id, - ) - - Alias.objects.get_or_create( - id=5, - note_id=5, - name="BDE", - normalized_name="bde", - ) - Alias.objects.get_or_create( - id=6, - note_id=6, - name="Kfet", - normalized_name="kfet", - ) - - -class Migration(migrations.Migration): - dependencies = [ - ('member', '0002_auto_20200904_2341'), - ('note', '0002_create_special_notes'), - ] - - operations = [ - migrations.RunPython(create_bde_and_kfet), - ] diff --git a/apps/member/migrations/0004_replace_null_by_blank.py b/apps/member/migrations/0004_replace_null_by_blank.py deleted file mode 100644 index a53e380..0000000 --- a/apps/member/migrations/0004_replace_null_by_blank.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('member', '0003_create_bde_and_kfet'), - ] - - operations = [ - migrations.RunSQL( - "UPDATE member_profile SET address = '' WHERE address IS NULL;", - ), - migrations.RunSQL( - "UPDATE member_profile SET ml_events_registration = '' WHERE ml_events_registration IS NULL;", - ), - migrations.RunSQL( - "UPDATE member_profile SET section = '' WHERE section IS NULL;", - ), - ] diff --git a/apps/member/migrations/0005_remove_null_tag_on_charfields.py b/apps/member/migrations/0005_remove_null_tag_on_charfields.py deleted file mode 100644 index 11b9f37..0000000 --- a/apps/member/migrations/0005_remove_null_tag_on_charfields.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 2.2.16 on 2020-09-06 19:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('member', '0004_replace_null_by_blank'), - ] - - operations = [ - migrations.AlterField( - model_name='profile', - name='address', - field=models.CharField(blank=True, default='', max_length=255, verbose_name='address'), - ), - migrations.AlterField( - model_name='profile', - name='ml_events_registration', - field=models.CharField(blank=True, choices=[('', 'No'), ('fr', 'Yes (receive them in french)'), ('en', 'Yes (receive them in english)')], default='', max_length=2, verbose_name='Register on the mailing list to stay informed of the events of the campus (1 mail/week)'), - ), - migrations.AlterField( - model_name='profile', - name='section', - field=models.CharField(blank=True, default='', help_text='e.g. "1A0", "9A♥", "SAPHIRE"', max_length=255, verbose_name='section'), - ), - ] diff --git a/apps/member/migrations/0006_create_note_account_bde_membership.py b/apps/member/migrations/0006_create_note_account_bde_membership.py deleted file mode 100644 index 4a18301..0000000 --- a/apps/member/migrations/0006_create_note_account_bde_membership.py +++ /dev/null @@ -1,50 +0,0 @@ -import sys - -from django.db import migrations - - -def give_note_account_permissions(apps, schema_editor): - """ - Automatically manage the membership of the Note account. - """ - User = apps.get_model("auth", "user") - Membership = apps.get_model("member", "membership") - Role = apps.get_model("permission", "role") - - note = User.objects.filter(username="note") - if not note.exists(): - # We are in a test environment, don't log error message - if len(sys.argv) > 1 and sys.argv[1] == 'test': - return - print("Warning: Note account was not found. The note account was not imported.") - print("Make sure you have imported the NK15 database. The new import script handles correctly the permissions.") - print("This migration will be ignored, you can re-run it if you forgot the note account or ignore it if you " - "don't want this account.") - return - - note = note.get() - - # Set for the two clubs a large expiration date and the correct role. - for m in Membership.objects.filter(user_id=note.id).all(): - m.date_end = "3142-12-12" - m.roles.set(Role.objects.filter(name="PC Kfet").all()) - m.save() - # By default, the note account is only authorized to be logged from localhost. - note.password = "ipbased$127.0.0.1" - note.is_active = True - note.save() - # Ensure that the note of the account is disabled - note.note.inactivity_reason = 'forced' - note.note.is_active = False - note.save() - - -class Migration(migrations.Migration): - dependencies = [ - ('member', '0005_remove_null_tag_on_charfields'), - ('permission', '0001_initial'), - ] - - operations = [ - migrations.RunPython(give_note_account_permissions), - ] diff --git a/apps/member/migrations/0007_auto_20210313_1235.py b/apps/member/migrations/0007_auto_20210313_1235.py deleted file mode 100644 index 01ad239..0000000 --- a/apps/member/migrations/0007_auto_20210313_1235.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.2.19 on 2021-03-13 11:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('member', '0006_create_note_account_bde_membership'), - ] - - operations = [ - migrations.AlterField( - model_name='membership', - name='roles', - field=models.ManyToManyField(related_name='memberships', to='permission.Role', verbose_name='roles'), - ), - migrations.AlterField( - model_name='profile', - name='promotion', - field=models.PositiveSmallIntegerField(default=2021, help_text='Year of entry to the school (None if not ENS student)', null=True, verbose_name='promotion'), - ), - ] diff --git a/apps/member/migrations/0008_auto_20211005_1544.py b/apps/member/migrations/0008_auto_20211005_1544.py deleted file mode 100644 index a057299..0000000 --- a/apps/member/migrations/0008_auto_20211005_1544.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.2.24 on 2021-10-05 13:44 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('member', '0007_auto_20210313_1235'), - ] - - operations = [ - migrations.AlterField( - model_name='profile', - name='department', - field=models.CharField(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)')], max_length=8, verbose_name='department'), - ), - ] diff --git a/apps/member/models.py b/apps/member/models.py index a2976f7..640e48d 100644 --- a/apps/member/models.py +++ b/apps/member/models.py @@ -381,9 +381,12 @@ class Membership(models.Model): if self.club.parent_club.name == "BDE": parent_membership.roles.set( Role.objects.filter(Q(name="Adhérent BDE") | Q(name="Membre de club")).all()) - elif self.club.parent_club.name == "Kfet": + elif self.club.parent_club.name == "BDA": parent_membership.roles.set( - Role.objects.filter(Q(name="Adhérent Kfet") | Q(name="Membre de club")).all()) + Role.objects.filter(Q(name="Adhérent BDA") | Q(name="Membre de club")).all()) + elif self.club.parent_club.name == "BDS": + parent_membership.roles.set( + Role.objects.filter(Q(name="Adhérent BDS") | Q(name="Membre de club")).all()) else: parent_membership.roles.set(Role.objects.filter(name="Membre de club").all()) parent_membership.save() diff --git a/apps/member/templates/member/add_members.html b/apps/member/templates/member/add_members.html index 07b4931..3adb925 100644 --- a/apps/member/templates/member/add_members.html +++ b/apps/member/templates/member/add_members.html @@ -13,29 +13,15 @@ SPDX-License-Identifier: GPL-3.0-or-later {% if additional_fee_renewal %}
{% if renewal %} - {% if club.name == "Kfet" %} {# Auto-renewal #} - {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} - The user is not a member of the club·s {{ clubs }}. An additional fee of {{ pretty_fee }} - will be charged to renew automatically the membership in this/these club·s. - {% endblocktrans %} - {% else %} - {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} - The user is not a member of the club·s {{ clubs }}. Please create the required memberships, - otherwise it will fail. - {% endblocktrans %} - {% endif %} + {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} + The user is not a member of the club·s {{ clubs }}. Please create the required memberships, + otherwise it will fail. + {% endblocktrans %} {% else %} - {% if club.name == "Kfet" %} - {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} - This club has parents {{ clubs }}. An additional fee of {{ pretty_fee }} - will be charged to adhere automatically to this/these club·s. - {% endblocktrans %} - {% else %} - {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} - This club has parents {{ clubs }}. Please make sure that the user is a member of this or these club·s, - otherwise the creation of this membership will fail. - {% endblocktrans %} - {% endif %} + {% blocktrans trimmed with clubs=clubs_renewal|join:", " pretty_fee=additional_fee_renewal|pretty_money %} + This club has parents {{ clubs }}. Please make sure that the user is a member of this or these club·s, + otherwise the creation of this membership will fail. + {% endblocktrans %} {% endif %}
{% endif %} @@ -69,10 +55,6 @@ SPDX-License-Identifier: GPL-3.0-or-later let credit_amount = $("#id_credit_amount"); credit_amount.attr('disabled', true); credit_amount.val('{{ total_fee }}'); - - let bank = $("#id_bank"); - bank.attr('disabled', true); - bank.val('Société générale'); } {% endblock %} \ No newline at end of file diff --git a/apps/member/tests/test_memberships.py b/apps/member/tests/test_memberships.py index 7d41b93..28c62c8 100644 --- a/apps/member/tests/test_memberships.py +++ b/apps/member/tests/test_memberships.py @@ -179,20 +179,17 @@ class TestMemberships(TestCase): # We create a club without any parent and one club with parent BDE (that is the club Kfet) for bde_parent in False, True: - if bde_parent: - club = Club.objects.get(name="Kfet") - else: - club = Club.objects.create( - name="Second club " + ("with BDE" if bde_parent else "without BDE"), - parent_club=None, - email="newclub@example.com", - require_memberships=True, - membership_fee_paid=1000, - membership_fee_unpaid=500, - membership_start=date.today(), - membership_end=date.today() + timedelta(days=366), - membership_duration=366, - ) + club = Club.objects.create( + name="Second club " + ("with BDE" if bde_parent else "without BDE"), + parent_club=None, + email="newclub@example.com", + require_memberships=True, + membership_fee_paid=1000, + membership_fee_unpaid=500, + membership_start=date.today(), + membership_end=date.today() + timedelta(days=366), + membership_duration=366, + ) response = self.client.get(reverse("member:club_add_member", args=(club.pk,))) self.assertEqual(response.status_code, 200) @@ -204,8 +201,7 @@ class TestMemberships(TestCase): credit_type=NoteSpecial.objects.get(special_type="Espèces").id, credit_amount=4200, last_name="TOTO", - first_name="Toto", - bank="Le matelas", + first_name="Toto" )) self.assertRedirects(response, user.profile.get_absolute_url(), 302, 200) @@ -223,11 +219,6 @@ class TestMemberships(TestCase): self.assertEqual(response.status_code, 200) bde_membership = self.bde_membership - if bde_parent: - bde_membership = Membership.objects.get(club__name="BDE", user=user) - bde_membership.date_start = date(year=2000, month=1, day=1) - bde_membership.date_end = date(year=2000, month=12, day=31) - bde_membership.save() response = self.client.get(reverse("member:club_renew_membership", args=(bde_membership.pk,))) self.assertEqual(response.status_code, 200) @@ -243,7 +234,6 @@ class TestMemberships(TestCase): credit_amount=14242, last_name="TOTO", first_name="Toto", - bank="Bank", )) self.assertRedirects(response, user.profile.get_absolute_url(), 302, 200) diff --git a/apps/member/views.py b/apps/member/views.py index 81d054d..79a6620 100644 --- a/apps/member/views.py +++ b/apps/member/views.py @@ -656,12 +656,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): if not credit_type: credit_amount = 0 - if user.note.balance + credit_amount < fee and not Membership.objects.filter( - club__name="Kfet", - user=user, - date_start__lte=date.today(), - date_end__gte=date.today(), - ).exists(): + if user.note.balance + credit_amount < fee: # Users without a valid Kfet membership can't have a negative balance. # TODO Send a notification to the user (with a mail?) to tell her/him to credit her/his note form.add_error('user', @@ -678,7 +673,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): error = True # Must join the parent club before joining this club, except for the Kfet club where it can be at the same time. - if club.name != "Kfet" and club.parent_club and not Membership.objects.filter( + if club.parent_club and not Membership.objects.filter( user=form.instance.user, club=club.parent_club, date_start__gte=club.parent_club.membership_start, @@ -726,7 +721,6 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): 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"] if credit_type is None: @@ -750,7 +744,7 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): # Now, all is fine, the membership can be created. - if club.name == "BDE" or club.name == "Kfet": + if club.name == "BDE": # When we renew the BDE membership, we update the profile section # that should happens at least once a year. user.profile.section = user.profile.section_generated @@ -767,7 +761,6 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): reason="Crédit " + credit_type.special_type + " (Adhésion " + club.name + ")", last_name=last_name, first_name=first_name, - bank=bank, valid=True, ) transaction._force_save = True @@ -780,8 +773,10 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): ret = super().form_valid(form) member_role = Role.objects.filter(Q(name="Adhérent BDE") | Q(name="Membre de club")).all() \ - if club.name == "BDE" else Role.objects.filter(Q(name="Adhérent Kfet") | Q(name="Membre de club")).all() \ - if club.name == "Kfet"else Role.objects.filter(name="Membre de club").all() + if club.name == "BDE" else Role.objects.filter(Q(name="Adhérent BDA") | Q(name="Membre de club")).all() \ + if club.name == "BDA" else Role.objects.filter(Q(name="Adhérent BDS") | Q(name="Membre de club")).all() \ + if club.name == "BDS" else Role.objects.filter(name="Membre de club").all() + # Set the same roles as before if old_membership: member_role = member_role.union(old_membership.roles.all()) diff --git a/apps/note/api/serializers.py b/apps/note/api/serializers.py index 33bf75b..c6f62e3 100644 --- a/apps/note/api/serializers.py +++ b/apps/note/api/serializers.py @@ -160,7 +160,7 @@ class ConsumerSerializer(serializers.ModelSerializer): memberships = Membership.objects.filter( PermissionBackend.filter_queryset(get_current_request(), Membership, "view")).filter( user=obj.note.user, - club=2, # Kfet + club=2, # BDA ).order_by("-date_start") if memberships.exists(): return MembershipSerializer().to_representation(memberships.first()) diff --git a/apps/note/migrations/0001_initial.py b/apps/note/migrations/0001_initial.py index a0ebda3..f58bc44 100644 --- a/apps/note/migrations/0001_initial.py +++ b/apps/note/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.16 on 2020-09-04 21:41 +# Generated by Django 2.2.28 on 2022-08-17 20:53 from django.conf import settings from django.db import migrations, models @@ -11,9 +11,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('member', '0001_initial'), ('contenttypes', '0002_remove_content_type_name'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -26,7 +26,7 @@ class Migration(migrations.Migration): ('display_image', models.ImageField(default='pic/default.png', max_length=255, upload_to='pic/', verbose_name='display image')), ('created_at', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created at')), ('is_active', models.BooleanField(default=True, help_text='Designates whether this note should be treated as active. Unselect this instead of deleting notes.', verbose_name='active')), - ('inactivity_reason', models.CharField(choices=[('manual', 'The user blocked his/her note manually, eg. when he/she left the school for holidays. It can be reactivated at any time.'), ('forced', "The note is blocked by the the BDE and can't be manually reactivated.")], default=None, max_length=255, null=True)), + ('inactivity_reason', models.CharField(blank=True, choices=[('manual', 'The user blocked his/her note manually, eg. when he/she left the school for holidays. It can be reactivated at any time.'), ('forced', "The note is blocked by the the BDE and can't be manually reactivated.")], default='', max_length=255)), ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_note.note_set+', to='contenttypes.ContentType')), ], options={ @@ -56,7 +56,7 @@ class Migration(migrations.Migration): ('amount', models.PositiveIntegerField(verbose_name='amount')), ('reason', models.CharField(max_length=255, verbose_name='reason')), ('valid', models.BooleanField(default=True, verbose_name='valid')), - ('invalidity_reason', models.CharField(blank=True, default=None, max_length=255, null=True, verbose_name='invalidity reason')), + ('invalidity_reason', models.CharField(blank=True, default='', max_length=255, verbose_name='invalidity reason')), ('destination', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='note.Note', verbose_name='destination')), ('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_note.transaction_set+', to='contenttypes.ContentType')), ('source', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='note.Note', verbose_name='source')), @@ -128,7 +128,6 @@ class Migration(migrations.Migration): ('transaction_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='note.Transaction')), ('last_name', models.CharField(max_length=255, verbose_name='name')), ('first_name', models.CharField(max_length=255, verbose_name='first_name')), - ('bank', models.CharField(blank=True, max_length=255, verbose_name='bank')), ], options={ 'verbose_name': 'Special transaction', @@ -142,13 +141,26 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, unique=True, verbose_name='name')), ('normalized_name', models.CharField(editable=False, max_length=255, unique=True)), - ('note', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='note.Note')), + ('note', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='alias', to='note.Note')), ], options={ 'verbose_name': 'alias', 'verbose_name_plural': 'aliases', }, ), + migrations.CreateModel( + name='Trust', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('trusted', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='trusted', to='note.Note', verbose_name='trusted')), + ('trusting', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='trusting', to='note.Note', verbose_name='trusting')), + ], + options={ + 'verbose_name': 'frienship', + 'verbose_name_plural': 'friendships', + 'unique_together': {('trusting', 'trusted')}, + }, + ), migrations.CreateModel( name='TransactionTemplate', fields=[ diff --git a/apps/note/migrations/0002_create_special_notes.py b/apps/note/migrations/0002_special_note.py similarity index 100% rename from apps/note/migrations/0002_create_special_notes.py rename to apps/note/migrations/0002_special_note.py diff --git a/apps/note/migrations/0003_replace_null_by_blank.py b/apps/note/migrations/0003_replace_null_by_blank.py deleted file mode 100644 index 21da860..0000000 --- a/apps/note/migrations/0003_replace_null_by_blank.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('note', '0002_create_special_notes'), - ] - - operations = [ - migrations.RunSQL( - "UPDATE note_note SET inactivity_reason = '' WHERE inactivity_reason IS NULL;" - ), - migrations.RunSQL( - "UPDATE note_transaction SET invalidity_reason = '' WHERE invalidity_reason IS NULL;" - ), - ] diff --git a/apps/note/migrations/0004_remove_null_tag_on_charfields.py b/apps/note/migrations/0004_remove_null_tag_on_charfields.py deleted file mode 100644 index 012fc35..0000000 --- a/apps/note/migrations/0004_remove_null_tag_on_charfields.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 2.2.16 on 2020-09-06 19:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('note', '0003_replace_null_by_blank'), - ] - - operations = [ - migrations.AlterField( - model_name='note', - name='inactivity_reason', - field=models.CharField(blank=True, choices=[('manual', 'The user blocked his/her note manually, eg. when he/she left the school for holidays. It can be reactivated at any time.'), ('forced', "The note is blocked by the the BDE and can't be manually reactivated.")], default='', max_length=255), - ), - migrations.AlterField( - model_name='transaction', - name='invalidity_reason', - field=models.CharField(blank=True, default='', max_length=255, verbose_name='invalidity reason'), - ), - ] diff --git a/apps/note/migrations/0005_auto_20210313_1235.py b/apps/note/migrations/0005_auto_20210313_1235.py deleted file mode 100644 index 09696c3..0000000 --- a/apps/note/migrations/0005_auto_20210313_1235.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.2.19 on 2021-03-13 11:35 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('note', '0004_remove_null_tag_on_charfields'), - ] - - operations = [ - migrations.AlterField( - model_name='alias', - name='note', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='alias', to='note.Note'), - ), - ] diff --git a/apps/note/migrations/0006_trust.py b/apps/note/migrations/0006_trust.py deleted file mode 100644 index 4ed059f..0000000 --- a/apps/note/migrations/0006_trust.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 2.2.24 on 2021-09-05 19:16 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('note', '0005_auto_20210313_1235'), - ] - - operations = [ - migrations.CreateModel( - name='Trust', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('trusted', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='trusted', to='note.Note', verbose_name='trusted')), - ('trusting', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='trusting', to='note.Note', verbose_name='trusting')), - ], - options={ - 'verbose_name': 'frienship', - 'verbose_name_plural': 'friendships', - 'unique_together': {('trusting', 'trusted')}, - }, - ), - ] diff --git a/apps/note/models/transactions.py b/apps/note/models/transactions.py index 3c6b4c7..09c9874 100644 --- a/apps/note/models/transactions.py +++ b/apps/note/models/transactions.py @@ -306,11 +306,6 @@ class SpecialTransaction(Transaction): verbose_name=_("first_name"), ) - bank = models.CharField( - max_length=255, - verbose_name=_("bank"), - blank=True, - ) @property def type(self): @@ -346,20 +341,16 @@ class SpecialTransaction(Transaction): 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 = False - if not last_name or not first_name or (not bank and credit_type.special_type == "Chèque"): + if not last_name or not first_name: 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 diff --git a/apps/note/templates/note/transaction_form.html b/apps/note/templates/note/transaction_form.html index bdf047a..10e2330 100644 --- a/apps/note/templates/note/transaction_form.html +++ b/apps/note/templates/note/transaction_form.html @@ -139,12 +139,6 @@ SPDX-License-Identifier: GPL-2.0-or-later -
-
- - -
-

diff --git a/apps/note/tests/test_transactions.py b/apps/note/tests/test_transactions.py index 4f5dd6c..23fa311 100644 --- a/apps/note/tests/test_transactions.py +++ b/apps/note/tests/test_transactions.py @@ -34,7 +34,7 @@ class TestTransactions(TestCase): membership = Membership.objects.create(club=Club.objects.get(name="BDE"), user=self.user) membership.roles.add(Role.objects.get(name="Respo info")) membership.save() - Membership.objects.create(club=Club.objects.get(name="Kfet"), user=self.user) + Membership.objects.create(club=Club.objects.get(name="BDA"), user=self.user) self.user.note.refresh_from_db() self.second_user = User.objects.create( @@ -377,7 +377,7 @@ class TestNoteAPI(TestAPI): membership = Membership.objects.create(club=Club.objects.get(name="BDE"), user=self.user) membership.roles.add(Role.objects.get(name="Respo info")) membership.save() - Membership.objects.create(club=Club.objects.get(name="Kfet"), user=self.user) + Membership.objects.create(club=Club.objects.get(name="BDA"), user=self.user) self.user.note.last_negative = timezone.now() self.user.note.save() diff --git a/apps/permission/migrations/0001_initial.py b/apps/permission/migrations/0001_initial.py index c82aa03..d124c30 100644 --- a/apps/permission/migrations/0001_initial.py +++ b/apps/permission/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.16 on 2020-09-04 21:41 +# Generated by Django 2.2.28 on 2022-08-17 20:53 from django.db import migrations, models import django.db.models.deletion diff --git a/apps/permission/tests/test_permission_denied.py b/apps/permission/tests/test_permission_denied.py index 4a86375..dcbf7d7 100644 --- a/apps/permission/tests/test_permission_denied.py +++ b/apps/permission/tests/test_permission_denied.py @@ -11,7 +11,6 @@ from django.utils.crypto import get_random_string from activity.models import Activity from member.models import Club, Membership from note.models import NoteUser -from wei.models import WEIClub, Bus, WEIRegistration class TestPermissionDenied(TestCase): @@ -79,56 +78,6 @@ class TestPermissionDenied(TestCase): response = self.client.get(reverse("member:club_renew_membership", kwargs=dict(pk=membership.pk))) self.assertEqual(response.status_code, 403) - def test_create_weiclub(self): - response = self.client.get(reverse("wei:wei_create")) - self.assertEqual(response.status_code, 403) - - def test_create_wei_bus(self): - wei = WEIClub.objects.create( - membership_start=date.today(), - date_start=date.today() + timedelta(days=1), - date_end=date.today() + timedelta(days=1), - ) - response = self.client.get(reverse("wei:add_bus", kwargs=dict(pk=wei.pk))) - self.assertEqual(response.status_code, 403) - - def test_create_wei_team(self): - wei = WEIClub.objects.create( - membership_start=date.today(), - date_start=date.today() + timedelta(days=1), - date_end=date.today() + timedelta(days=1), - ) - bus = Bus.objects.create(wei=wei) - response = self.client.get(reverse("wei:add_team", kwargs=dict(pk=bus.pk))) - self.assertEqual(response.status_code, 403) - - def test_create_1a_weiregistration(self): - wei = WEIClub.objects.create( - membership_start=date.today(), - date_start=date.today() + timedelta(days=1), - date_end=date.today() + timedelta(days=1), - ) - response = self.client.get(reverse("wei:wei_register_1A", kwargs=dict(wei_pk=wei.pk))) - self.assertEqual(response.status_code, 403) - - def test_create_old_weiregistration(self): - wei = WEIClub.objects.create( - membership_start=date.today(), - date_start=date.today() + timedelta(days=1), - date_end=date.today() + timedelta(days=1), - ) - response = self.client.get(reverse("wei:wei_register_2A", kwargs=dict(wei_pk=wei.pk))) - self.assertEqual(response.status_code, 403) - - def test_validate_weiregistration(self): - wei = WEIClub.objects.create( - membership_start=date.today(), - date_start=date.today() + timedelta(days=1), - date_end=date.today() + timedelta(days=1), - ) - registration = WEIRegistration.objects.create(wei=wei, user=self.user, birth_date="2000-01-01") - response = self.client.get(reverse("wei:validate_registration", kwargs=dict(pk=registration.pk))) - self.assertEqual(response.status_code, 403) def test_create_invoice(self): response = self.client.get(reverse("treasury:invoice_create")) diff --git a/apps/permission/tests/test_permission_queries.py b/apps/permission/tests/test_permission_queries.py index 218c5a7..06f9151 100644 --- a/apps/permission/tests/test_permission_queries.py +++ b/apps/permission/tests/test_permission_queries.py @@ -11,7 +11,7 @@ from django.test import TestCase from django.utils import timezone from member.models import Club, Membership from note.models import NoteUser, Note, NoteClub, NoteSpecial -from wei.models import WEIMembership, WEIRegistration, WEIClub, Bus, BusTeam + from ..models import Permission @@ -23,44 +23,16 @@ class PermissionQueryTestCase(TestCase): def setUpTestData(cls): user = User.objects.create(username="user") NoteUser.objects.create(user=user) - wei = WEIClub.objects.create( - name="wei", - date_start=date.today(), - date_end=date.today(), - ) - NoteClub.objects.create(club=wei) - weiregistration = WEIRegistration.objects.create( - user=user, - wei=wei, - birth_date=date.today(), - ) - bus = Bus.objects.create( - name="bus", - wei=wei, - ) - team = BusTeam.objects.create( - name="team", - bus=bus, - color=0xFFFFFF, - ) - WEIMembership.objects.create( - user=user, - club=wei, - registration=weiregistration, - bus=bus, - team=team, - ) def test_permission_queries(self): """ Check for all permissions that the query is compilable and that the database can parse the query. - We use a random user with a random WEIClub (to use permissions for the WEI) in a random team in a random bus. + We use a random user. """ for perm in Permission.objects.all(): try: instanced = perm.about( user=User.objects.get(), - club=WEIClub.objects.get(), membership=Membership.objects.get(), User=User, Club=Club, diff --git a/apps/registration/forms.py b/apps/registration/forms.py index e867c81..48757eb 100644 --- a/apps/registration/forms.py +++ b/apps/registration/forms.py @@ -74,20 +74,21 @@ class ValidationForm(forms.Form): required=False, ) - bank = forms.CharField( - label=_("Bank"), - required=False, - ) - join_bde = forms.BooleanField( label=_("Join BDE Club"), required=False, - initial=True, + initial=False, ) - # The user can join the Kfet club at the inscription - join_kfet = forms.BooleanField( - label=_("Join Kfet Club"), + join_bda = forms.BooleanField( + label=_("Join BDA Club"), required=False, - initial=True, + initial=False, ) + + join_bds = forms.BooleanField( + label=_("Join BDS Club"), + required=False, + initial=False, + ) + diff --git a/apps/registration/templates/registration/future_profile_detail.html b/apps/registration/templates/registration/future_profile_detail.html index bb42475..78251eb 100644 --- a/apps/registration/templates/registration/future_profile_detail.html +++ b/apps/registration/templates/registration/future_profile_detail.html @@ -82,10 +82,6 @@ SPDX-License-Identifier: GPL-3.0-or-later credit_amount.attr('disabled', true); credit_amount.val('{{ total_fee }}'); - let bank = $("#id_bank"); - bank.attr('disabled', true); - bank.val('Société générale'); - let join_bde = $("#id_join_bde"); join_bde.attr('disabled', true); diff --git a/apps/registration/tests/test_registration.py b/apps/registration/tests/test_registration.py index 4bf27fa..8ee018e 100644 --- a/apps/registration/tests/test_registration.py +++ b/apps/registration/tests/test_registration.py @@ -193,7 +193,6 @@ class TestValidateRegistration(TestCase): credit_amount=4200, last_name="TOTO", first_name="Toto", - bank="Société générale", join_bde=False, join_kfet=False, )) @@ -206,7 +205,6 @@ class TestValidateRegistration(TestCase): credit_amount=0, last_name="TOTO", first_name="Toto", - bank="Société générale", join_bde=False, join_kfet=True, )) @@ -219,7 +217,6 @@ class TestValidateRegistration(TestCase): credit_amount=0, last_name="TOTO", first_name="Toto", - bank="J'ai pas d'argent", join_bde=True, join_kfet=True, )) @@ -232,7 +229,6 @@ class TestValidateRegistration(TestCase): credit_amount=4000, last_name="", first_name="", - bank="", join_bde=True, join_kfet=True, )) @@ -248,7 +244,6 @@ class TestValidateRegistration(TestCase): credit_amount=500, last_name="TOTO", first_name="Toto", - bank="Société générale", join_bde=True, join_kfet=False, )) @@ -273,7 +268,6 @@ class TestValidateRegistration(TestCase): credit_amount=500, last_name="TOTO", first_name="Toto", - bank="Société générale", join_bde=True, join_kfet=False, )) @@ -307,16 +301,17 @@ class TestValidateRegistration(TestCase): credit_amount=4000, last_name="TOTO", first_name="Toto", - bank="Société générale", join_bde=True, - join_kfet=True, + join_bda=True, + join_bds=True )) self.assertRedirects(response, self.user.profile.get_absolute_url(), 302, 200) self.user.profile.refresh_from_db() self.assertTrue(self.user.profile.registration_valid) self.assertTrue(NoteUser.objects.filter(user=self.user).exists()) self.assertTrue(Membership.objects.filter(club__name="BDE", user=self.user).exists()) - self.assertTrue(Membership.objects.filter(club__name="Kfet", user=self.user).exists()) + self.assertTrue(Membership.objects.filter(club__name="BDA", user=self.user).exists()) + self.assertTrue(Membership.objects.filter(club__name="BDS", user=self.user).exists()) self.assertEqual(Transaction.objects.filter( Q(source=self.user.note) | Q(destination=self.user.note)).count(), 3) diff --git a/apps/registration/views.py b/apps/registration/views.py index 684d9fc..a9e1238 100644 --- a/apps/registration/views.py +++ b/apps/registration/views.py @@ -225,9 +225,10 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, user = self.get_object() fee = 0 bde = Club.objects.get(name="BDE") - 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 + bda = Club.objects.get(name="BDA") + bds = Club.objects.get(name="BDS") + for auto_club in [bde, bda, bds]: + fee += auto_club.membership_fee_paid if user.profile.paid else auto_club.membership_fee_unpaid ctx["total_fee"] = "{:.02f}".format(fee / 100, ) return ctx @@ -256,30 +257,20 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, 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"] join_bde = form.cleaned_data["join_bde"] - join_kfet = form.cleaned_data["join_kfet"] + join_bda = form.cleaned_data["join_bda"] + join_bds = form.cleaned_data["join_bds"] - 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 - # This is mandatory. - fee += bde_fee if join_bde else 0 - kfet = Club.objects.get(name="Kfet") - 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 the bank pays, then we don't credit now. Treasurers will validate the transaction - # and credit the note later. - credit_type = credit_type + bda = Club.objects.get(name="BDA") + bds = Club.objects.get(name="BDS") + for auto_club, auto_join in zip([bde, bda, bds], [join_bde, join_bda, join_bds]): + bd_fee = auto_club.membership_fee_paid if user.profile.paid else auto_club.membership_fee_unpaid + fee += bd_fee if auto_join else 0 + # If the user does not select any payment method, then no credit will be performed. credit_amount = 0 if credit_type is None else credit_amount @@ -314,36 +305,23 @@ class FutureUserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, FormMixin, reason="Crédit " + credit_type.special_type + " (Inscription)", last_name=last_name, first_name=first_name, - bank=bank, valid=True, ) + for auto_club, auto_join, name in zip([bde, bda, bds], [join_bde, join_bda, join_bds], ["Adhérent BDE", "Adhérent BDA", "Adhérent BDS"]): + bd_fee = auto_club.membership_fee_paid if user.profile.paid else auto_club.membership_fee_unpaid - if join_bde: - # Create membership for the user to the BDE starting today - membership = Membership( - club=bde, - user=user, - fee=bde_fee, - ) - membership.save() - membership.refresh_from_db() - membership.roles.add(Role.objects.get(name="Adhérent BDE")) - membership.save() + if auto_join: + # Create membership for the user to the BDEAS starting today + membership = Membership( + club=auto_club, + user=user, + fee=bd_fee, + ) + membership.save() + membership.refresh_from_db() + membership.roles.add(Role.objects.get(name=name)) + membership.save() - if join_kfet: - # Create membership for the user to the Kfet starting today - membership = Membership( - club=kfet, - user=user, - fee=kfet_fee, - ) - - membership.save() - membership.refresh_from_db() - membership.roles.add(Role.objects.get(name="Adhérent Kfet")) - membership.save() - - return ret def get_success_url(self): diff --git a/apps/treasury/forms.py b/apps/treasury/forms.py index 8a07eab..ff6eb75 100644 --- a/apps/treasury/forms.py +++ b/apps/treasury/forms.py @@ -132,8 +132,6 @@ class LinkTransactionToRemittanceForm(forms.ModelForm): first_name = forms.Field(label=_("First name")) - bank = forms.Field(label=_("Bank")) - amount = forms.IntegerField(label=_("Amount"), min_value=0, widget=AmountInput(), disabled=True, required=False) def __init__(self, *args, **kwargs): @@ -148,7 +146,6 @@ class LinkTransactionToRemittanceForm(forms.ModelForm): cleaned_data = super().clean() self.instance.transaction.last_name = cleaned_data["last_name"] self.instance.transaction.first_name = cleaned_data["first_name"] - self.instance.transaction.bank = cleaned_data["bank"] return cleaned_data @transaction.atomic diff --git a/apps/treasury/migrations/0001_initial.py b/apps/treasury/migrations/0001_initial.py index 47b0dfa..aea6175 100644 --- a/apps/treasury/migrations/0001_initial.py +++ b/apps/treasury/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.28 on 2022-08-06 13:33 +# Generated by Django 2.2.28 on 2022-08-17 20:53 import datetime import django.core.validators @@ -12,7 +12,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('note', '0006_trust'), + ('note', '0001_initial'), ] operations = [ diff --git a/apps/treasury/tables.py b/apps/treasury/tables.py index 0041c25..1f7de9b 100644 --- a/apps/treasury/tables.py +++ b/apps/treasury/tables.py @@ -118,5 +118,5 @@ class SpecialTransactionTable(tables.Table): } model = SpecialTransaction template_name = 'django_tables2/bootstrap4.html' - fields = ('created_at', 'source', 'destination', 'last_name', 'first_name', 'bank', 'amount', 'reason',) + fields = ('created_at', 'source', 'destination', 'last_name', 'first_name', 'amount', 'reason',) order_by = ('-created_at',) diff --git a/apps/treasury/tests/test_treasury.py b/apps/treasury/tests/test_treasury.py index c5bcda5..1d40799 100644 --- a/apps/treasury/tests/test_treasury.py +++ b/apps/treasury/tests/test_treasury.py @@ -187,7 +187,6 @@ class TestRemittances(TestCase): reason="Credit", last_name="TOTO", first_name="Toto", - bank="Société générale", ) self.second_credit = SpecialTransaction.objects.create( @@ -197,7 +196,6 @@ class TestRemittances(TestCase): reason="Second credit", last_name="TOTO", first_name="Toto", - bank="Société générale", ) self.remittance = Remittance.objects.create( @@ -275,7 +273,6 @@ class TestRemittances(TestCase): remittance=self.remittance.pk, last_name="Last Name", first_name="First Name", - bank="Bank", )) self.assertRedirects(response, reverse("treasury:remittance_list"), 302, 200) self.credit.refresh_from_db() @@ -320,8 +317,7 @@ class TestTreasuryAPI(TestAPI): amount=4200, reason="Credit", last_name="TOTO", - first_name="Toto", - bank="Société générale", + first_name="Toto" ) self.remittance = Remittance.objects.create( @@ -332,7 +328,7 @@ class TestTreasuryAPI(TestAPI): self.credit.specialtransactionproxy.remittance = self.remittance self.credit.specialtransactionproxy.save() - self.kfet = Club.objects.get(name="Kfet") + self.kfet = Club.objects.get(name="BDA") self.bde = self.kfet.parent_club self.kfet_membership = Membership( diff --git a/apps/treasury/views.py b/apps/treasury/views.py index e6fc017..a234479 100644 --- a/apps/treasury/views.py +++ b/apps/treasury/views.py @@ -174,7 +174,7 @@ class InvoiceUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): class InvoiceDeleteView(ProtectQuerysetMixin, LoginRequiredMixin, DeleteView): """ - Delete a non-validated WEI registration + Delete a non-validated registration """ model = Invoice extra_context = {"title": _("Delete invoice")} @@ -368,7 +368,6 @@ class LinkTransactionToRemittanceView(ProtectQuerysetMixin, LoginRequiredMixin, form = context["form"] form.fields["last_name"].initial = self.object.transaction.last_name form.fields["first_name"].initial = self.object.transaction.first_name - form.fields["bank"].initial = self.object.transaction.bank form.fields["amount"].initial = self.object.transaction.amount form.fields["remittance"].queryset = form.fields["remittance"] \ .queryset.filter(remittance_type__note=self.object.transaction.source) diff --git a/note_kfet/templates/base.html b/note_kfet/templates/base.html index ee99016..ee2dfcb 100644 --- a/note_kfet/templates/base.html +++ b/note_kfet/templates/base.html @@ -148,29 +148,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% if user.is_authenticated %} - {% if not user|is_member:"BDE" %} -
- {% trans "You are not a BDE member anymore. Please renew your membership if you want to use the note." %} -
- {% endif %} - {% if not user.profile.email_confirmed %}
{% trans "Your e-mail address is not validated. Please check your mail inbox and click on the validation link." %}
{% endif %} {% endif %} - {% if user.sogecredit and not user.sogecredit.valid %} -
- {% blocktrans trimmed %} - You declared that you opened a bank account in the Société générale. The bank did not validate - the creation of the account to the BDE, so the membership and the WEI are not paid yet. - This verification procedure may last a few days. - Please make sure that you go to the end of the account creation. - {% endblocktrans %} -
- {% endif %} - {# TODO Add banners #}
{% block content %}

Default content...