def social_create_user(strategy: DjangoStrategy, details, backend, user=None, *args, **kwargs): if user: return {"is_new": False} user_email = details["email"][0] if isinstance(details["email"], (list, tuple)) else details["email"] user_name = details["fullname"] strategy.session_set("user_name", user_name) strategy.session_set("backend", backend.name) from_invite = False invite_id = strategy.session_get("invite_id") if not invite_id: company_name = strategy.session_get("company_name", None) email_opt_in = strategy.session_get("email_opt_in", None) if not company_name or email_opt_in is None: return redirect(finish_social_signup) _, _, user = User.objects.bootstrap( company_name=company_name, first_name=user_name, email=user_email, email_opt_in=email_opt_in, password=None ) else: from_invite = True try: invite: Union[OrganizationInvite, TeamInviteSurrogate] = OrganizationInvite.objects.select_related( "organization" ).get(id=invite_id) except (OrganizationInvite.DoesNotExist, ValidationError): try: invite = TeamInviteSurrogate(invite_id) except Team.DoesNotExist: processed = render_to_string("auth_error.html", {"message": "Invalid invite link!"},) return HttpResponse(processed, status=401) try: invite.validate(user=None, email=user_email) except ValueError as e: processed = render_to_string("auth_error.html", {"message": str(e)},) return HttpResponse(processed, status=401) try: user = strategy.create_user(email=user_email, first_name=user_name, password=None) except Exception as e: capture_exception(e) processed = render_to_string( "auth_error.html", { "message": "Account unable to be created. This account may already exist. Please try again or use different credentials!" }, ) return HttpResponse(processed, status=401) invite.use(user, prevalidated=True) posthoganalytics.capture( user.distinct_id, "user signed up", properties={ "is_first_user": User.objects.count() == 1, "is_first_team_user": not from_invite, "login_provider": backend.name, }, ) return {"is_new": True, "user": user}
def process_social_invite_signup( strategy: DjangoStrategy, invite_id: str, email: str, full_name: str ) -> Union[HttpResponse, User]: try: invite: Union[OrganizationInvite, TeamInviteSurrogate] = OrganizationInvite.objects.select_related( "organization", ).get(id=invite_id) except (OrganizationInvite.DoesNotExist, ValidationError): try: invite = TeamInviteSurrogate(invite_id) except Team.DoesNotExist: return redirect(f"/signup/{invite_id}?error_code=invalid_invite&source=social_create_user") try: invite.validate(user=None, email=email) except exceptions.ValidationError as e: return redirect( f"/signup/{invite_id}?error_code={e.get_codes()[0]}&error_detail={e.args[0]}&source=social_create_user" ) try: user = strategy.create_user(email=email, first_name=full_name, password=None) except Exception as e: capture_exception(e) message = "Account unable to be created. This account may already exist. Please try again" " or use different credentials." return redirect(f"/signup/{invite_id}?error_code=unknown&error_detail={message}&source=social_create_user") invite.use(user, prevalidated=True) return user
def social_create_user(strategy: DjangoStrategy, details, backend, request, user=None, *args, **kwargs): if user: return {"is_new": False} user_email = details["email"][0] if isinstance( details["email"], (list, tuple)) else details["email"] user_name = details["fullname"] strategy.session_set("user_name", user_name) strategy.session_set("backend", backend.name) from_invite = False invite_id = strategy.session_get("invite_id") if not invite_id: organization_name = strategy.session_get("organization_name", None) email_opt_in = strategy.session_get("email_opt_in", None) if not organization_name or email_opt_in is None: return redirect(finish_social_signup) serializer = OrganizationSignupSerializer( data={ "organization_name": organization_name, "email_opt_in": email_opt_in, "first_name": user_name, "email": user_email, "password": None, }, context={"request": request}, ) serializer.is_valid(raise_exception=True) user = serializer.save() else: from_invite = True try: invite: Union[ OrganizationInvite, TeamInviteSurrogate] = OrganizationInvite.objects.select_related( "organization", ).get(id=invite_id) except (OrganizationInvite.DoesNotExist, ValidationError): try: invite = TeamInviteSurrogate(invite_id) except Team.DoesNotExist: return redirect( f"/signup/{invite_id}?error_code=invalid_invite&source=social_create_user" ) try: invite.validate(user=None, email=user_email) except exceptions.ValidationError as e: return redirect( f"/signup/{invite_id}?error_code={e.get_codes()[0]}&error_detail={e.args[0]}&source=social_create_user" ) try: user = strategy.create_user(email=user_email, first_name=user_name, password=None) except Exception as e: capture_exception(e) message = "Account unable to be created. This account may already exist. Please try again" " or use different credentials." return redirect( f"/signup/{invite_id}?error_code=unknown&error_detail={message}&source=social_create_user" ) invite.use(user, prevalidated=True) report_user_signed_up( distinct_id=user.distinct_id, is_instance_first_user=User.objects.count() == 1, is_organization_first_user=not from_invite, new_onboarding_enabled=False, backend_processor="social_create_user", social_provider=backend.name, ) return {"is_new": True, "user": user}
def social_create_user(strategy: DjangoStrategy, details, backend, request, user=None, *args, **kwargs): if user: return {"is_new": False} user_email = details["email"][0] if isinstance( details["email"], (list, tuple)) else details["email"] user_name = details["fullname"] strategy.session_set("user_name", user_name) strategy.session_set("backend", backend.name) from_invite = False invite_id = strategy.session_get("invite_id") if not invite_id: company_name = strategy.session_get("company_name", None) email_opt_in = strategy.session_get("email_opt_in", None) if not company_name or email_opt_in is None: return redirect(finish_social_signup) serializer = OrganizationSignupSerializer( data=dict( company_name=company_name, email_opt_in=email_opt_in, first_name=user_name, email=user_email, password=None, ), context={"request": request}, ) serializer.is_valid(raise_exception=True) user = serializer.save() else: from_invite = True try: invite: Union[ OrganizationInvite, TeamInviteSurrogate] = OrganizationInvite.objects.select_related( "organization", ).get(id=invite_id) except (OrganizationInvite.DoesNotExist, ValidationError): try: invite = TeamInviteSurrogate(invite_id) except Team.DoesNotExist: processed = render_to_string( "auth_error.html", {"message": "Invalid invite link!"}, ) return HttpResponse(processed, status=401) try: invite.validate(user=None, email=user_email) except ValueError as e: processed = render_to_string( "auth_error.html", {"message": str(e)}, ) return HttpResponse(processed, status=401) try: user = strategy.create_user(email=user_email, first_name=user_name, password=None) except Exception as e: capture_exception(e) processed = render_to_string( "auth_error.html", { "message": "Account unable to be created. This account may already exist. Please try again or use different credentials!" }, ) return HttpResponse(processed, status=401) invite.use(user, prevalidated=True) report_user_signed_up( distinct_id=user.distinct_id, is_instance_first_user=User.objects.count() == 1, is_organization_first_user=not from_invite, new_onboarding_enabled=False, backend_processor="social_create_user", social_provider=backend.name, ) return {"is_new": True, "user": user}
def social_create_user(strategy: DjangoStrategy, details, backend, request, user=None, *args, **kwargs): if user: return {"is_new": False} backend_processor = "social_create_user" user_email = details["email"][0] if isinstance( details["email"], (list, tuple)) else details["email"] user_name = details["fullname"] or details["username"] strategy.session_set("user_name", user_name) strategy.session_set("backend", backend.name) from_invite = False invite_id = strategy.session_get("invite_id") if not invite_id: domain_organization: Optional[Organization] = None # TODO: This feature is currently available only in self-hosted if not settings.MULTI_TENANCY: # Check if the user is on a whitelisted domain domain = user_email.split("@")[-1] # TODO: Handle multiple organizations with the same whitelisted domain domain_organization = Organization.objects.filter( domain_whitelist__contains=[domain]).first() if domain_organization: backend_processor = "domain_whitelist" user = User.objects.create_and_join( organization=domain_organization, email=user_email, password=None, first_name=user_name) else: organization_name = strategy.session_get("organization_name", None) email_opt_in = strategy.session_get("email_opt_in", None) if not organization_name or email_opt_in is None: return redirect(finish_social_signup) serializer = SignupSerializer( data={ "organization_name": organization_name, "email_opt_in": email_opt_in, "first_name": user_name, "email": user_email, "password": None, }, context={"request": request}, ) serializer.is_valid(raise_exception=True) user = serializer.save() else: from_invite = True try: invite: Union[ OrganizationInvite, TeamInviteSurrogate] = OrganizationInvite.objects.select_related( "organization", ).get(id=invite_id) except (OrganizationInvite.DoesNotExist, ValidationError): try: invite = TeamInviteSurrogate(invite_id) except Team.DoesNotExist: return redirect( f"/signup/{invite_id}?error_code=invalid_invite&source=social_create_user" ) try: invite.validate(user=None, email=user_email) except exceptions.ValidationError as e: return redirect( f"/signup/{invite_id}?error_code={e.get_codes()[0]}&error_detail={e.args[0]}&source=social_create_user" ) try: user = strategy.create_user(email=user_email, first_name=user_name, password=None) except Exception as e: capture_exception(e) message = "Account unable to be created. This account may already exist. Please try again" " or use different credentials." return redirect( f"/signup/{invite_id}?error_code=unknown&error_detail={message}&source=social_create_user" ) invite.use(user, prevalidated=True) report_user_signed_up( distinct_id=user.distinct_id, is_instance_first_user=User.objects.count() == 1, is_organization_first_user=not from_invite, new_onboarding_enabled=False, backend_processor=backend_processor, social_provider=backend.name, ) return {"is_new": True, "user": user}