def send(self, graph=None, shared_explicitly=False): result = None # update the last attempt self.last_attempt = datetime.now() self.save() # see if the graph is enabled profile = try_get_profile(self.user) user_or_profile = get_instance_for_attribute( self.user, profile, 'access_token') graph = graph or user_or_profile.get_offline_graph() user_enabled = shared_explicitly or \ (user_or_profile.facebook_open_graph and self.facebook_user_id) # start sharing if graph and user_enabled: graph_location = '%s/%s' % ( self.facebook_user_id, self.action_domain) share_dict = self.get_share_dict() from open_facebook.exceptions import OpenFacebookException try: result = graph.set(graph_location, **share_dict) share_id = result.get('id') if not share_id: error_message = 'No id in Facebook response, found %s for url %s with data %s' % ( result, graph_location, share_dict) logger.error(error_message) raise OpenFacebookException(error_message) self.share_id = share_id self.error_message = None self.completed_at = datetime.now() self.save() except OpenFacebookException as e: logger.warn( 'Open graph share failed, writing message %s' % str(e)) self.error_message = repr(e) self.save() # maybe we need a new access token new_token_required = self.exception_requires_new_token( e, graph) # verify that the token didnt change in the mean time user_or_profile = user_or_profile.__class__.objects.get( id=user_or_profile.id) token_changed = graph.access_token != user_or_profile.access_token logger.info('new token required is %s and token_changed is %s', new_token_required, token_changed) if new_token_required and not token_changed: logger.info( 'a new token is required, setting the flag on the user or profile') # time to ask the user for a new token update_user_attributes(self.user, profile, dict( new_token_required=True), save=True) elif not graph: self.error_message = 'no graph available' self.save() elif not user_enabled: self.error_message = 'user not enabled' self.save() return result
def test_follow_og_share_error(self): from django_facebook.models import OpenGraphShare user_url = 'http://www.fashiolista.com/style/neni/' kwargs = dict(item=user_url) user = get_user_model().objects.all()[:1][0] profile = try_get_profile(user) user_or_profile = get_instance_for_attribute( user, profile, 'facebook_open_graph') user_or_profile.facebook_open_graph = True user_or_profile.save() from django.contrib.contenttypes.models import ContentType some_content_type = ContentType.objects.all()[:1][0] share = OpenGraphShare.objects.create( user_id=user.id, facebook_user_id=13123123, action_domain='fashiolista:follow', content_type=some_content_type, object_id=user.id, ) share.set_share_dict(kwargs) share.save() from open_facebook.exceptions import FacebookUnreachable with mock.patch('open_facebook.api.OpenFacebook') as mocked: instance = mocked.return_value instance.set = Mock(side_effect=FacebookUnreachable('broken')) share.send(graph=instance) self.assertEqual(share.error_message, 'broken') self.assertFalse(share.completed_at)
def send(self, graph=None, shared_explicitly=False): result = None # update the last attempt self.last_attempt = datetime.now() self.save() # see if the graph is enabled profile = try_get_profile(self.user) user_or_profile = get_instance_for_attribute( self.user, profile, 'access_token') graph = graph or user_or_profile.get_offline_graph() user_enabled = shared_explicitly or \ (user_or_profile.facebook_open_graph and self.facebook_user_id) # start sharing if graph and user_enabled: graph_location = '%s/%s' % ( self.facebook_user_id, self.action_domain) share_dict = self.get_share_dict() from open_facebook.exceptions import OpenFacebookException try: result = graph.set(graph_location, **share_dict) share_id = result.get('id') if not share_id: error_message = 'No id in Facebook response, found %s for url %s with data %s' % ( result, graph_location, share_dict) logging.error(error_message) raise OpenFacebookException(error_message) self.share_id = share_id self.error_message = None self.completed_at = datetime.now() self.save() except OpenFacebookException as e: logging.warn( 'Open graph share failed, writing message %s' % str(e)) self.error_message = repr(e) self.save() # maybe we need a new access token new_token_required = self.exception_requires_new_token( e, graph) # verify that the token didnt change in the mean time user_or_profile = user_or_profile.__class__.objects.get( id=user_or_profile.id) token_changed = graph.access_token != user_or_profile.access_token logging.info('new token required is %s and token_changed is %s', new_token_required, token_changed) if new_token_required and not token_changed: logging.info( 'a new token is required, setting the flag on the user or profile') # time to ask the user for a new token update_user_attributes(self.user, profile, dict( new_token_required=True), save=True) elif not graph: self.error_message = 'no graph available' self.save() elif not user_enabled: self.error_message = 'user not enabled' self.save() return result
def test_follow_og_share_error(self): user_url = 'http://www.fashiolista.com/style/neni/' kwargs = dict(item=user_url) user = get_user_model().objects.all()[:1][0] profile = try_get_profile(user) user_or_profile = get_instance_for_attribute( user, profile, 'facebook_open_graph') user_or_profile.facebook_open_graph = True user_or_profile.save() some_content_type = ContentType.objects.all()[:1][0] share = OpenGraphShare.objects.create( user_id=user.id, facebook_user_id=13123123, action_domain='fashiolista:follow', content_type=some_content_type, object_id=user.id, ) share.set_share_dict(kwargs) share.save() update_user_attributes(user, profile, dict(new_token_required=False)) from open_facebook.exceptions import FacebookUnreachable, OAuthException with mock.patch('open_facebook.api.OpenFacebook') as mocked: instance = mocked.return_value instance.set = Mock(side_effect=FacebookUnreachable('broken')) share.send(graph=instance) self.assertEqual(share.error_message, 'broken') self.assertFalse(share.completed_at) user = get_user_model().objects.get(id=user.id) if profile: profile = get_profile_model().objects.get(id=profile.id) new_token_required = get_user_attribute( user, profile, 'new_token_required') self.assertEqual(new_token_required, False) # now try with an oauth exception return # Can't figure out how to test this with mock.patch('open_facebook.api.OpenFacebook') as mocked: instance = mocked.return_value instance.set = Mock(side_effect=OAuthException('permissions')) share.send(graph=instance) self.assertEqual(share.error_message, 'permissions') self.assertFalse(share.completed_at) user = get_user_model().objects.get(id=user.id) if profile: profile = get_profile_model().objects.get(id=profile.id) new_token_required = get_user_attribute( user, profile, 'new_token_required') self.assertEqual(new_token_required, True)
def remove(self, graph=None): if not self.share_id: raise ValueError('Can only delete shares which have an id') # see if the graph is enabled profile = try_get_profile(self.user) user_or_profile = get_instance_for_attribute( self.user, profile, 'access_token') graph = graph or user_or_profile.get_offline_graph() response = None if graph: response = graph.delete(self.share_id) self.removed_at = datetime.now() self.save() return response
def update(self, data, graph=None): ''' Update the share with the given data ''' profile = try_get_profile(self.user) user_or_profile = get_instance_for_attribute( self.user, profile, 'access_token') graph = graph or user_or_profile.get_offline_graph() # update the share dict so a retry will do the right thing # just in case we fail the first time shared = self.update_share_dict(data) self.save() # broadcast the change to facebook if self.share_id: return graph.set(self.share_id, **shared)
def disconnect(request): ''' Removes Facebook from the users profile And redirects to the specified next page ''' if request.method == 'POST': messages.info( request, _("You have disconnected your Facebook profile.")) user = request.user profile = try_get_profile(user) user_or_profile = get_instance_for_attribute(user, profile, 'access_token') user_or_profile.disconnect_facebook() user_or_profile.save() response = next_redirect(request) return response
def _update_access_token(user, graph): """ Conditionally updates the access token in the database """ profile = try_get_profile(user) model_or_profile = get_instance_for_attribute(user, profile, "access_token") # store the access token for later usage if the profile model supports it if model_or_profile: # update if not equal to the current token new_token = graph.access_token != model_or_profile.access_token token_message = "a new" if new_token else "the same" logger.info("found %s token %s", token_message, graph.access_token[:10]) if new_token: logger.info("access token changed, updating now") model_or_profile.update_access_token(graph.access_token) model_or_profile.save() # see if we can extend the access token # this runs in a task, after extending the token we fire an event model_or_profile.extend_access_token()
def _update_access_token(user, graph): ''' Conditionally updates the access token in the database ''' profile = try_get_profile(user) model_or_profile = get_instance_for_attribute(user, profile, 'access_token') # store the access token for later usage if the profile model supports it if model_or_profile: # update if not equal to the current token new_token = graph.access_token != model_or_profile.access_token token_message = 'a new' if new_token else 'the same' logger.info('found %s token', token_message) if new_token: logger.info('access token changed, updating now') model_or_profile.access_token = graph.access_token model_or_profile.save() # see if we can extend the access token # this runs in a task, after extending the token we fire an event model_or_profile.extend_access_token()
def _update_access_token(user, graph): ''' Conditionally updates the access token in the database ''' profile = try_get_profile(user) model_or_profile = get_instance_for_attribute( user, profile, 'access_token') # store the access token for later usage if the profile model supports it if model_or_profile: # update if not equal to the current token new_token = graph.access_token != model_or_profile.access_token token_message = 'a new' if new_token else 'the same' logger.info('found %s token', token_message) if new_token: logger.info('access token changed, updating now') model_or_profile.access_token = graph.access_token model_or_profile.save() # see if we can extend the access token # this runs in a task, after extending the token we fire an event model_or_profile.extend_access_token()
def test_auth_backend(self): # the auth backend backend = FacebookBackend() facebook = get_facebook_graph(access_token='new_user') action, user = connect_user(self.request, facebook_graph=facebook) facebook_email = user.email profile = try_get_profile(user) user_or_profile = get_instance_for_attribute( user, profile, 'facebook_id') facebook_id = user_or_profile.facebook_id auth_user = backend.authenticate(facebook_email=facebook_email) #I GOT IT WORKING!!!!!!!!!! self.client.login(facebook_email=facebook_email) # response = self.client.get('/login/?testing=True') response = self.client.get('/login/') self.assertTemplateUsed(response, ) template_names = [] for template in response.templates: template_names.append(template.name) print template_names # logger.info('%s %s %s', auth_user.email, user.email, facebook_email) self.assertEqual(auth_user, user) auth_user = backend.authenticate(facebook_id=facebook_id) self.assertEqual(auth_user, user) auth_user = backend.authenticate(facebook_id=facebook_id, facebook_email=facebook_email) self.assertEqual(auth_user, user) auth_user = backend.authenticate() self.assertIsNone(auth_user)
def setUp(self): FacebookTest.setUp(self) user_url = 'http://www.fashiolista.com/style/neni/' kwargs = dict(item=user_url) user = get_user_model().objects.all()[:1][0] profile = try_get_profile(user) user_or_profile = get_instance_for_attribute(user, profile, 'facebook_open_graph') user_or_profile.facebook_open_graph = True user_or_profile.save() some_content_type = ContentType.objects.all()[:1][0] share = OpenGraphShare.objects.create( user_id=user.id, facebook_user_id=13123123, action_domain='fashiolista:follow', content_type=some_content_type, object_id=user.id, ) share.set_share_dict(kwargs) share.save() self.share = share self.share_details = user, profile, share
def test_auth_backend(self): # the auth backend backend = FacebookBackend() facebook = get_facebook_graph(access_token='new_user') action, user = connect_user(self.request, facebook_graph=facebook) facebook_email = user.email profile = try_get_profile(user) user_or_profile = get_instance_for_attribute(user, profile, 'facebook_id') facebook_id = user_or_profile.facebook_id auth_user = backend.authenticate(facebook_email=facebook_email) logger.info('%s %s %s', auth_user.email, user.email, facebook_email) self.assertEqual(auth_user, user) auth_user = backend.authenticate(facebook_id=facebook_id) self.assertEqual(auth_user, user) auth_user = backend.authenticate(facebook_id=facebook_id, facebook_email=facebook_email) self.assertEqual(auth_user, user) auth_user = backend.authenticate() self.assertIsNone(auth_user)
def test_auth_backend(self): # the auth backend backend = FacebookBackend() facebook = get_facebook_graph(access_token='new_user') action, user = connect_user(self.request, facebook_graph=facebook) facebook_email = user.email profile = try_get_profile(user) user_or_profile = get_instance_for_attribute( user, profile, 'facebook_id') facebook_id = user_or_profile.facebook_id auth_user = backend.authenticate(facebook_email=facebook_email) logger.info('%s %s %s', auth_user.email, user.email, facebook_email) self.assertEqual(auth_user, user) auth_user = backend.authenticate(facebook_id=facebook_id) self.assertEqual(auth_user, user) auth_user = backend.authenticate(facebook_id=facebook_id, facebook_email=facebook_email) self.assertEqual(auth_user, user) auth_user = backend.authenticate() self.assertIsNone(auth_user)
def setUp(self): FacebookTest.setUp(self) user_url = 'http://www.fashiolista.com/style/neni/' kwargs = dict(item=user_url) user = get_user_model().objects.all()[:1][0] profile = try_get_profile(user) user_or_profile = get_instance_for_attribute( user, profile, 'facebook_open_graph') user_or_profile.facebook_open_graph = True user_or_profile.save() some_content_type = ContentType.objects.all()[:1][0] share = OpenGraphShare.objects.create( user_id=user.id, facebook_user_id=13123123, action_domain='fashiolista:follow', content_type=some_content_type, object_id=user.id, ) share.set_share_dict(kwargs) share.save() self.share = share self.share_details = user, profile, share
def test_auth_backend(self): # the auth backend backend = FacebookBackend() facebook = get_facebook_graph(access_token='new_user') action, user = connect_user(self.request, facebook_graph=facebook) facebook_email = user.email profile = try_get_profile(user) user_or_profile = get_instance_for_attribute(user, profile, 'facebook_id') facebook_id = user_or_profile.facebook_id auth_user = backend.authenticate(facebook_email=facebook_email) #I GOT IT WORKING!!!!!!!!!! self.client.login(facebook_email=facebook_email) # response = self.client.get('/login/?testing=True') response = self.client.get('/login/') self.assertTemplateUsed(response, ) template_names = [] for template in response.templates: template_names.append(template.name) print template_names # logger.info('%s %s %s', auth_user.email, user.email, facebook_email) self.assertEqual(auth_user, user) auth_user = backend.authenticate(facebook_id=facebook_id) self.assertEqual(auth_user, user) auth_user = backend.authenticate(facebook_id=facebook_id, facebook_email=facebook_email) self.assertEqual(auth_user, user) auth_user = backend.authenticate() self.assertIsNone(auth_user)
def send(self, graph=None): result = None # update the last attempt self.last_attempt = datetime.now() self.save() # see if the graph is enabled profile = try_get_profile(self.user) user_or_profile = get_instance_for_attribute( self.user, profile, 'access_token') graph = graph or user_or_profile.get_offline_graph() user_enabled = user_or_profile.facebook_open_graph and self.facebook_user_id # start sharing if graph and user_enabled: graph_location = '%s/%s' % ( self.facebook_user_id, self.action_domain) share_dict = self.get_share_dict() from open_facebook.exceptions import OpenFacebookException try: result = graph.set(graph_location, **share_dict) share_id = result.get('id') if not share_id: error_message = 'No id in Facebook response, found %s for url %s with data %s' % ( result, graph_location, share_dict) logger.error(error_message) raise OpenFacebookException(error_message) self.share_id = share_id self.error_message = None self.completed_at = datetime.now() self.save() except OpenFacebookException, e: logger.warn( 'Open graph share failed, writing message %s' % e.message) self.error_message = unicode(e) self.save()
def send(self, graph=None): result = None # update the last attempt self.last_attempt = datetime.now() self.save() # see if the graph is enabled profile = try_get_profile(self.user) user_or_profile = get_instance_for_attribute(self.user, profile, 'access_token') graph = graph or user_or_profile.get_offline_graph() user_enabled = user_or_profile.facebook_open_graph and self.facebook_user_id # start sharing if graph and user_enabled: graph_location = '%s/%s' % (self.facebook_user_id, self.action_domain) share_dict = self.get_share_dict() from open_facebook.exceptions import OpenFacebookException try: result = graph.set(graph_location, **share_dict) share_id = result.get('id') if not share_id: error_message = 'No id in Facebook response, found %s for url %s with data %s' % ( result, graph_location, share_dict) logger.error(error_message) raise OpenFacebookException(error_message) self.share_id = share_id self.error_message = None self.completed_at = datetime.now() self.save() except OpenFacebookException, e: logger.warn('Open graph share failed, writing message %s' % e.message) self.error_message = unicode(e) self.save()