diff --git a/CHANGELOG.rst b/CHANGELOG.rst index fd63ee124d6d3e563ae496f08fc31c57f4b21312..4dac25bc4b1ab18137fcda671b7e030faf2365c8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -25,6 +25,8 @@ Fixed * The system tried to send notifications for done background tasks in addition to tasks started in the foreground. +* Invitations for existing short name did not work. +* Invitations for persons without pre-defined e-mail address did not behave correctly Removed ~~~~~~~ diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py index 136c6d38f1bf7b143ecf631077f48b75c2149957..2f469606c95086ce26993129ba5840071465bb6b 100644 --- a/aleksis/core/forms.py +++ b/aleksis/core/forms.py @@ -611,6 +611,7 @@ class AccountRegisterForm(SignupForm, ExtensibleForm): request = kwargs.pop("request", None) super(AccountRegisterForm, self).__init__(*args, **kwargs) + person = None if request.session.get("account_verified_email"): email = request.session["account_verified_email"] @@ -619,16 +620,27 @@ class AccountRegisterForm(SignupForm, ExtensibleForm): except (Person.DoesNotExist, Person.MultipleObjectsReturned): raise SuspiciousOperation() - self.fields["email"].disabled = True - self.fields["email2"].disabled = True + elif request.session.get("invitation_code"): + try: + invitation = PersonInvitation.objects.get( + key=request.session.get("invitation_code") + ) + except PersonInvitation.DoesNotExist: + raise SuspiciousOperation() - if person: - available_fields = [field.name for field in Person._meta.get_fields()] + person = invitation.person + + if person: + self.instance = person + available_fields = [field.name for field in Person._meta.get_fields()] + if person.email: + self.fields["email"].disabled = True + self.fields["email2"].disabled = True self.fields["email2"].initial = person.email - for field in self.fields: - if field in available_fields and getattr(person, field): - self.fields[field].disabled = True - self.fields[field].initial = getattr(person, field) + for field in self.fields: + if field in available_fields and getattr(person, field): + self.fields[field].disabled = True + self.fields[field].initial = getattr(person, field) def save(self, request): adapter = get_adapter(request) @@ -639,11 +651,14 @@ class AccountRegisterForm(SignupForm, ExtensibleForm): for field in Person._meta.get_fields(): if field.name in self.cleaned_data: data[field.name] = self.cleaned_data[field.name] - person_qs = Person.objects.filter(email=data["email"]) - if not person_qs.exists(): - if get_site_preferences()["account__auto_create_person"]: - Person.objects.create(user=user, **data) + if self.instance: + person_qs = Person.objects.filter(pk=self.instance.pk) else: + person_qs = Person.objects.filter(email=data["email"]) + if not person_qs.exists(): + if get_site_preferences()["account__auto_create_person"]: + Person.objects.create(user=user, **data) + if person_qs.exists(): person_qs.update(user=user, **data) self.custom_signup(request, user) setup_user_email(request, user, []) diff --git a/aleksis/core/views.py b/aleksis/core/views.py index e55a58b9c88e62ba3c9716300e8416e86e6d6eec..6f01d8e53b4ccad0cf9bccbce8fc4bc2b2b65008 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -51,7 +51,7 @@ from haystack.inputs import AutoQuery from haystack.query import SearchQuerySet from haystack.utils.loading import UnifiedIndex from health_check.views import MainView -from invitations.views import SendInvite, accept_invitation +from invitations.views import SendInvite from oauth2_provider.exceptions import OAuthToolkitError from oauth2_provider.models import get_application_model from oauth2_provider.views import AuthorizationView @@ -1104,12 +1104,7 @@ class EnterInvitationCode(FormView): and not PersonInvitation.objects.get(key=code).accepted and not PersonInvitation.objects.get(key=code).key_expired() ): - invitation = PersonInvitation.objects.get(key=code) - # Mark invitation as accepted and redirect to signup - accept_invitation( - invitation=invitation, request=self.request, signal_sender=self.request.user - ) - self.request.session["invitation_code_entered"] = True + self.request.session["invitation_code"] = code return redirect("account_signup") return redirect("invitations:accept-invite", code) @@ -1432,7 +1427,7 @@ class AccountRegisterView(SignupView): if ( not request.user.has_perm("core.can_register") and not request.session.get("account_verified_email") - and not request.session.get("invitation_code_entered") + and not request.session.get("invitation_code") ): raise PermissionDenied() return super(AccountRegisterView, self).dispatch(request, *args, **kwargs)