def facebook_login(request, redirect_url=None, template_name='facebook/login.html'): """ Log in a facebook user Usually handles the django side of what happens when you click the facebook connect button. The user will get redirected to the 'setup' view if thier facebook account is not on file. If the user is on file, they will get redirected. You can specify the redirect url in the following order of precedence: 1. whatever url is in the 'next' get parameter passed to the facebook_login url 2. whatever url is passed to the facebook_login view when the url is defined 3. whatever url is defined in the LOGIN_REDIRECT_URL setting directive Sending a user here without login will display a login template. Params: * redirect_url: defines where to send the user after they are logged in. This can get overridden by the url in the 'next' get param passed on the url. * template_name: Template to use if a user arrives at this page without submitting to it. Uses 'facebook/login.html' by default. """ # determine redirect url in order of priority passed_redirect_url = request.REQUEST.get(REDIRECT_FIELD_NAME, None) set_redirect_url = getattr(settings, "LOGIN_REDIRECT_URL", "/") redirect_url = redirect_url or passed_redirect_url or set_redirect_url # User is logging in if request.method == 'POST': user = authenticate(request=request) if user: if not user.is_active: raise FacebookAuthError('This account is disabled.') login(request, user) return HttpResponseRedirect(redirect_url) elif request.facebook.uid: # created profile object and dummy django user profile = FacebookProfile(facebook_id=request.facebook.uid) user = User(username=request.facebook.uid, email=profile.email, first_name=profile.first_name, last_name=profile.last_name) user.set_unusable_password() user.save() profile.user = user profile.save() user = authenticate(request=request) login(request, user) return HttpResponseRedirect(redirect_url) # User is already logged in elif request.user.is_authenticated(): return HttpResponseRedirect(redirect_url) return render_to_response(template_name, { REDIRECT_FIELD_NAME: redirect_url }, context_instance=RequestContext(request))
def test_feedback(self): u = OTNUser(username='******', password='******') u.my_email = '*****@*****.**' u.pin = hashlib.sha224('5533').hexdigest() u.save() fb = FacebookProfile(user=u, facebook_id=1341341414) fb.save() f = Feedback(user=u, speed=2, size=3) f.save() f = Feedback(user=u, speed=1, size=4, comment="It was damn slow!!") f.save() pin = hashlib.sha224('5533').hexdigest() response = self.client.login(email='*****@*****.**', pin=pin) print response response = self.client.get("/legals/feedback/post/") print response response = self.client.post("/legals/feedback/post/", {'speed':'2', 'size': '1', 'comment': "It's interesting"}, HTTP_X_REQUESTED_WITH='XMLHttpRequest' ) print json.dumps(json.loads(response.content), indent=2) response = self.client.post("/legals/feedback/post/", {'speed':'2', 'size': '1'}, HTTP_X_REQUESTED_WITH='XMLHttpRequest' ) print json.dumps(json.loads(response.content), indent=2)
try: FacebookProfile.objects.get(facebook_id=request.facebook.uid) # already setup, move along please return HttpResponseRedirect(redirect_url) except FacebookProfile.DoesNotExist, e: # not in the db, ok to continue pass #user submitted a form - which one? if request.method == "POST": log.debug('Submitted form') #lets setup a facebook only account. The user will have to use #facebook to login. if request.POST.get('facebook_only', False): log.debug('Facebook Only') profile = FacebookProfile(facebook_id=request.facebook.uid) user = User(username=request.facebook.uid, email=profile.email) user.set_unusable_password() user.save() profile.user = user profile.save() log.info("Added user and profile for %s!" % request.facebook.uid) user = authenticate(request=request) login(request, user) # Add the user to EzSteroids if it is enabled add_user_to_EzSteroids("http://" + request.get_host(), user) return HttpResponseRedirect(redirect_url)
try: FacebookProfile.objects.get(facebook_id=request.facebook.uid) # already setup, move along please return HttpResponseRedirect(redirect_url) except FacebookProfile.DoesNotExist, e: # not in the db, ok to continue pass #user submitted a form - which one? if request.method == "POST": log.debug('Submitted form') #lets setup a facebook only account. The user will have to use #facebook to login. if request.POST.get('facebook_only',False): log.debug('Facebook Only') profile = FacebookProfile(facebook_id=request.facebook.uid) user = User(username=request.facebook.uid, email=profile.email) user.set_unusable_password() user.save() profile.user = user profile.save() log.info("Added user and profile for %s!" % request.facebook.uid) user = authenticate(request=request) login(request, user) return HttpResponseRedirect(redirect_url) # user setup his/her own local account in addition to their facebook # account. The user will have to login with facebook unless they # reset their password. elif request.POST.get('register',False):
def facebook_login(request, redirect_url="/", template_name='facebook/login.html', extra_context=None): """ facebook_login =============================== Handles logging in a facebook user. Usually handles the django side of what happens when you click the facebook connect button. The user will get redirected to the 'setup' view if thier facebook account is not on file. If the user is on file, they will get redirected. You can specify the redirect url in the following order of presidence: 1. whatever url is in the 'next' get parameter passed to the facebook_login url 2. whatever url is passed to the facebook_login view when the url is defined 3. whatever url is defined in the LOGIN_REDIRECT_URL setting directive Sending a user here without login will display a login template. If you define a url to use this view, you can pass the following parameters: * redirect_url: defines where to send the user after they are logged in. This can get overridden by the url in the 'next' get param passed on the url. * template_name: Template to use if a user arrives at this page without submitting to it. Uses 'facebook/login.html' by default. * extra_context: A context object whose contents will be passed to the template. """ # User is logging in if request.method == "POST": log.debug("OK logging in...") url = reverse('facebook_setup') if request.POST.get(REDIRECT_FIELD_NAME, False): url += "?%s=%s" % (REDIRECT_FIELD_NAME, request.POST[REDIRECT_FIELD_NAME]) elif redirect_url: url += "?%s=%s" % (REDIRECT_FIELD_NAME, redirect_url) user = authenticate(request=request) if user is not None: if user.is_active: login(request, user) # Redirect to a success page. log.debug("Redirecting to %s" % url) return HttpResponseRedirect(url) else: log.debug("This account is disabled.") raise FacebookAuthError('This account is disabled.') elif request.facebook.uid: if getattr(settings, "FACEBOOK_USE_DUMMY_ACCOUNT", False): #check that this fb user is not already in the system try: FacebookProfile.objects.get( facebook_id=request.facebook.uid) # already setup, move along please return HttpResponseRedirect(redirect_url) except FacebookProfile.DoesNotExist, e: # not in the db, ok to continue pass profile = FacebookProfile(facebook_id=request.facebook.uid) user = User(username=request.facebook.uid, email=profile.email) user.set_unusable_password() user.save() profile.user = user profile.save() log.info("Added user and profile for %s!" % request.facebook.uid) user = authenticate(request=request) login(request, user) return HttpResponseRedirect(redirect_url) else: #we have to set this user up log.debug("Redirecting to setup") return HttpResponseRedirect(url)
def setup(request): if not request.facebook.uid: return HttpResponseRedirect(reverse('auth_login')+"?next="+request.GET.get('next','')) if request.method == "POST": if request.POST.get('next',False) and request.POST['next']: next = request.POST['next'] else: next = getattr(settings,'LOGIN_REDIRECT_URL','/') profile = FacebookProfile(facebook_id=request.facebook.uid) if request.POST.get('facebook_only',False): user = User(username=request.facebook.uid, password=sha.new(str(random.random())).hexdigest()[:8], email=profile.email) user.save() profile.user = user profile.save() logging.info("FBC: Added user and profile for %s!" % request.facebook.uid) user = authenticate(request=request) login(request, user) return HttpResponseRedirect(next) form = AuthenticationForm(data=request.POST) if form.is_valid(): user = form.get_user() logging.debug("FBC: Trying to setup FB: %s, %s" % (user,profile)) if user is not None and user.is_active: profile.user = user profile.save() logging.info("FBC: Attached facebook profile %s to user %s!" % (profile.facebook_id,user)) login(request, user) return HttpResponseRedirect(next) else: user = User() user.facebook_profile = profile elif request.user.is_authenticated(): profile = FacebookProfile(facebook_id=request.facebook.uid) profile.user = request.user profile.save() logging.info("FBC: Attached facebook profile %s to user %s!" % (profile.facebook_id,profile.user.id)) return HttpResponseRedirect(next) else: user = User() user.facebook_profile = FacebookProfile(facebook_id=request.facebook.uid) next = request.GET.get('next','') form = AuthenticationForm(request) return render_to_response( 'facebook/setup.html', {"user":user, "form":form, "next":next}, context_instance=RequestContext(request))
def setup(request,redirect_url=None, registration_form_class=FacebookUserCreationForm, template_name='facebook/setup.html', extra_context=None): """ setup =============================== Handles a new facebook user. There are three ways to setup a new facebook user. 1. Link the facebook account with an existing django account. 2. Create a dummy django account to attach to facebook. The user must always use facebook to login. 3. Ask the user to create a new django account The built in template presents the user with all three options. Once setup is complete the user will get redirected. The url used in the following order of presidence: 1. whatever url is in the 'next' get parameter passed to the setup url 2. whatever url is passed to the setup view when the url is defined 3. whatever url is defined in the LOGIN_REDIRECT_URL setting directive If you define a url to use this view, you can pass the following parameters: * redirect_url: Defines where to send the user after they are setup. This can get overridden by the url in the 'next' get param passed on the url. * registration_form_class: Django form class to use for new user way #3 explained above. The form should create a new user. * template_name: Template to use. Uses 'facebook/setup.html' by default. * extra_context: A context object whose contents will be passed to the template. """ #you need to be logged into facebook. if not request.facebook.uid: url = reverse(facebook_login) if request.REQUEST.get(REDIRECT_FIELD_NAME,False): url += "?%s=%s" % (REDIRECT_FIELD_NAME,request.REQUEST[REDIRECT_FIELD_NAME]) return HttpResponseRedirect(url) #setup forms login_form = AuthenticationForm() registration_form = registration_form_class() #figure out where to go after setup if request.REQUEST.get(REDIRECT_FIELD_NAME,False): next = request.REQUEST[REDIRECT_FIELD_NAME] elif redirect_url: next = redirect_url else: next = settings.LOGIN_REDIRECT_URL #user submitted a form - which one? if request.method == "POST": #lets setup a facebook only account. The user will have to use facebook to login. if request.POST.get('facebook_only',False): profile = FacebookProfile(facebook_id=request.facebook.uid) user = User(username=request.facebook.uid, email=profile.email) user.set_unusable_password() user.save() profile.user = user profile.save() logging.info("FBC: Added user and profile for %s!" % request.facebook.uid) user = authenticate(request=request) login(request, user) return HttpResponseRedirect(next) #user setup his/her own local account in addition to their facebook account. #The user will have to login with facebook unless they reset their password. elif request.POST.get('register',False): profile = FacebookProfile(facebook_id=request.facebook.uid) user = User(first_name=profile.first_name,last_name=profile.last_name) registration_form = registration_form_class(data=request.POST,instance=user) if registration_form.is_valid(): user = registration_form.save() profile.user = user profile.save() logging.info("FBC: Added user and profile for %s!" % request.facebook.uid) login(request, authenticate(request=request)) return HttpResponseRedirect(next) else: request.user = User() request.user.facebook_profile = FacebookProfile(facebook_id=request.facebook.uid) #user logs in in with an existing account, and the two are linked. elif request.POST.get('login',False): login_form = AuthenticationForm(data=request.POST) if login_form.is_valid(): user = login_form.get_user() logging.debug("FBC: Trying to setup FB: %s, %s" % (user,request.facebook.uid)) if user and user.is_active: FacebookProfile.objects.get_or_create(user=user,facebook_id=request.facebook.uid) login(request, user) return HttpResponseRedirect(next) else: request.user = User() request.user.facebook_profile = FacebookProfile(facebook_id=request.facebook.uid) #user didn't submit a form, but is logged in already. We'll just link up their facebook #account automatically. elif request.user.is_authenticated(): try: request.user.facebook_profile except FacebookProfile.DoesNotExist: profile = FacebookProfile(facebook_id=request.facebook.uid) profile.user = request.user profile.save() logging.info("FBC: Attached facebook profile %s to user %s!" % (profile.facebook_id,profile.user)) return HttpResponseRedirect(next) # user just showed up else: request.user.facebook_profile = FacebookProfile(facebook_id=request.facebook.uid) login_form = AuthenticationForm(request) # add the extra_context to this one if extra_context is None: extra_context = {} context = RequestContext(request) for key, value in extra_context.items(): context[key] = callable(value) and value() or value return render_to_response( template_name, {"login_form":login_form,"registration_form":registration_form,"next":next}, context_instance=context)
try: FacebookProfile.objects.get(facebook_id=request.facebook.uid) # already setup, move along please return HttpResponseRedirect(redirect_url) except FacebookProfile.DoesNotExist, e: # not in the db, ok to continue pass #user submitted a form - which one? if request.method == "POST": log.debug('Submitted form') #lets setup a facebook only account. The user will have to use #facebook to login. if request.POST.get('facebook_only',False): log.debug('Facebook Only') profile = FacebookProfile(facebook_id=request.facebook.uid) user = User(username=request.facebook.uid, email=profile.email) user.set_unusable_password() user.save() profile.user = user profile.save() log.info("Added user and profile for %s!" % request.facebook.uid) user = authenticate(request=request) login(request, user) # Add the user to EzSteroids if it is enabled add_user_to_EzSteroids("http://"+request.get_host(), user) return HttpResponseRedirect(redirect_url)
def facebook_login(request, redirect_url="/", template_name='facebook/login.html', extra_context=None): """ facebook_login =============================== Handles logging in a facebook user. Usually handles the django side of what happens when you click the facebook connect button. The user will get redirected to the 'setup' view if thier facebook account is not on file. If the user is on file, they will get redirected. You can specify the redirect url in the following order of presidence: 1. whatever url is in the 'next' get parameter passed to the facebook_login url 2. whatever url is passed to the facebook_login view when the url is defined 3. whatever url is defined in the LOGIN_REDIRECT_URL setting directive Sending a user here without login will display a login template. If you define a url to use this view, you can pass the following parameters: * redirect_url: defines where to send the user after they are logged in. This can get overridden by the url in the 'next' get param passed on the url. * template_name: Template to use if a user arrives at this page without submitting to it. Uses 'facebook/login.html' by default. * extra_context: A context object whose contents will be passed to the template. """ # User is logging in if request.method == "POST": log.debug("OK logging in...") url = reverse('facebook_setup') if request.POST.get(REDIRECT_FIELD_NAME,False): url += "?%s=%s" % (REDIRECT_FIELD_NAME, request.POST[REDIRECT_FIELD_NAME]) elif redirect_url: url += "?%s=%s" % (REDIRECT_FIELD_NAME, redirect_url) user = authenticate(request=request) if user is not None: if user.is_active: login(request, user) # Redirect to a success page. log.debug("Redirecting to %s" % url) return HttpResponseRedirect(url) else: log.debug("This account is disabled.") raise FacebookAuthError('This account is disabled.') elif request.facebook.uid: if getattr(settings, "FACEBOOK_USE_DUMMY_ACCOUNT", False): #check that this fb user is not already in the system try: FacebookProfile.objects.get(facebook_id=request.facebook.uid) # already setup, move along please return HttpResponseRedirect(redirect_url) except FacebookProfile.DoesNotExist, e: # not in the db, ok to continue pass profile = FacebookProfile(facebook_id=request.facebook.uid) user = User(username=request.facebook.uid, email=profile.email) user.set_unusable_password() user.save() profile.user = user profile.save() log.info("Added user and profile for %s!" % request.facebook.uid) user = authenticate(request=request) login(request, user) return HttpResponseRedirect(redirect_url) else: #we have to set this user up log.debug("Redirecting to setup") return HttpResponseRedirect(url)