1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
import json
from urllib.parse import parse_qs, quote, urlencode, urlparse, urlunparse
from django import shortcuts
from django.core.exceptions import ImproperlyConfigured
from django.http import (
HttpResponseRedirect,
HttpResponseServerError,
QueryDict,
)
from django.urls import NoReverseMatch, reverse
from allauth import app_settings as allauth_settings
def serialize_request(request):
return json.dumps(
{
"path": request.path,
"path_info": request.path_info,
"META": {k: v for k, v in request.META.items() if isinstance(v, str)},
"GET": request.GET.urlencode(),
"POST": request.POST.urlencode(),
"method": request.method,
"scheme": request.scheme,
}
)
def deserialize_request(s, request):
data = json.loads(s)
request.GET = QueryDict(data["GET"])
request.POST = QueryDict(data["POST"])
request.META = data["META"]
request.path = data["path"]
request.path_info = data["path_info"]
request.method = data["method"]
request._get_scheme = lambda: data["scheme"]
return request
def redirect(to):
try:
return shortcuts.redirect(to)
except NoReverseMatch:
return shortcuts.redirect(f"/{to}")
def add_query_params(url, params):
parsed_url = urlparse(url)
query_params = parse_qs(parsed_url.query)
query_params.update(params)
encoded_query = urlencode(query_params, doseq=True)
new_url = urlunparse(
(
parsed_url.scheme,
parsed_url.netloc,
parsed_url.path,
parsed_url.params,
encoded_query,
parsed_url.fragment,
)
)
return new_url
def render_url(request, url_template, **kwargs):
url = url_template
for k, v in kwargs.items():
qi = url.find("?")
ki = url.find("{" + k + "}")
if ki < 0:
raise ImproperlyConfigured(url_template)
is_query_param = qi >= 0 and ki > qi
if is_query_param:
qv = urlencode({"k": v}).partition("k=")[2]
else:
qv = quote(v)
url = url.replace("{" + k + "}", qv)
p = urlparse(url)
if not p.netloc:
url = request.build_absolute_uri(url)
return url
def get_frontend_url(request, urlname, **kwargs):
from allauth import app_settings as allauth_settings
if allauth_settings.HEADLESS_ENABLED:
from allauth.headless import app_settings as headless_settings
url = headless_settings.FRONTEND_URLS.get(urlname)
if allauth_settings.HEADLESS_ONLY and not url:
raise ImproperlyConfigured(f"settings.HEADLESS_FRONTEND_URLS['{urlname}']")
if url:
return render_url(request, url, **kwargs)
return None
def headed_redirect_response(viewname):
"""
In some cases, we're redirecting to a non-headless view. In case of
headless-only mode, that view clearly does not exist.
"""
try:
return HttpResponseRedirect(reverse(viewname))
except NoReverseMatch:
if allauth_settings.HEADLESS_ONLY:
# The response we would be rendering here is not actually used.
return HttpResponseServerError()
raise
|