Resolves reuse of invitation code
This commit is contained in:
parent
5248a252ec
commit
aa17f9679b
8 changed files with 86 additions and 2 deletions
|
|
@ -57,6 +57,9 @@ class InvitationFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
|||
|
||||
class Params:
|
||||
expired = factory.Trait(expiration_date=factory.LazyFunction(timezone.now))
|
||||
with_invited_user = factory.Trait(
|
||||
invited_user=factory.SubFactory("funkwhale_api.users.factories.UserFactory")
|
||||
)
|
||||
|
||||
|
||||
class PasswordSetter(factory.PostGenerationMethodCall):
|
||||
|
|
|
|||
|
|
@ -0,0 +1,37 @@
|
|||
# Generated by Django 3.2.16 on 2022-11-19 18:19
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
def update_invitation_table(apps, schema_editor):
|
||||
User = apps.get_model("users", "User")
|
||||
Invitation = apps.get_model("users", "Invitation")
|
||||
for user in User.objects.all():
|
||||
if user.invitation:
|
||||
Invitation.objects.filter(id=user.invitation.id).update(invited_user_id=user.id)
|
||||
|
||||
|
||||
def rewind(*args, **kwargs):
|
||||
pass
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0021_auto_20210703_1810'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='invitation',
|
||||
name='invited_user',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_invitations', to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='invitation',
|
||||
name='owner',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='invitations', to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
migrations.RunPython(update_invitation_table, rewind),
|
||||
]
|
||||
|
|
@ -338,6 +338,9 @@ class Invitation(models.Model):
|
|||
owner = models.ForeignKey(
|
||||
User, related_name="invitations", on_delete=models.CASCADE
|
||||
)
|
||||
invited_user = models.ForeignKey(
|
||||
User, related_name="user_invitations", null=True, on_delete=models.CASCADE
|
||||
)
|
||||
code = models.CharField(max_length=50, unique=True)
|
||||
|
||||
objects = InvitationQuerySet.as_manager()
|
||||
|
|
@ -352,6 +355,10 @@ class Invitation(models.Model):
|
|||
|
||||
return super().save(**kwargs)
|
||||
|
||||
def set_invited_user(self, user):
|
||||
self.invited_user = user
|
||||
super().save()
|
||||
|
||||
|
||||
class Application(oauth2_models.AbstractApplication):
|
||||
scope = models.TextField(blank=True)
|
||||
|
|
|
|||
|
|
@ -40,6 +40,9 @@ class RegisterView(registration_views.RegisterView):
|
|||
if not user.is_active:
|
||||
# manual approval, we need to send the confirmation e-mail by hand
|
||||
authentication.send_email_confirmation(self.request, user)
|
||||
if user.invitation:
|
||||
user.invitation.set_invited_user(user)
|
||||
|
||||
return user
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue