[MIG] google_account: migrate into new API
This commit is contained in:
committed by
Jérome Maes
parent
65ec248883
commit
3e1fb87e93
@@ -1,10 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
|
||||
{
|
||||
'name': 'Google Users',
|
||||
'version': '1.0',
|
||||
'category': 'Tools',
|
||||
'description': """
|
||||
The module adds google user in res user.
|
||||
@@ -14,7 +12,4 @@ The module adds google user in res user.
|
||||
'data': [
|
||||
'data/google_account_data.xml',
|
||||
],
|
||||
'demo': [],
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
}
|
||||
|
||||
@@ -1,32 +1,28 @@
|
||||
import json
|
||||
import urllib
|
||||
import openerp
|
||||
from openerp import http
|
||||
from openerp.http import request
|
||||
import openerp.addons.web.controllers.main as webmain
|
||||
from openerp.addons.web.http import SessionExpiredException
|
||||
from werkzeug.exceptions import BadRequest
|
||||
import werkzeug.utils
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
from werkzeug.utils import redirect
|
||||
|
||||
from odoo import http, registry
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
class GoogleAuth(http.Controller):
|
||||
|
||||
class google_auth(http.Controller):
|
||||
|
||||
@http.route('/google_account/authentication', type='http', auth="none")
|
||||
def oauth2callback(self, **kw):
|
||||
""" This route/function is called by Google when user Accept/Refuse the consent of Google """
|
||||
|
||||
|
||||
state = json.loads(kw['state'])
|
||||
dbname = state.get('d')
|
||||
service = state.get('s')
|
||||
url_return = state.get('f')
|
||||
|
||||
registry = openerp.modules.registry.RegistryManager.get(dbname)
|
||||
with registry.cursor() as cr:
|
||||
if kw.get('code',False):
|
||||
registry.get('google.%s' % service).set_all_tokens(cr,request.session.uid,kw['code'])
|
||||
return werkzeug.utils.redirect(url_return)
|
||||
elif kw.get('error'):
|
||||
return werkzeug.utils.redirect("%s%s%s" % (url_return ,"?error=" , kw.get('error')))
|
||||
else:
|
||||
return werkzeug.utils.redirect("%s%s" % (url_return ,"?error=Unknown_error"))
|
||||
|
||||
|
||||
with registry(dbname).cursor() as cr:
|
||||
if kw.get('code'):
|
||||
request.env(cr, request.session.uid)['google.%s' % service].set_all_tokens(kw['code'])
|
||||
return redirect(url_return)
|
||||
elif kw.get('error'):
|
||||
return redirect("%s%s%s" % (url_return, "?error=", kw['error']))
|
||||
else:
|
||||
return redirect("%s%s" % (url_return, "?error=Unknown_error"))
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="config_google_redirect_uri" model="ir.config_parameter">
|
||||
<field name="key">google_redirect_uri</field>
|
||||
<field name="value">urn:ietf:wg:oauth:2.0:oob</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
</odoo>
|
||||
|
||||
@@ -1,30 +1,28 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import openerp
|
||||
from openerp.http import request
|
||||
from openerp.osv import osv
|
||||
from openerp import SUPERUSER_ID
|
||||
from openerp.tools.translate import _
|
||||
from datetime import datetime
|
||||
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
||||
from odoo import api, fields, models, registry, _
|
||||
from odoo.http import request
|
||||
|
||||
import werkzeug.urls
|
||||
import urllib2
|
||||
import json
|
||||
import urllib2
|
||||
import werkzeug.urls
|
||||
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
TIMEOUT = 20
|
||||
|
||||
class google_service(osv.osv_memory):
|
||||
|
||||
class GoogleService(models.TransientModel):
|
||||
_name = 'google.service'
|
||||
|
||||
def generate_refresh_token(self, cr, uid, service, authorization_code, context=None):
|
||||
ir_config = self.pool['ir.config_parameter']
|
||||
client_id = ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % service)
|
||||
client_secret = ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_secret' % service)
|
||||
redirect_uri = ir_config.get_param(cr, SUPERUSER_ID, 'google_redirect_uri')
|
||||
@api.model
|
||||
def generate_refresh_token(self, service, authorization_code):
|
||||
ICPSudo = self.env['ir.config_parameter'].sudo()
|
||||
client_id = ICPSudo.get_param('google_%s_client_id' % service)
|
||||
client_secret = ICPSudo.get_param('google_%s_client_secret' % service)
|
||||
redirect_uri = ICPSudo.get_param('google_redirect_uri')
|
||||
|
||||
#Get the Refresh Token From Google And store it in ir.config_parameter
|
||||
headers = {"Content-type": "application/x-www-form-urlencoded"}
|
||||
@@ -35,30 +33,31 @@ class google_service(osv.osv_memory):
|
||||
content = urllib2.urlopen(req, timeout=TIMEOUT).read()
|
||||
except urllib2.HTTPError:
|
||||
error_msg = _("Something went wrong during your token generation. Maybe your Authorization Code is invalid or already expired")
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, error_msg, context=context)
|
||||
raise self.env['res.config.settings'].get_config_warning(error_msg)
|
||||
|
||||
content = json.loads(content)
|
||||
return content.get('refresh_token')
|
||||
|
||||
def _get_google_token_uri(self, cr, uid, service, scope, context=None):
|
||||
ir_config = self.pool['ir.config_parameter']
|
||||
@api.model
|
||||
def _get_google_token_uri(self, service, scope):
|
||||
ICPSudo = self.env['ir.config_parameter'].sudo()
|
||||
params = {
|
||||
'scope': scope,
|
||||
'redirect_uri': ir_config.get_param(cr, SUPERUSER_ID, 'google_redirect_uri'),
|
||||
'client_id': ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % service),
|
||||
'redirect_uri': ICPSudo.get_param('google_redirect_uri'),
|
||||
'client_id': ICPSudo.get_param('google_%s_client_id' % service),
|
||||
'response_type': 'code',
|
||||
'client_id': ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % service),
|
||||
}
|
||||
uri = 'https://accounts.google.com/o/oauth2/auth?%s' % werkzeug.url_encode(params)
|
||||
return uri
|
||||
|
||||
# If no scope is passed, we use service by default to get a default scope
|
||||
def _get_authorize_uri(self, cr, uid, from_url, service, scope=False, context=None):
|
||||
""" This method return the url needed to allow this instance of OpenErp to access to the scope of gmail specified as parameters """
|
||||
state_obj = dict(d=cr.dbname, s=service, f=from_url)
|
||||
@api.model
|
||||
def _get_authorize_uri(self, from_url, service, scope=False):
|
||||
""" This method return the url needed to allow this instance of Odoo to access to the scope of gmail specified as parameters """
|
||||
state_obj = dict(d=self.env.cr.dbname, s=service, f=from_url)
|
||||
|
||||
base_url = self.get_base_url(cr, uid, context)
|
||||
client_id = self.get_client_id(cr, uid, service, context)
|
||||
base_url = self.get_base_url()
|
||||
client_id = self.get_client_id(service)
|
||||
|
||||
params = {
|
||||
'response_type': 'code',
|
||||
@@ -73,12 +72,14 @@ class google_service(osv.osv_memory):
|
||||
uri = self.get_uri_oauth(a='auth') + "?%s" % werkzeug.url_encode(params)
|
||||
return uri
|
||||
|
||||
def _get_google_token_json(self, cr, uid, authorize_code, service, context=None):
|
||||
@api.model
|
||||
def _get_google_token_json(self, authorize_code, service):
|
||||
res = False
|
||||
base_url = self.get_base_url(cr, uid, context)
|
||||
client_id = self.get_client_id(cr, uid, service, context)
|
||||
client_secret = self.get_client_secret(cr, uid, service, context)
|
||||
base_url = self.get_base_url()
|
||||
client_id = self.get_client_id(service)
|
||||
client_secret = self.get_client_secret(service)
|
||||
|
||||
headers = {"content-type": "application/x-www-form-urlencoded"}
|
||||
params = {
|
||||
'code': authorize_code,
|
||||
'client_id': client_id,
|
||||
@@ -87,22 +88,21 @@ class google_service(osv.osv_memory):
|
||||
'redirect_uri': base_url + '/google_account/authentication'
|
||||
}
|
||||
|
||||
headers = {"content-type": "application/x-www-form-urlencoded"}
|
||||
|
||||
try:
|
||||
uri = self.get_uri_oauth(a='token')
|
||||
data = werkzeug.url_encode(params)
|
||||
|
||||
st, res, ask_time = self._do_request(cr, uid, uri, params=data, headers=headers, type='POST', preuri='', context=context)
|
||||
st, res, ask_time = self._do_request(uri, params=data, headers=headers, type='POST', preuri='')
|
||||
except urllib2.HTTPError:
|
||||
error_msg = _("Something went wrong during your token generation. Maybe your Authorization Code is invalid")
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, error_msg, context=context)
|
||||
raise self.env['res.config.settings'].get_config_warning(error_msg)
|
||||
return res
|
||||
|
||||
def _refresh_google_token_json(self, cr, uid, refresh_token, service, context=None): # exchange_AUTHORIZATION vs Token (service = calendar)
|
||||
@api.model
|
||||
def _refresh_google_token_json(self, refresh_token, service): # exchange_AUTHORIZATION vs Token (service = calendar)
|
||||
res = False
|
||||
client_id = self.get_client_id(cr, uid, service, context)
|
||||
client_secret = self.get_client_secret(cr, uid, service, context)
|
||||
client_id = self.get_client_id(service)
|
||||
client_secret = self.get_client_secret(service)
|
||||
|
||||
params = {
|
||||
'refresh_token': refresh_token,
|
||||
@@ -117,28 +117,25 @@ class google_service(osv.osv_memory):
|
||||
uri = self.get_uri_oauth(a='token')
|
||||
|
||||
data = werkzeug.url_encode(params)
|
||||
st, res, ask_time = self._do_request(cr, uid, uri, params=data, headers=headers, type='POST', preuri='', context=context)
|
||||
st, res, ask_time = self._do_request(uri, params=data, headers=headers, type='POST', preuri='')
|
||||
except urllib2.HTTPError, e:
|
||||
if e.code == 400: # invalid grant
|
||||
registry = openerp.modules.registry.RegistryManager.get(request.session.db)
|
||||
with registry.cursor() as cur:
|
||||
self.pool['res.users'].write(cur, uid, [uid], {'google_%s_rtoken' % service: False}, context=context)
|
||||
with registry(request.session.db).cursor() as cur:
|
||||
self.env(cur)['res.users'].browse(self.env.uid).write({'google_%s_rtoken' % service: False})
|
||||
error_key = json.loads(e.read()).get("error", "nc")
|
||||
_logger.exception("Bad google request : %s !" % error_key)
|
||||
error_msg = _("Something went wrong during your token generation. Maybe your Authorization Code is invalid or already expired [%s]") % error_key
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, error_msg, context=context)
|
||||
raise self.env['res.config.settings'].get_config_warning(error_msg)
|
||||
return res
|
||||
|
||||
def _do_request(self, cr, uid, uri, params={}, headers={}, type='POST', preuri="https://www.googleapis.com", context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
@api.model
|
||||
def _do_request(self, uri, params={}, headers={}, type='POST', preuri="https://www.googleapis.com"):
|
||||
""" Return a tuple ('HTTP_CODE', 'HTTP_RESPONSE') """
|
||||
_logger.debug("Uri: %s - Type : %s - Headers: %s - Params : %s !" % (uri, type, headers, werkzeug.url_encode(params) if type == 'GET' else params))
|
||||
|
||||
status = 418
|
||||
response = ""
|
||||
ask_time = datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
ask_time = fields.Datetime.now()
|
||||
try:
|
||||
if type.upper() == 'GET' or type.upper() == 'DELETE':
|
||||
data = werkzeug.url_encode(params)
|
||||
@@ -170,17 +167,18 @@ class google_service(osv.osv_memory):
|
||||
_logger.exception("Bad google request : %s !" % e.read())
|
||||
if e.code in (400, 401, 410):
|
||||
raise e
|
||||
raise self.pool.get('res.config.settings').get_config_warning(cr, _("Something went wrong with your request to google"), context=context)
|
||||
raise self.env['res.config.settings'].get_config_warning(_("Something went wrong with your request to google"))
|
||||
return (status, response, ask_time)
|
||||
|
||||
def get_base_url(self, cr, uid, context=None):
|
||||
return self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='http://www.openerp.com?NoBaseUrl', context=context)
|
||||
def get_base_url(self):
|
||||
return self.env['ir.config_parameter'].get_param('web.base.url', default='http://www.odoo.com?NoBaseUrl')
|
||||
|
||||
def get_client_id(self, cr, uid, service, context=None):
|
||||
return self.pool.get('ir.config_parameter').get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % (service,), default=False, context=context)
|
||||
@api.model
|
||||
def get_client_id(self, service):
|
||||
return self.env['ir.config_parameter'].sudo().get_param('google_%s_client_id' % (service,), default=False)
|
||||
|
||||
def get_client_secret(self, cr, uid, service, context=None):
|
||||
return self.pool.get('ir.config_parameter').get_param(cr, SUPERUSER_ID, 'google_%s_client_secret' % (service,), default=False, context=context)
|
||||
def get_client_secret(self, service):
|
||||
return self.env['ir.config_parameter'].sudo().get_param('google_%s_client_secret' % (service,), default=False)
|
||||
|
||||
def get_uri_oauth(self, a=''): # a = optional action
|
||||
return "https://accounts.google.com/o/oauth2/%s" % (a,)
|
||||
|
||||
Reference in New Issue
Block a user