diff --git a/src/membership/admin.py b/src/membership/admin.py index 1c02f0a..69e2c22 100644 --- a/src/membership/admin.py +++ b/src/membership/admin.py @@ -148,21 +148,21 @@ class MemberAdmin(UserAdmin): class WaitingListEntryAdmin(admin.ModelAdmin): """Admin for WaitingList model.""" - list_display = ("email", "has_user") - actions = ("create_user",) + list_display = ("email", "member") + actions = ("create_member",) - @admin.action(description="Create user account for entries") - def create_user(self, request: HttpRequest, queryset: QuerySet[WaitingListEntry]) -> None: + @admin.action(description="Create member account for entries") + def create_member(self, request: HttpRequest, queryset: QuerySet[WaitingListEntry]) -> None: """Create a user account for this entry. Note that actions can soon be made available from the edit page, too: https://github.com/django/django/pull/16012 """ for entry in queryset: - Member.objects.create_user(email=entry.email, username=slugify(entry.email), is_active=False) - entry.has_user = True + member = Member.objects.create_user(email=entry.email, username=slugify(entry.email), is_active=False) + entry.member = member entry.save() messages.info( request, - f"Added user for f{entry.email} - ensure they have a membership and send an invite email.", + f"Added user for {entry.email} - ensure they have a membership and send an invite email.", ) diff --git a/src/membership/forms.py b/src/membership/forms.py index b91d03b..71afaaa 100644 --- a/src/membership/forms.py +++ b/src/membership/forms.py @@ -23,6 +23,7 @@ class InviteForm(SetPasswordForm): Taken from the allauth Signup form - we should consider that data can be leaked here. """ value = self.cleaned_data["username"] + # The allauth adapter ensures the username is unique. return get_allauth_adapter().clean_username(value) def save(self) -> None: diff --git a/src/membership/migrations/0010_waitinglistentry_has_user.py b/src/membership/migrations/0010_waitinglistentry_has_user.py deleted file mode 100644 index 331dc28..0000000 --- a/src/membership/migrations/0010_waitinglistentry_has_user.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1rc1 on 2024-08-11 21:27 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('membership', '0009_membership_referral_code'), - ] - - operations = [ - migrations.AddField( - model_name='waitinglistentry', - name='has_user', - field=models.BooleanField(default=False, help_text='Once a user account is generated (use the admin action), this field will be marked.', verbose_name='has user'), - ), - ] diff --git a/src/membership/migrations/0010_waitinglistentry_member.py b/src/membership/migrations/0010_waitinglistentry_member.py new file mode 100644 index 0000000..3bc2e08 --- /dev/null +++ b/src/membership/migrations/0010_waitinglistentry_member.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1rc1 on 2024-08-14 08:05 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('membership', '0009_membership_referral_code'), + ] + + operations = [ + migrations.AddField( + model_name='waitinglistentry', + name='member', + field=models.ForeignKey(help_text='Once a member account is generated (use the admin action), this field will be marked.', null=True, blank=True, on_delete=django.db.models.deletion.CASCADE, to='membership.member', verbose_name='has member'), + ), + ] diff --git a/src/membership/models.py b/src/membership/models.py index b581b51..f9e5ddd 100644 --- a/src/membership/models.py +++ b/src/membership/models.py @@ -230,10 +230,13 @@ class WaitingListEntry(CreatedModifiedAbstract): email = models.EmailField() geography = models.CharField(verbose_name=_("geography"), blank=True, default="") comment = models.TextField(blank=True) - has_user = models.BooleanField( - default=False, - verbose_name=_("has user"), - help_text=_("Once a user account is generated (use the admin action), this field will be marked."), + member = models.ForeignKey( + Member, + null=True, + blank=True, + verbose_name=_("has member"), + help_text=_("Once a member account is generated (use the admin action), this field will be marked."), + on_delete=models.CASCADE, ) def __str__(self) -> str: