[Python-modules-commits] [python-social-auth] 08/131: Added optional 'include_email' query param for Twitter backend.

Wolfgang Borgert debacle at moszumanska.debian.org
Sat Dec 24 15:16:55 UTC 2016


This is an automated email from the git hooks/post-receive script.

debacle pushed a commit to tag v0.2.20
in repository python-social-auth.

commit a21f0548bf2914c41880a1f417c58a4dc7e089bc
Author: strikki <halfstrik at gmail dot com>
Date:   Wed Jan 27 18:20:02 2016 +0300

    Added optional 'include_email' query param for Twitter backend.
---
 docs/backends/twitter.rst             |   5 ++
 social/backends/twitter.py            |   9 ++-
 social/tests/backends/test_twitter.py | 132 ++++++++++++++++++++++++++++++++++
 3 files changed, 143 insertions(+), 3 deletions(-)

diff --git a/docs/backends/twitter.rst b/docs/backends/twitter.rst
index e40c413..6fcedd8 100644
--- a/docs/backends/twitter.rst
+++ b/docs/backends/twitter.rst
@@ -20,6 +20,10 @@ To enable Twitter these two keys are needed. Further documentation at
   Client type instead of the Browser. Almost any dummy value will work if
   you plan some test.
 
+- You can request user's Email address by setting (consult `Twitter verify credentials`_)::
+
+      SOCIAL_AUTH_TWITTER_INCLUDE_EMAIL = True
+
 Twitter usually fails with a 401 error when trying to call the request-token
 URL, this is usually caused by server datetime errors (check miscellaneous
 section). Installing ``ntp`` and syncing the server date with some pool does
@@ -27,3 +31,4 @@ the trick.
 
 .. _Twitter development resources: http://dev.twitter.com/pages/auth
 .. _Twitter App Creation: http://twitter.com/apps/new
+.. _Twitter verify credentials: https://dev.twitter.com/rest/reference/get/account/verify_credentials
\ No newline at end of file
diff --git a/social/backends/twitter.py b/social/backends/twitter.py
index c41f15a..20d06fb 100644
--- a/social/backends/twitter.py
+++ b/social/backends/twitter.py
@@ -27,14 +27,17 @@ class TwitterOAuth(BaseOAuth1):
         """Return user details from Twitter account"""
         fullname, first_name, last_name = self.get_user_names(response['name'])
         return {'username': response['screen_name'],
-                'email': '',  # not supplied
+                'email': response.get('email', ''),
                 'fullname': fullname,
                 'first_name': first_name,
                 'last_name': last_name}
 
     def user_data(self, access_token, *args, **kwargs):
         """Return user data provided"""
+        url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
+        if self.setting('INCLUDE_EMAIL', False):
+            url += '?include_email=true'
         return self.get_json(
-            'https://api.twitter.com/1.1/account/verify_credentials.json',
-            auth=self.oauth_auth(access_token)
+                url,
+                auth=self.oauth_auth(access_token)
         )
diff --git a/social/tests/backends/test_twitter.py b/social/tests/backends/test_twitter.py
index 4300237..d4eaef8 100644
--- a/social/tests/backends/test_twitter.py
+++ b/social/tests/backends/test_twitter.py
@@ -129,3 +129,135 @@ class TwitterOAuth1Test(OAuth1Test):
 
     def test_partial_pipeline(self):
         self.do_partial_pipeline()
+
+
+class TwitterOAuth1IncludeEmailTest(OAuth1Test):
+    backend_path = 'social.backends.twitter.TwitterOAuth'
+    user_data_url = 'https://api.twitter.com/1.1/account/' \
+                        'verify_credentials.json?include_email=true'
+    expected_username = 'foobar'
+    access_token_body = json.dumps({
+        'access_token': 'foobar',
+        'token_type': 'bearer'
+    })
+    request_token_body = urlencode({
+        'oauth_token_secret': 'foobar-secret',
+        'oauth_token': 'foobar',
+        'oauth_callback_confirmed': 'true'
+    })
+    user_data_body = json.dumps({
+        'follow_request_sent': False,
+        'profile_use_background_image': True,
+        'id': 10101010,
+        'description': 'Foo bar baz qux',
+        'verified': False,
+        'entities': {
+            'description': {
+                'urls': []
+            }
+        },
+        'profile_image_url_https': 'https://twimg0-a.akamaihd.net/'
+                                   'profile_images/532018826/'
+                                   'n587119531_1939735_9305_normal.jpg',
+        'profile_sidebar_fill_color': '252429',
+        'profile_text_color': '666666',
+        'followers_count': 77,
+        'profile_sidebar_border_color': '181A1E',
+        'location': 'Fooland',
+        'default_profile_image': False,
+        'listed_count': 4,
+        'status': {
+            'favorited': False,
+            'contributors': None,
+            'retweeted_status': {
+                'favorited': False,
+                'contributors': None,
+                'truncated': False,
+                'source': 'web',
+                'text': '"Foo foo foo foo',
+                'created_at': 'Fri Dec 21 18:12:00 +0000 2012',
+                'retweeted': True,
+                'in_reply_to_status_id': None,
+                'coordinates': None,
+                'id': 101010101010101010,
+                'entities': {
+                    'user_mentions': [],
+                    'hashtags': [],
+                    'urls': []
+                },
+                'in_reply_to_status_id_str': None,
+                'place': None,
+                'id_str': '101010101010101010',
+                'in_reply_to_screen_name': None,
+                'retweet_count': 8,
+                'geo': None,
+                'in_reply_to_user_id_str': None,
+                'in_reply_to_user_id': None
+            },
+            'truncated': False,
+            'source': 'web',
+            'text': 'RT @foo: "Foo foo foo foo',
+            'created_at': 'Fri Dec 21 18:24:10 +0000 2012',
+            'retweeted': True,
+            'in_reply_to_status_id': None,
+            'coordinates': None,
+            'id': 101010101010101010,
+            'entities': {
+                'user_mentions': [{
+                    'indices': [3, 10],
+                    'id': 10101010,
+                    'screen_name': 'foo',
+                    'id_str': '10101010',
+                    'name': 'Foo'
+                }],
+                'hashtags': [],
+                'urls': []
+            },
+            'in_reply_to_status_id_str': None,
+            'place': None,
+            'id_str': '101010101010101010',
+            'in_reply_to_screen_name': None,
+            'retweet_count': 8,
+            'geo': None,
+            'in_reply_to_user_id_str': None,
+            'in_reply_to_user_id': None
+        },
+        'utc_offset': -10800,
+        'statuses_count': 191,
+        'profile_background_color': '1A1B1F',
+        'friends_count': 151,
+        'profile_background_image_url_https': 'https://twimg0-a.akamaihd.net/'
+                                              'images/themes/theme9/bg.gif',
+        'profile_link_color': '2FC2EF',
+        'profile_image_url': 'http://a0.twimg.com/profile_images/532018826/'
+                             'n587119531_1939735_9305_normal.jpg',
+        'is_translator': False,
+        'geo_enabled': False,
+        'id_str': '74313638',
+        'profile_background_image_url': 'http://a0.twimg.com/images/themes/'
+                                        'theme9/bg.gif',
+        'screen_name': 'foobar',
+        'lang': 'en',
+        'profile_background_tile': False,
+        'favourites_count': 2,
+        'name': 'Foo',
+        'notifications': False,
+        'url': None,
+        'created_at': 'Tue Sep 15 00:26:17 +0000 2009',
+        'contributors_enabled': False,
+        'time_zone': 'Buenos Aires',
+        'protected': False,
+        'default_profile': False,
+        'following': False,
+        'email': 'foo at bar.bas'
+    })
+
+    def test_login(self):
+        self.strategy.set_settings({
+            'SOCIAL_AUTH_TWITTER_INCLUDE_EMAIL': True
+        })
+        user = self.do_login()
+        self.assertEquals(user.email, 'foo at bar.bas')
+
+    def test_partial_pipeline(self):
+        self.do_partial_pipeline()

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-social-auth.git



More information about the Python-modules-commits mailing list