diff --git a/dandiapi/allauth.py b/dandiapi/allauth.py new file mode 100644 index 000000000..2b57cb775 --- /dev/null +++ b/dandiapi/allauth.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING +from uuid import uuid4 + +from allauth.account.adapter import DefaultAccountAdapter +from allauth.socialaccount.adapter import DefaultSocialAccountAdapter + +if TYPE_CHECKING: + from allauth.socialaccount.models import SocialLogin + from django.contrib.auth.models import User + + +class DandiAccountAdapter(DefaultAccountAdapter): + _USERNAME_SUFFIX = '-dandi' + + def populate_username(self, request, user: User): + # Call the super class in case of potential side effects + super().populate_username(request, user) + user.username = str(uuid4()) + self._USERNAME_SUFFIX + + +class DandiSocialAccountAdapter(DefaultSocialAccountAdapter): + def save_user(self, request, sociallogin: SocialLogin, form=None): + user: User = super().save_user(request, sociallogin, form) + user.username = user.email + user.save() + return user diff --git a/dandiapi/settings.py b/dandiapi/settings.py index 0e87dfc2d..df6b3cf08 100644 --- a/dandiapi/settings.py +++ b/dandiapi/settings.py @@ -137,6 +137,9 @@ def mutate_configuration(configuration: type[ComposedConfiguration]): # Disable github oauth by default ENABLE_GITHUB_OAUTH = False + ACCOUNT_ADAPTER = 'dandiapi.allauth.DandiAccountAdapter' + SOCIALACCOUNT_ADAPTER = 'dandiapi.allauth.DandiSocialAccountAdapter' + class DevelopmentConfiguration(DandiMixin, DevelopmentBaseConfiguration): # This makes pydantic model schema allow URLs with localhost in them.