60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
"""
|
|
Views for PatreonProvider
|
|
https://www.patreon.com/platform/documentation/oauth
|
|
"""
|
|
|
|
import requests
|
|
|
|
from allauth.socialaccount.providers.oauth2.views import (
|
|
OAuth2Adapter,
|
|
OAuth2CallbackView,
|
|
OAuth2LoginView,
|
|
)
|
|
|
|
from .provider import API_URL, USE_API_V2, PatreonProvider
|
|
|
|
|
|
class PatreonOAuth2Adapter(OAuth2Adapter):
|
|
provider_id = PatreonProvider.id
|
|
access_token_url = "https://www.patreon.com/api/oauth2/token"
|
|
authorize_url = "https://www.patreon.com/oauth2/authorize"
|
|
profile_url = "{0}/{1}".format(
|
|
API_URL,
|
|
"identity?include=memberships&fields%5Buser%5D=email,first_name,"
|
|
"full_name,image_url,last_name,social_connections,"
|
|
"thumb_url,url,vanity"
|
|
if USE_API_V2
|
|
else "current_user",
|
|
)
|
|
|
|
def complete_login(self, request, app, token, **kwargs):
|
|
resp = requests.get(
|
|
self.profile_url,
|
|
headers={"Authorization": "Bearer " + token.token},
|
|
)
|
|
extra_data = resp.json().get("data")
|
|
|
|
if USE_API_V2:
|
|
# Extract tier/pledge level for Patreon API v2:
|
|
try:
|
|
member_id = extra_data["relationships"]["memberships"]["data"][0]["id"]
|
|
member_url = (
|
|
"{0}/members/{1}?include="
|
|
"currently_entitled_tiers&fields%5Btier%5D=title"
|
|
).format(API_URL, member_id)
|
|
resp_member = requests.get(
|
|
member_url,
|
|
headers={"Authorization": "Bearer " + token.token},
|
|
)
|
|
pledge_title = resp_member.json()["included"][0]["attributes"]["title"]
|
|
extra_data["pledge_level"] = pledge_title
|
|
except (KeyError, IndexError):
|
|
extra_data["pledge_level"] = None
|
|
pass
|
|
|
|
return self.get_provider().sociallogin_from_response(request, extra_data)
|
|
|
|
|
|
oauth2_login = OAuth2LoginView.adapter_view(PatreonOAuth2Adapter)
|
|
oauth2_callback = OAuth2CallbackView.adapter_view(PatreonOAuth2Adapter)
|