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 = self.user.get_profile() graph = graph or profile.get_offline_graph() user_enabled = 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, 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 connect(request): ''' Handles the view logic around connect user - (if authenticated) connect the user - login - register ''' context = RequestContext(request) assert context.get('FACEBOOK_APP_ID'), 'Please specify a facebook app id '\ 'and ensure the context processor is enabled' facebook_login = bool(int(request.REQUEST.get('facebook_login', 0))) if facebook_login: logger.info('trying to connect using facebook') graph = get_persistent_graph(request) if graph: logger.info('found a graph object') facebook = FacebookUserConverter(graph) if facebook.is_authenticated(): logger.info('facebook is authenticated') facebook_data = facebook.facebook_profile_data() #either, login register or connect the user try: action, user = connect_user(request) logger.info('Django facebook performed action: %s', action) except facebook_exceptions.IncompleteProfileError, e: warn_message = u'Incomplete profile data encountered '\ u'with error %s' % e send_warning(warn_message, e=e, facebook_data=facebook_data) context['facebook_mode'] = True context['form'] = e.form return render_to_response( facebook_settings.FACEBOOK_REGISTRATION_TEMPLATE, context_instance=context, ) if action is CONNECT_ACTIONS.CONNECT: messages.info( request, _("You have connected your account " "to %s's facebook profile") % facebook_data['name']) elif action is CONNECT_ACTIONS.REGISTER: return user.get_profile().post_facebook_registration( request) else: if 'attempt' in request.GET: return next_redirect( request, next_key=['error_next', 'next'], additional_params=dict(fb_error_or_cancel=1)) else: logger.info('Facebook authentication needed for connect, ' \ 'raising an error') raise OpenFacebookException('please authenticate') return next_redirect(request)
def require_persistent_graph(request, *args, **kwargs): ''' Just like get_persistent graph, but instead of returning None raise an OpenFacebookException if we can't access facebook ''' graph = get_persistent_graph(request, *args, **kwargs) if not graph: raise OpenFacebookException('please authenticate') return graph
def require_facebook_graph(request, *args, **kwargs): ''' Just like get_facebook graph, but instead of returning None raise an OpenFacebookException if we can't access facebook ''' kwargs['raise_'] = True graph = get_facebook_graph(request, *args, **kwargs) if not graph: logger.info("RFG01 no facebook graph") raise OpenFacebookException('please authenticate') return graph
def connect(request): ''' Handles the view logic around connect user - (if authenticated) connect the user - login - register ''' backend = get_registration_backend() context = RequestContext(request) assert context.get('FACEBOOK_APP_ID'), 'Please specify a facebook app id '\ 'and ensure the context processor is enabled' facebook_login = bool(int(request.REQUEST.get('facebook_login', 0))) if facebook_login: require_persistent_graph(request) logger.info('trying to connect using facebook') graph = get_persistent_graph(request) if graph: logger.info('found a graph object') klass = get_facebook_user_converter_class() facebook = klass(graph) if facebook.is_authenticated(): logger.info('facebook is authenticated') facebook_data = facebook.facebook_profile_data() #either, login register or connect the user try: action, user = connect_user(request) logger.info('Django facebook performed action: %s', action) except facebook_exceptions.IncompleteProfileError, e: #show them a registration form to add additional data warning_format = u'Incomplete profile data encountered with error %s' warn_message = warning_format % e.message send_warning(warn_message, e=e, facebook_data=facebook_data) context['facebook_mode'] = True context['form'] = e.form return render_to_response( facebook_settings.FACEBOOK_REGISTRATION_TEMPLATE, context_instance=context, ) if action is CONNECT_ACTIONS.CONNECT: #connect means an existing account was attached to facebook messages.info( request, _("You have connected your account " "to %s's facebook profile") % facebook_data['name']) elif action is CONNECT_ACTIONS.REGISTER: #hook for tying in specific post registration functionality response = backend.post_registration_redirect( request, user) return response else: if 'attempt' in request.GET: return next_redirect( request, next_key=['error_next', 'next'], additional_params=dict(fb_error_or_cancel=1)) else: logger.info('Facebook authentication needed for connect, ' \ 'raising an error') raise OpenFacebookException('please authenticate') #for CONNECT and LOGIN we simple redirect to the next page return next_redirect( request, default=facebook_settings.FACEBOOK_LOGIN_DEFAULT_REDIRECT)
request, user) #compatability for django registration backends which return tuples instead of a response #alternatively we could wrap django registration backends, but that would be hard to understand response = response if isinstance( response, HttpResponse) else redirect(response) return response else: if 'attempt' in request.GET: return next_redirect( request, next_key=['error_next', 'next'], additional_params=dict(fb_error_or_cancel=1)) else: logger.info('Facebook authentication needed for connect, ' \ 'raising an error') raise OpenFacebookException('please authenticate') #for CONNECT and LOGIN we simple redirect to the next page return next_redirect( request, default=facebook_settings.FACEBOOK_LOGIN_DEFAULT_REDIRECT) if not settings.DEBUG and facebook_settings.FACEBOOK_HIDE_CONNECT_TEST: raise Http404 return render_to_response('django_facebook/connect.html', context) def disconnect(request): ''' Removes Facebook from the users profile And redirects to the specified next page