From f87837218e7f50a0e77c8929bf9d48c8fdde2358 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sun, 15 Dec 2024 21:35:32 +0100 Subject: [PATCH] members/waitinglist: preserve waitinglist application date --- jdav_web/members/admin.py | 13 ++--------- ...031_member_waitinglist_application_date.py | 18 +++++++++++++++ jdav_web/members/models.py | 23 +++++++++++++++++++ 3 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 jdav_web/members/migrations/0031_member_waitinglist_application_date.py diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 45e6868..65fa705 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -543,17 +543,8 @@ class MemberUnconfirmedAdmin(CommonAdminMixin, admin.ModelAdmin): def demote_to_waiter(self, request, queryset): for member in queryset: - waiter = MemberWaitingList(prename=member.prename, - lastname=member.lastname, - email=member.email, - birth_date=member.birth_date, - gender=member.gender, - comments=member.comments, - confirmed_mail=member.confirmed_mail, - confirm_mail_key=member.confirm_mail_key) - waiter.save() - member.delete() - messages.success(request, _("Successfully demoted %(name)s to waiter.") % {'name': waiter.name}) + member.demote_to_waiter() + messages.success(request, _("Successfully demoted %(name)s to waiter.") % {'name': member.name}) def response_change(self, request, member): if "_confirm" in request.POST: diff --git a/jdav_web/members/migrations/0031_member_waitinglist_application_date.py b/jdav_web/members/migrations/0031_member_waitinglist_application_date.py new file mode 100644 index 0000000..76e72f7 --- /dev/null +++ b/jdav_web/members/migrations/0031_member_waitinglist_application_date.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.1 on 2024-12-15 18:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0030_alter_member_options'), + ] + + operations = [ + migrations.AddField( + model_name='member', + name='waitinglist_application_date', + field=models.DateTimeField(blank=True, help_text='If the person registered from the waitinglist, this is their application date.', null=True, verbose_name='waitinglist application date'), + ), + ] diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index ad497fd..273b92e 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -301,6 +301,9 @@ class Member(Person): user = models.OneToOneField(User, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=_('Login data')) invite_as_user_key = models.CharField(max_length=32, default="") + waitinglist_application_date = models.DateTimeField(verbose_name=_('waitinglist application date'), + null=True, blank=True, + help_text=_('If the person registered from the waitinglist, this is their application date.')) objects = MemberManager() @@ -452,6 +455,9 @@ class Member(Person): if self.email == waiter.email: self.confirmed_mail = waiter.confirmed_mail self.confirm_mail_key = waiter.confirm_mail_key + # store waitinglist application date in member, this will be used + # if the member is later demoted to waiter again + self.waitinglist_application_date = waiter.application_date if self.alternative_email: self.confirmed_alternative_mail = False self.save() @@ -719,6 +725,23 @@ class Member(Person): """Returns a queryset of freizeiten that this member is a youth leader of.""" return Freizeit.objects.filter(jugendleiter__pk=self.pk)[:limit] + def demote_to_waiter(self): + """Demote this member to a waiter by creating a waiter from the data and removing + this member.""" + waiter = MemberWaitingList(prename=self.prename, + lastname=self.lastname, + email=self.email, + birth_date=self.birth_date, + gender=self.gender, + comments=self.comments, + confirmed_mail=self.confirmed_mail, + confirm_mail_key=self.confirm_mail_key) + # if this member was created from the waitinglist, keep the original application date + if self.waitinglist_application_date: + waiter.application_date = self.waitinglist_application_date + waiter.save() + self.delete() + class EmergencyContact(ContactWithPhoneNumber): """