'Decorator that starts the OAuth 2.0 dance.
Starts the OAuth dance for the logged in user if they haven\'t already
granted access for this application.
Args:
method: callable, to be decorated method of a webapp.RequestHandler
instance.'

def oauth_required(self, method):

    def check_oauth(request_handler, *args, **kwargs):
        if self._in_error:
            self._display_error_message(request_handler)
            return
        user = users.get_current_user()
        if (not user):
            request_handler.redirect(users.create_login_url(request_handler.request.uri))
            return
        self._create_flow(request_handler)
        self.flow.params['state'] = request_handler.request.url
        self.credentials = StorageByKeyName(CredentialsModel, user.user_id(), 'credentials').get()
        if (not self.has_credentials()):
            return request_handler.redirect(self.authorize_url())
        try:
            method(request_handler, *args, **kwargs)
        except AccessTokenRefreshError:
            return request_handler.redirect(self.authorize_url())
    return check_oauth
