Source code for users.adapters

"""Custom adapters for :auth:`django-allauth <advanced.html>`."""

from __future__ import annotations

from functools import partial
from typing import TYPE_CHECKING

from django.conf import settings
from django.utils.http import url_has_allowed_host_and_scheme

from allauth.account.adapter import DefaultAccountAdapter
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter

if TYPE_CHECKING:  # pragma: no cover
    from django.http import HttpRequest  # isort:skip
    from allauth.socialaccount.models import SocialAccount  # isort:skip


_is_safe_url = partial(
    url_has_allowed_host_and_scheme,
    allowed_hosts=settings.ALLOWED_HOSTS,
    require_https=settings.SECURE_SSL_REDIRECT
)


[docs]class AccountAdapter(DefaultAccountAdapter): """Adapter for user accounts."""
[docs] def get_login_redirect_url(self, request: HttpRequest) -> str: """ Return the URL to redirect to after a successful login. :param request: The original request. :return: The URL of the redirect. """ url = request.GET.get('next') return url if url and _is_safe_url(url) else '/user'
[docs] def get_logout_redirect_url(self, request: HttpRequest) -> str: """ Return the URL to redirect to after a successful logout. :param request: The original request. :return: The URL of the redirect. """ url = request.POST.get('next') return url if url and _is_safe_url(url) else '/'
[docs]class SocialAccountAdapter(DefaultSocialAccountAdapter): """Adapter for OAuth accounts."""
[docs] def get_connect_redirect_url(self, request: HttpRequest, social_account: SocialAccount) -> str: """ Return the URL to redirect to after a successful connection. :param request: The original request. :param social_account: The connected OAuth account. :return: The URL of the redirect. """ url = request.POST.get('next') or request.GET.get('next') return url if url and _is_safe_url(url) else '/user'
__all__ = ['AccountAdapter', 'SocialAccountAdapter']