This commit is contained in:
Iliyan Angelov
2025-09-14 23:24:25 +03:00
commit c67067a2a4
71311 changed files with 6800714 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
from allauth.socialaccount.providers.base import ProviderAccount
from allauth.socialaccount.providers.oauth.provider import OAuthProvider
class FlickrAccount(ProviderAccount):
def get_profile_url(self):
return self.account.extra_data.get("person").get("profileurl").get("_content")
def get_avatar_url(self):
return self.account.extra_data.get("picture-url")
def to_str(self):
dflt = super(FlickrAccount, self).to_str()
# Try to use name if it exists. If there is no name, the Flickr API
# returns an empty string.
name = (
self.account.extra_data.get("person").get("realname").get("_content", None)
)
if name:
return name
# Default to username if name does not exist.
return (
self.account.extra_data.get("person").get("username").get("_content", dflt)
)
class FlickrProvider(OAuthProvider):
id = "flickr"
name = "Flickr"
account_class = FlickrAccount
def get_default_scope(self):
scope = []
return scope
def get_auth_params(self, request, action):
ret = super(FlickrProvider, self).get_auth_params(request, action)
if "perms" not in ret:
ret["perms"] = "read"
return ret
def get_profile_fields(self):
default_fields = [
"id",
"first-name",
"last-name",
"email-address",
"picture-url",
"public-profile-url",
]
fields = self.get_settings().get("PROFILE_FIELDS", default_fields)
return fields
def extract_uid(self, data):
return data["person"]["nsid"]
def extract_common_fields(self, data):
person = data.get("person", {})
name = person.get("realname", {}).get("_content")
username = person.get("username", {}).get("_content")
return dict(email=data.get("email-address"), name=name, username=username)
provider_classes = [FlickrProvider]

View File

@@ -0,0 +1,109 @@
# -*- coding: utf-8 -*-
from allauth.socialaccount.tests import OAuthTestsMixin
from allauth.tests import MockedResponse, TestCase
from .provider import FlickrProvider
class FlickrTests(OAuthTestsMixin, TestCase):
provider_id = FlickrProvider.id
def get_mocked_response(self):
#
return [
MockedResponse(
200,
r"""
{"stat": "ok",
"user": {
"username": {
"_content": "pennersr"},
"id": "12345678@N00"}}
""",
), # noqa
MockedResponse(
200,
r"""
{"person": {"username": {"_content": "pennersr"}, "photosurl": {"_content":
"http://www.flickr.com/photos/12345678@N00/"},
"nsid": "12345678@N00",
"path_alias": null, "photos": {"count": {"_content": 0},
"firstdatetaken": {"_content": null}, "views": {"_content": "28"},
"firstdate": {"_content": null}}, "iconserver": "0",
"description": {"_content": ""}, "mobileurl": {"_content":
"http://m.flickr.com/photostream.gne?id=6294613"},
"profileurl": {
"_content": "http://www.flickr.com/people/12345678@N00/"},
"mbox_sha1sum": {"_content":
"5e5b359c123e54f95236209c8808d607a5cdd21e"},
"ispro": 0, "location": {"_content": ""},
"id": "12345678@N00",
"realname": {"_content": "raymond penners"},
"iconfarm": 0}, "stat": "ok"}
""",
),
] # noqa
def test_login(self):
account = super(FlickrTests, self).test_login()
f_account = account.get_provider_account()
self.assertEqual(account.user.first_name, "raymond")
self.assertEqual(account.user.last_name, "penners")
self.assertEqual(
f_account.get_profile_url(),
"http://www.flickr.com/people/12345678@N00/",
)
self.assertEqual(f_account.to_str(), "raymond penners")
class FlickrWithoutRealNameTests(OAuthTestsMixin, TestCase):
"""Separate test for Flickr accounts without real names"""
provider_id = FlickrProvider.id
def get_mocked_response(self):
#
return [
MockedResponse(
200,
r"""
{"stat": "ok",
"user": {
"username": {
"_content": "pennersr"},
"id": "12345678@N00"}}
""",
), # noqa
MockedResponse(
200,
r"""
{"person": {"username": {"_content": "pennersr"}, "photosurl": {"_content":
"http://www.flickr.com/photos/12345678@N00/"},
"nsid": "12345678@N00",
"path_alias": null, "photos": {"count": {"_content": 0},
"firstdatetaken": {"_content": null}, "views": {"_content": "28"},
"firstdate": {"_content": null}}, "iconserver": "0",
"description": {"_content": ""}, "mobileurl": {"_content":
"http://m.flickr.com/photostream.gne?id=6294613"},
"profileurl": {
"_content": "http://www.flickr.com/people/12345678@N00/"},
"mbox_sha1sum": {"_content":
"5e5b359c123e54f95236209c8808d607a5cdd21e"},
"ispro": 0, "location": {"_content": ""},
"id": "12345678@N00",
"realname": {"_content": ""},
"iconfarm": 0}, "stat": "ok"}
""",
),
] # noqa
def test_login(self):
account = super(FlickrWithoutRealNameTests, self).test_login()
f_account = account.get_provider_account()
self.assertEqual(account.user.first_name, "")
self.assertEqual(account.user.last_name, "")
self.assertEqual(
f_account.get_profile_url(),
"http://www.flickr.com/people/12345678@N00/",
)
self.assertEqual(f_account.to_str(), "pennersr")

View File

@@ -0,0 +1,6 @@
from allauth.socialaccount.providers.oauth.urls import default_urlpatterns
from .provider import FlickrProvider
urlpatterns = default_urlpatterns(FlickrProvider)

View File

@@ -0,0 +1,44 @@
import json
from django.utils.http import urlencode
from allauth.socialaccount.providers.oauth.client import OAuth
from allauth.socialaccount.providers.oauth.views import (
OAuthAdapter,
OAuthCallbackView,
OAuthLoginView,
)
from .provider import FlickrProvider
class FlickrAPI(OAuth):
api_url = "https://api.flickr.com/services/rest"
def get_user_info(self):
default_params = {"nojsoncallback": "1", "format": "json"}
p = dict({"method": "flickr.test.login"}, **default_params)
u = json.loads(self.query(self.api_url + "?" + urlencode(p)))
p = dict(
{"method": "flickr.people.getInfo", "user_id": u["user"]["id"]},
**default_params,
)
user = json.loads(self.query(self.api_url + "?" + urlencode(p)))
return user
class FlickrOAuthAdapter(OAuthAdapter):
provider_id = FlickrProvider.id
request_token_url = "http://www.flickr.com/services/oauth/request_token"
access_token_url = "http://www.flickr.com/services/oauth/access_token"
authorize_url = "http://www.flickr.com/services/oauth/authorize"
def complete_login(self, request, app, token, response):
client = FlickrAPI(request, app.client_id, app.secret, self.request_token_url)
extra_data = client.get_user_info()
return self.get_provider().sociallogin_from_response(request, extra_data)
oauth_login = OAuthLoginView.adapter_view(FlickrOAuthAdapter)
oauth_callback = OAuthCallbackView.adapter_view(FlickrOAuthAdapter)