def associate_facebook_account(user, facebook_access_token, request=None): try: fb_user = FacebookUser.get_or_create_from_access_token(facebook_access_token, request=request) except GraphAPIError as e: papertrail.debug(u'GraphAPIError inside associate_facebook_account: {} (user: {}, token: {})'.format(e.message, user.username, facebook_access_token)) raise ServiceError(_("There appears to be an issue communicating with Facebook. Please try again.")) try: existing_fb_user = user.facebookuser if existing_fb_user.fb_uid == fb_user.fb_uid: return existing_fb_user.user = None existing_fb_user.save() except FacebookUser.DoesNotExist: pass fb_user.user = user fb_user.save() @bgwork.defer def notify_friends(): fb_user.notify_friends_of_signup(facebook_access_token) fb_user.respond_to_apprequest_invites(facebook_access_token)
def call(self, endpoint, params, method='GET'): try: session = self.twitter.get_session((self.access_token, self.access_token_secret)) r = session.request(method, TWITTER_API_URL + endpoint, params=params) json = r.json() # https://dev.twitter.com/docs/rate-limiting/1.1 if 'errors' in json: errors = json['errors'] status_code = r.status_code if status_code == 429 and 88 in [e['code'] for e in errors]: raise TwitterRateLimitError() if r.status_code == 401: papertrail.debug(u'InvalidTwitterAccessToken error for endpoint {} with JSON response: {}'.format(endpoint, json.__repr__().replace('\n', ' '))) raise InvalidTwitterAccessToken() r.raise_for_status() return json except requests.exceptions.HTTPError as e: try: json = e.response.json() if _contains_error(json, 187): raise TwitterDuplicateStatusError() elif _contains_error(json, 64): raise TwitterAccountSuspendedError() raise TwitterError() except ValueError: raise TwitterError()
def associate_facebook_account(user, facebook_access_token, request=None): try: fb_user = FacebookUser.get_or_create_from_access_token( facebook_access_token, request=request) except GraphAPIError as e: papertrail.debug( u'GraphAPIError inside associate_facebook_account: {} (user: {}, token: {})' .format(e.message, user.username, facebook_access_token)) raise ServiceError( _("There appears to be an issue communicating with Facebook. Please try again." )) try: existing_fb_user = user.facebookuser if existing_fb_user.fb_uid == fb_user.fb_uid: return existing_fb_user.user = None existing_fb_user.save() except FacebookUser.DoesNotExist: pass fb_user.user = user fb_user.save() @bgwork.defer def notify_friends(): fb_user.notify_friends_of_signup(facebook_access_token) fb_user.respond_to_apprequest_invites(facebook_access_token)
def call(self, endpoint, params, method='GET'): try: session = self.twitter.get_session( (self.access_token, self.access_token_secret)) r = session.request(method, TWITTER_API_URL + endpoint, params=params) json = r.json() # https://dev.twitter.com/docs/rate-limiting/1.1 if 'errors' in json: errors = json['errors'] status_code = r.status_code if status_code == 429 and 88 in [e['code'] for e in errors]: raise TwitterRateLimitError() if r.status_code == 401: papertrail.debug( u'InvalidTwitterAccessToken error for endpoint {} with JSON response: {}' .format(endpoint, json.__repr__().replace('\n', ' '))) raise InvalidTwitterAccessToken() r.raise_for_status() return json except requests.exceptions.HTTPError as e: try: json = e.response.json() if _contains_error(json, 187): raise TwitterDuplicateStatusError() elif _contains_error(json, 64): raise TwitterAccountSuspendedError() raise TwitterError() except ValueError: raise TwitterError()
def facebook_share_pre_post(request, facebook_access_token): if not facebook_access_token: raise ServiceError( "Can't share to your timeline if you haven't signed into Facebook yet." ) facebook_share = True try: associate_facebook_account(request.user, facebook_access_token, request=request) except ServiceError: papertrail.debug( u'associate_facebook_account failed inside facebook_share_pre_post: (user: {}, token: {}), raising InvalidFacebookAccessToken' .format(request.user.username, facebook_access_token)) facebook_share = False Metrics.facebook_error_during_publish.record(request) if request.app_version != '1.0.1': try: permissions = GraphAPI(facebook_access_token).get_object( 'me/permissions')['data'][0] except GraphAPIError as e: papertrail.debug( u'me/permissions failed inside facebook_share_pre_post: {} (user: {}, token: {}), raising InvalidFacebookAccessToken' .format(e.message, request.user.username, facebook_access_token)) raise InvalidFacebookAccessToken( "Invalid Facebook access token, please re-auth with Facebook.") except IOError as e: papertrail.debug( u'me/permissions failed inside facebook_share_pre_post with IOError: {} (user: {}), disabling facebook_share' .format(e.message, request.user.username)) facebook_share = False else: if permissions.get('installed') != 1 or permissions.get( 'publish_actions') != 1: papertrail.debug( u'me/permissions failed inside facebook_share_pre_post because insufficient permissions (user: {}), disabling facebook_share' .format(request.user.username)) facebook_share = False Metrics.facebook_insufficient_permissions_during_publish.record( request) return facebook_share
def facebook_share_pre_post(request, facebook_access_token): if not facebook_access_token: raise ServiceError("Can't share to your timeline if you haven't signed into Facebook yet.") facebook_share = True try: associate_facebook_account(request.user, facebook_access_token, request=request) except ServiceError: papertrail.debug( u"associate_facebook_account failed inside facebook_share_pre_post: (user: {}, token: {}), raising InvalidFacebookAccessToken".format( request.user.username, facebook_access_token ) ) facebook_share = False Metrics.facebook_error_during_publish.record(request) if request.app_version != "1.0.1": try: permissions = GraphAPI(facebook_access_token).get_object("me/permissions")["data"][0] except GraphAPIError as e: papertrail.debug( u"me/permissions failed inside facebook_share_pre_post: {} (user: {}, token: {}), raising InvalidFacebookAccessToken".format( e.message, request.user.username, facebook_access_token ) ) raise InvalidFacebookAccessToken("Invalid Facebook access token, please re-auth with Facebook.") except IOError as e: papertrail.debug( u"me/permissions failed inside facebook_share_pre_post with IOError: {} (user: {}), disabling facebook_share".format( e.message, request.user.username ) ) facebook_share = False else: if permissions.get("installed") != 1 or permissions.get("publish_actions") != 1: papertrail.debug( u"me/permissions failed inside facebook_share_pre_post because insufficient permissions (user: {}), disabling facebook_share".format( request.user.username ) ) facebook_share = False Metrics.facebook_insufficient_permissions_during_publish.record(request) return facebook_share