From 9eaccbe9948e2085fe6709569b341fd9079ecf3b Mon Sep 17 00:00:00 2001 From: Dirk Doesburg Date: Mon, 13 Nov 2023 13:49:11 +0100 Subject: [PATCH 1/2] Start fixing oldmembers mailinglist --- website/mailinglists/services.py | 1 - website/members/forms.py | 9 +++++++++ website/registrations/services.py | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/website/mailinglists/services.py b/website/mailinglists/services.py index de5432a82..964aa34ec 100644 --- a/website/mailinglists/services.py +++ b/website/mailinglists/services.py @@ -62,7 +62,6 @@ def get_automatic_lists(): m.current_membership is None or m.current_membership.type != Membership.MEMBER ) - and m.has_been_member() ] lists = [ diff --git a/website/members/forms.py b/website/members/forms.py index 1390d1141..ff67ef259 100644 --- a/website/members/forms.py +++ b/website/members/forms.py @@ -54,6 +54,15 @@ def __init__(self, *args, **kwargs): "email_gsuite_only" ].hidden_widget() + if ( + not kwargs["instance"].user.has_been_member() + and not kwargs["instance"].receive_oldmembers + ): + self.fields["receive_oldmembers"].disabled = True + # TODO: Explain why. + + # TODO: migration to set False for benefactors created after 2016-2017. + self.render_app_specific_profile_form_fields() def render_app_specific_profile_form_fields(self): diff --git a/website/registrations/services.py b/website/registrations/services.py index 73e046249..10b1704ee 100644 --- a/website/registrations/services.py +++ b/website/registrations/services.py @@ -340,6 +340,7 @@ def _create_member(registration: Registration) -> Member: birthday=registration.birthday, show_birthday=registration.optin_birthday, receive_optin=registration.optin_mailinglist, + receive_oldmembers=registration.membership_type == Membership.MEMBER, ) if registration.direct_debit: From 9125e68eb91247ac085ed6cc3ec0bad59645a289 Mon Sep 17 00:00:00 2001 From: Dirk Doesburg Date: Wed, 22 Nov 2023 10:58:41 +0100 Subject: [PATCH 2/2] Add migration and explanation --- website/members/forms.py | 12 +++-- .../migrations/0048_auto_20231121_2025.py | 50 +++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 website/members/migrations/0048_auto_20231121_2025.py diff --git a/website/members/forms.py b/website/members/forms.py index ff67ef259..2b5c11323 100644 --- a/website/members/forms.py +++ b/website/members/forms.py @@ -6,6 +6,7 @@ from django.core.validators import RegexValidator from django.utils.translation import gettext_lazy as _ +from members.models import Member from thabloid.models.thabloid_user import ThabloidUser from .models import Profile @@ -55,13 +56,16 @@ def __init__(self, *args, **kwargs): ].hidden_widget() if ( - not kwargs["instance"].user.has_been_member() + not Member.objects.get(pk=kwargs["instance"].user_id).has_been_member() and not kwargs["instance"].receive_oldmembers ): self.fields["receive_oldmembers"].disabled = True - # TODO: Explain why. - - # TODO: migration to set False for benefactors created after 2016-2017. + self.fields["receive_oldmembers"].help_text = ( + "If you are a past member, receive emails about Thalia events aimed at alumni. " + "You cannot enable this option, as we don't have any records of you having been a member " + "(a long time ago, we didn't keep track of this yet). Contact " + "info@thalia.nu if you want to receive alumni emails." + ) self.render_app_specific_profile_form_fields() diff --git a/website/members/migrations/0048_auto_20231121_2025.py b/website/members/migrations/0048_auto_20231121_2025.py new file mode 100644 index 000000000..047f12b72 --- /dev/null +++ b/website/members/migrations/0048_auto_20231121_2025.py @@ -0,0 +1,50 @@ +# Generated by Django 4.2.7 on 2023-11-21 19:25 + +from django.db import migrations +from django.db.models import Exists, OuterRef + + +def deregister_recent_benefactors_from_oldmembers_mailinglist(apps, schema_editor): + """Deregister all benefactors since 2017 from the oldmembers mailinglist. + + We've changed the oldmembers list to include everyone with the 'receive_oldmembers' + preference set, regardless of whether they have been a member in the past. Newly made + benefactors are automatically excluded, and any existing members or benefactors are + included. This is because for many people, we don't have a complete history of their + memberships. + + To prevent recently created benefactors (of which we do have a complete history) from + being included in the oldmembers list, we need to set their 'receive_oldmembers' False. + """ + Profile = apps.get_model("members", "Profile") + Member = apps.get_model("members", "Member") + Membership = apps.get_model("members", "Membership") + + # Get people made after the initial migration (+- 2016-12-06) who have only been a benefactor. + benefactors = ( + Member.objects.filter(date_joined__gte="2017-01-01") + .filter( + Exists(Membership.objects.filter(user=OuterRef("pk"), type="benefactor")) + ) + .exclude( + Exists( + Membership.objects.filter(user=OuterRef("pk"), type="member"), + ) + ) + ) + + # Set 'receive_oldmembers' to False for all benefactors since 2017 + Profile.objects.filter(user__in=benefactors).update(receive_oldmembers=False) + + +class Migration(migrations.Migration): + dependencies = [ + ("members", "0048_alter_profile_photo"), + ] + + operations = [ + migrations.RunPython( + deregister_recent_benefactors_from_oldmembers_mailinglist, + migrations.RunPython.noop, + ) + ]