Search code examples
djangopython-3.xdjango-allauth

DJANGO ALL AUTHEMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL


I am trying to have two different redirects...one for normal login and another for redirect after email confirmation

ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = '/profile' 
LOGIN_REDIRECT_URL = '/'

But when I enable login, AUTHENTICATED REDIRECT goes to LOGIN_REDIRECT but when I disable Login it goes to the EMAIL_CONFIRMATION_REDIRECT route.

When I try printing the adapter settings for email_confirmation redirect url below it shows only the LOGIN_REDIRECT

def get_email_confirmation_redirect_url(self, request): 
    """ The URL to return to after successful e-mail confirmation. """ 

    if request.user.is_authenticated: 
     if app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL: 
       return \ 
       app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL 
     else: 
      return self.get_login_redirect_url(request) 
    else: 
     return app_settings.EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL

I tried overriding this get_email_confirmation_redirect_url in the adapter but still wont work. It is not picking the REDIRECT before I login and reverify.


Solution

  • Since ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = '/profile' was not working if the user is not logged in, I decided to override DefaultAccountAdapter in Django Allauth. My login was that if the time the user joined the app and the time logged in exceeds a certain threshold, then the redirection would be different. So I created an adapter in my users app as below:

    class AccountAdapter(DefaultAccountAdapter):
    
      def get_login_redirect_url(self, request):
        expiry = 90 #seconds
    
        assert request.user.is_authenticated
        if (request.user.last_login - request.user.date_joined).seconds < expiry:
            url = 'profile/'
        else:
            url = settings.LOGIN_REDIRECT_URL
        return resolve_url(url)
    

    I then passed this adapter in my settings.py