diff --git a/allauth/socialaccount/providers/edmodo/__init__.py b/allauth/socialaccount/providers/edmodo/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/allauth/socialaccount/providers/edmodo/models.py b/allauth/socialaccount/providers/edmodo/models.py new file mode 100644 index 0000000000..6b20219993 --- /dev/null +++ b/allauth/socialaccount/providers/edmodo/models.py @@ -0,0 +1 @@ +# Create your models here. diff --git a/allauth/socialaccount/providers/edmodo/provider.py b/allauth/socialaccount/providers/edmodo/provider.py new file mode 100644 index 0000000000..6241532a88 --- /dev/null +++ b/allauth/socialaccount/providers/edmodo/provider.py @@ -0,0 +1,36 @@ +from allauth.socialaccount import providers +from allauth.socialaccount.providers.base import ProviderAccount +from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider + + +class EdmodoAccount(ProviderAccount): + def get_profile_url(self): + return self.account.extra_data.get('profile_url') + + def get_avatar_url(self): + return self.account.extra_data.get('avatar_url') + + +class EdmodoProvider(OAuth2Provider): + id = 'edmodo' + name = 'Edmodo' + package = 'allauth.socialaccount.providers.edmodo' + account_class = EdmodoAccount + + def get_default_scope(self): + return ['basic'] + + def extract_uid(self, data): + return str(data['id']) + + def extract_common_fields(self, data): + return dict(first_name=data.get('first_name'), + last_name=data.get('last_name'), + email=data.get('email', '')) + + def extract_extra_data(self, data): + return dict(user_type=data.get('type'), + profile_url=data.get('url'), + avatar_url=data.get('avatars').get('large')) + +providers.registry.register(EdmodoProvider) diff --git a/allauth/socialaccount/providers/edmodo/tests.py b/allauth/socialaccount/providers/edmodo/tests.py new file mode 100644 index 0000000000..0e05bf9e72 --- /dev/null +++ b/allauth/socialaccount/providers/edmodo/tests.py @@ -0,0 +1,38 @@ +from allauth.socialaccount.tests import create_oauth2_tests +from allauth.tests import MockedResponse +from allauth.socialaccount.providers import registry + +from .provider import EdmodoProvider + + +class EdmodoTests(create_oauth2_tests(registry.by_id(EdmodoProvider.id))): + def get_mocked_response(self): + return MockedResponse(200, """ +{ + "url": "https://api.edmodo.com/users/74721257", + "id": 74721257, + "type": "teacher", + "username": "getacclaim-teacher1", + "user_title": null, + "first_name": "Edmodo Test", + "last_name": "Teacher", + "time_zone": "America/New_York", + "utc_offset": -18000, + "locale": "en", + "gender": null, + "start_level": null, + "end_level": null, + "about": null, + "premium": false, + "school": {"url": "https://api.edmodo.com/schools/559253", "id": 559253}, + "verified_institution_member": true, + "coppa_verified": false, + "subjects": null, + "avatars": { + "small": "https://api.edmodo.com/users/74721257/avatar?type=small&u=670329ncqnf8fxv7tya24byn5", + "large": "https://api.edmodo.com/users/74721257/avatar?type=large&u=670329ncqnf8fxv7tya24byn5" + }, + "email":"test@example.com", + "sync_enabled": false +} +""") diff --git a/allauth/socialaccount/providers/edmodo/urls.py b/allauth/socialaccount/providers/edmodo/urls.py new file mode 100644 index 0000000000..458d195b26 --- /dev/null +++ b/allauth/socialaccount/providers/edmodo/urls.py @@ -0,0 +1,4 @@ +from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns +from .provider import EdmodoProvider + +urlpatterns = default_urlpatterns(EdmodoProvider) diff --git a/allauth/socialaccount/providers/edmodo/views.py b/allauth/socialaccount/providers/edmodo/views.py new file mode 100644 index 0000000000..737ea62e61 --- /dev/null +++ b/allauth/socialaccount/providers/edmodo/views.py @@ -0,0 +1,26 @@ +import requests + +from allauth.socialaccount.providers.oauth2.views import (OAuth2Adapter, + OAuth2LoginView, + OAuth2CallbackView) +from allauth.socialaccount.providers import registry + +from .provider import EdmodoProvider + + +class EdmodoOAuth2Adapter(OAuth2Adapter): + provider_id = EdmodoProvider.id + access_token_url = 'https://api.edmodo.com/oauth/token' + authorize_url = 'https://api.edmodo.com/oauth/authorize' + profile_url = 'https://api.edmodo.com/users/me' + + def complete_login(self, request, app, token, **kwargs): + resp = requests.get(self.profile_url, + params={'access_token': token.token}) + extra_data = resp.json() + return self.get_provider().sociallogin_from_response(request, + extra_data) + + +oauth2_login = OAuth2LoginView.adapter_view(EdmodoOAuth2Adapter) +oauth2_callback = OAuth2CallbackView.adapter_view(EdmodoOAuth2Adapter) diff --git a/docs/installation.rst b/docs/installation.rst index f5a8efe847..0333ffaec3 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -62,6 +62,7 @@ settings.py (Important - Please note 'django.contrib.sites' is required as INSTA 'allauth.socialaccount.providers.coinbase', 'allauth.socialaccount.providers.dropbox', 'allauth.socialaccount.providers.dropbox_oauth2', + 'allauth.socialaccount.providers.edmodo', 'allauth.socialaccount.providers.evernote', 'allauth.socialaccount.providers.facebook', 'allauth.socialaccount.providers.flickr', diff --git a/docs/overview.rst b/docs/overview.rst index 5630cf6e7a..f9723608ce 100644 --- a/docs/overview.rst +++ b/docs/overview.rst @@ -43,6 +43,8 @@ Supported Providers - Dropbox (OAuth, OAuth2) +- Edmodo (OAuth2) + - Evernote (OAuth) - Facebook (both OAuth2 and JS SDK) diff --git a/docs/providers.rst b/docs/providers.rst index b53f82fdf5..05d94815f7 100644 --- a/docs/providers.rst +++ b/docs/providers.rst @@ -56,6 +56,25 @@ The Baidu OAuth2 authentication documentation: http://developer.baidu.com/wiki/index.php?title=docs/oauth/rest/file_data_apis_lista +Edmodo +------ + +The Edmodo OAuth2 documentation: + + https://developers.edmodo.com/edmodo-connect/edmodo-connect-overview-getting-started/ + +You can optionally specify additional permissions to use. If no `SCOPE` value +is set, the Edmodo provider will use `basic` by default.:: + + SOCIALACCOUNT_PROVIDERS = { + 'edmodo': { + 'SCOPE': ['basic', 'read_groups', 'read_connections', + 'read_user_email', 'create_messages', + 'write_library_items'] + } + } + + Evernote ---------- diff --git a/test_settings.py b/test_settings.py index e983f78d4b..3df9139315 100644 --- a/test_settings.py +++ b/test_settings.py @@ -75,6 +75,7 @@ 'allauth.socialaccount.providers.douban', 'allauth.socialaccount.providers.dropbox', 'allauth.socialaccount.providers.dropbox_oauth2', + 'allauth.socialaccount.providers.edmodo', 'allauth.socialaccount.providers.evernote', 'allauth.socialaccount.providers.feedly', 'allauth.socialaccount.providers.facebook',