Beispiel #1
0
    def _add_association(self, request, access_token):
        """
        Adds an association for `access_token` to `request.user`.

        Returns an HttpResponse.
        """
        success_url = get_success_url(request=request)
        if success_url is None:
            success_url = login_redirect_url()
        try:
            self._associate(request, access_token)
        except UserAlreadyLinked:
            return HttpResponseRedirect(
                update_qs(success_url, {
                    'error': 'user_already_linked',
                    'user': request.user.username
                }))
        except TwitterAlreadyLinked:
            userinfo = cached_user_info(request, access_token)
            return HttpResponseRedirect(
                update_qs(
                    success_url, {
                        'error': 'twitter_already_linked',
                        'user': userinfo.screen_name
                    }))
        return HttpResponseRedirect(success_url)
    def _add_association(self, request, access_token):
        """
        Adds an association for `access_token` to `request.user`.

        Returns an HttpResponse.
        """
        success_url = get_success_url(request=request)
        if success_url is None:
            success_url = login_redirect_url()
        try:
            self._associate(request, access_token)
        except UserAlreadyLinked:
            return HttpResponseRedirect(
                update_qs(success_url,
                          {'error': 'user_already_linked',
                           'user': request.user.username})
            )
        except TwitterAlreadyLinked:
            userinfo = cached_user_info(request, access_token)
            return HttpResponseRedirect(
                update_qs(success_url,
                          {'error': 'twitter_already_linked',
                           'user': userinfo.screen_name})
            )
        return HttpResponseRedirect(success_url)
Beispiel #3
0
 def _associate(self, request, access_token):
     """Returns the TwitterUser just associated with `request.user`."""
     twitter_user = TwitterUser.objects.create_twitter_user(
         user=request.user,
         access_token=access_token,
         userinfo=cached_user_info(request, access_token))
     twitter_user_associated.send(sender=self.__class__,
                                  twitter_user=twitter_user)
     return twitter_user
 def _associate(self, request, access_token):
     """Returns the TwitterUser just associated with `request.user`."""
     twitter_user = TwitterUser.objects.create_twitter_user(
         user=request.user,
         access_token=access_token,
         userinfo=cached_user_info(request, access_token)
     )
     twitter_user_associated.send(sender=self.__class__,
                                  twitter_user=twitter_user)
     return twitter_user
Beispiel #5
0
class OAuthTwitter(object):
    """Views for django-oauth-twitter."""
    def __init__(self,
                 auto_create_user=False,
                 registration_form=RegistrationForm,
                 association_url=None,
                 registration_url=None):
        """
        If `auto_create_user` is True, attempt to create a user automatically
        without signing up.

        `registration_form` is the form to use to create a new user.

        If `association_url` is a reverse()able string or view function,
        redirect to that view when associating a TwitterUser to a User.

        If `registration_url` is a reverse()able string or view function,
        redirect to that view in order to let a user register for a new
        User account.
        """
        self.auto_create_user = auto_create_user
        self._association_url_default = association_url is None
        if self._association_url_default:
            self.association_url = LazyReverse(self.associate)
        else:
            self.association_url = LazyReverse(association_url)
        if registration_url is None:
            self.registration_url = LazyReverse(self.register)
        else:
            self.registration_url = LazyReverse(registration_url)
        self.RegistrationForm = registration_form

    def get_urls(self):
        """
        Returns urlpatterns for urls.py.

        Include it like so::
            oauthtwitter = OAuthTwitter()
            urlpatterns += patterns('',
                url(r'^twitter/', include(oauthtwitter.urls)),
            )
        """
        urlpatterns = patterns(
            '',
            url(r'^callback/', self.callback, name='twitter_callback'),
            url(r'^signin/', self.signin, name='twitter_signin'),
        )
        if self._association_url_default:
            # Add ^associate/ location if we're meant to handle association.
            urlpatterns += patterns(
                '',
                url(r'^associate/signin/',
                    self.signin,
                    kwargs={'success_url': 'twitter_associate'},
                    name='twitter_signin_associate'),
                url(r'^associate/', self.associate, name='twitter_associate'),
            )
        if self.registration_url.location == self.register:
            # Add ^register/ location if we're meant to handle registration.
            urlpatterns += patterns(
                '',
                url(r'^register/',
                    self.registration_url.location,
                    name='twitter_register'))
        return urlpatterns

    urls = property(get_urls)

    @login_required_m
    def associate(self,
                  request,
                  template="django_oauth_twitter/associate.html",
                  dictionary=None):
        """
        View to manage the association between a User and Twitter.

        `template` is the template to render for this webpage.

        If `dictionary` is provided, it provides extra context for
        rendering `template`.
        """
        if not request.user.is_authenticated():
            return self._redirect_to_login(request)
        if request.method == 'POST':
            if request.POST.get('action') == 'remove':
                twitter_id = request.POST.get('twitter_id')
                response = self._remove_association(request, twitter_id)
                if response:
                    return response
        self._check_for_revocation(request)
        if dictionary is None:
            dictionary = {}
        dictionary.update({
            'error': request.GET.get('error'),
            'error_user': request.GET.get('user')
        })
        return render_to_response(template,
                                  dictionary=dictionary,
                                  context_instance=RequestContext(request))

    def callback(self, request):
        """
        View that gets the oauth_token from Twitter and signs in a User.

        Note: You must set this callback URL in Twitter's Application
        Details page.  Twitter ignores OAuth's oauth_callback option.
        """
        # Ensure that the user came in through signin().
        request_token = request.twitter_request_token
        if request_token is None:
            return self._redirect_to_login(request=request)
        # Ensure that the session's token matches Twitter's token.
        if request_token.key != request.GET.get('oauth_token'):
            remove_tokens(request)
            return self._redirect_to_login(request=request)
        # Save the access token in the session.
        api = TwitterApi(request_token)
        try:
            access_token = fail_whale(api.getAccessToken)()
        except HTTPError, e:
            if e.code == 401:
                # Restart the authentication process, as Twitter thinks
                # we're unauthorized.
                return HttpResponseRedirect(reverse('twitter_signin'))
            raise
        set_access_token(request, access_token)
        # Funnel the user into the site.
        userinfo = cached_user_info(request, access_token)
        if request.user.is_anonymous():
            # Find the User by the access token.
            user = self._authenticate(userinfo=userinfo)
            if user is None:
                # New user
                return self._on_new_user(request=request)
            return self._login_and_redirect(request=request, user=user)
        return self._add_association(request, access_token)