From 743ab0bdbaa0cd200714527fe1df3f33eee717b3 Mon Sep 17 00:00:00 2001 From: Dirk Doesburg Date: Wed, 13 Mar 2024 21:25:03 +0100 Subject: [PATCH] Update membership upgrade discount conditions to match HR (#3641) A user now gets the discount also in the year after last having been a member. --- website/registrations/forms.py | 4 +++- website/registrations/tests/test_forms.py | 20 ++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/website/registrations/forms.py b/website/registrations/forms.py index bce721eca..911123581 100644 --- a/website/registrations/forms.py +++ b/website/registrations/forms.py @@ -1,3 +1,5 @@ +from datetime import timedelta + from django import forms from django.conf import settings from django.core.exceptions import NON_FIELD_ERRORS, ValidationError @@ -223,7 +225,7 @@ def clean(self): if Membership.objects.filter( user=self.cleaned_data["member"], type=Membership.MEMBER, - until__gte=now, + until__gte=now - timedelta(days=366), since__lte=now, ).exists(): # The membership upgrade discount applies if, at the time a Renewal is diff --git a/website/registrations/tests/test_forms.py b/website/registrations/tests/test_forms.py index aa8ce0a25..13a86b18a 100644 --- a/website/registrations/tests/test_forms.py +++ b/website/registrations/tests/test_forms.py @@ -177,6 +177,21 @@ def test_price_calculation(self): ) renewal.delete() + with self.subTest("Member, membership upgrade discount (last year)"): + with freeze_time("2024-10-20"): + # The user had a membership last year, but still should get a discount. + self.data["length"] = Entry.MEMBERSHIP_STUDY + self.data["membership_type"] = Membership.MEMBER + form = forms.RenewalForm(self.data) + self.assertTrue(form.is_valid()) + renewal = form.save() + self.assertEqual( + renewal.contribution, + settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY] + - settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR], + ) + renewal.delete() + with self.subTest("Member, new year membership before expiry"): with freeze_time("2024-08-20"): self.data["length"] = Entry.MEMBERSHIP_YEAR @@ -203,8 +218,9 @@ def test_price_calculation(self): ) renewal.delete() - with self.subTest("Member, study membership after expiry"): - with freeze_time("2024-09-10"): + with self.subTest("Member, study membership after more than a year"): + with freeze_time("2025-09-10"): + # The membership discount applies up to 1 year after the user last had a membership. self.data["length"] = Entry.MEMBERSHIP_STUDY self.data["membership_type"] = Membership.MEMBER form = forms.RenewalForm(self.data)