From 3d04737ab1827879071a3e988394314d849f3948 Mon Sep 17 00:00:00 2001 From: jke-openerp Date: Thu, 19 Dec 2013 15:25:14 +0100 Subject: [PATCH] [TYPO] Rename google_base_account into google_account bzr revid: jke@openerp.com-20131219142514-8epaqnt0mb16xd4n --- .../__init__.py | 2 +- .../__openerp__.py | 2 +- .../controllers/__init__.py | 0 addons/google_account/controllers/main.py | 34 +++++ .../google_account.py} | 6 +- .../google_account.xml} | 0 addons/google_account/google_account_data.xml | 9 ++ .../i18n/ar.po | 0 .../i18n/cs.po | 0 .../i18n/de.po | 0 .../i18n/es.po | 0 .../i18n/es_CR.po | 0 .../i18n/fi.po | 0 .../i18n/fr.po | 0 .../i18n/google_base_account.pot | 0 .../i18n/hr.po | 0 .../i18n/hu.po | 0 .../i18n/it.po | 0 .../i18n/ja.po | 0 .../i18n/mk.po | 0 .../i18n/mn.po | 0 .../i18n/nb.po | 0 .../i18n/nl.po | 0 .../i18n/pl.po | 0 .../i18n/pt.po | 0 .../i18n/pt_BR.po | 0 .../i18n/ro.po | 0 .../i18n/ru.po | 0 .../i18n/sl.po | 0 .../i18n/sr@latin.po | 0 .../i18n/sv.po | 0 .../i18n/tr.po | 0 .../i18n/zh_CN.po | 0 .../google_base_account/controllers/main.py | 144 ------------------ addons/google_calendar/__init__.py | 1 + addons/google_calendar/__openerp__.py | 2 +- .../google_calendar/controllers/__init__.py | 1 + addons/google_calendar/controllers/main.py | 48 ++++++ addons/google_calendar/google_calendar.py | 2 +- addons/google_calendar/res_config.py | 2 +- addons/google_calendar/res_config_view.xml | 2 +- .../static/src/img/setup_09.png | Bin 12621 -> 17030 bytes .../static/src/js/calendar_sync.js | 2 +- addons/google_drive/__openerp__.py | 2 +- 44 files changed, 104 insertions(+), 155 deletions(-) rename addons/{google_base_account => google_account}/__init__.py (97%) rename addons/{google_base_account => google_account}/__openerp__.py (97%) rename addons/{google_base_account => google_account}/controllers/__init__.py (100%) create mode 100644 addons/google_account/controllers/main.py rename addons/{google_base_account/google_base_account.py => google_account/google_account.py} (98%) rename addons/{google_base_account/google_base_account_data.xml => google_account/google_account.xml} (100%) create mode 100644 addons/google_account/google_account_data.xml rename addons/{google_base_account => google_account}/i18n/ar.po (100%) rename addons/{google_base_account => google_account}/i18n/cs.po (100%) rename addons/{google_base_account => google_account}/i18n/de.po (100%) rename addons/{google_base_account => google_account}/i18n/es.po (100%) rename addons/{google_base_account => google_account}/i18n/es_CR.po (100%) rename addons/{google_base_account => google_account}/i18n/fi.po (100%) rename addons/{google_base_account => google_account}/i18n/fr.po (100%) rename addons/{google_base_account => google_account}/i18n/google_base_account.pot (100%) rename addons/{google_base_account => google_account}/i18n/hr.po (100%) rename addons/{google_base_account => google_account}/i18n/hu.po (100%) rename addons/{google_base_account => google_account}/i18n/it.po (100%) rename addons/{google_base_account => google_account}/i18n/ja.po (100%) rename addons/{google_base_account => google_account}/i18n/mk.po (100%) rename addons/{google_base_account => google_account}/i18n/mn.po (100%) rename addons/{google_base_account => google_account}/i18n/nb.po (100%) rename addons/{google_base_account => google_account}/i18n/nl.po (100%) rename addons/{google_base_account => google_account}/i18n/pl.po (100%) rename addons/{google_base_account => google_account}/i18n/pt.po (100%) rename addons/{google_base_account => google_account}/i18n/pt_BR.po (100%) rename addons/{google_base_account => google_account}/i18n/ro.po (100%) rename addons/{google_base_account => google_account}/i18n/ru.po (100%) rename addons/{google_base_account => google_account}/i18n/sl.po (100%) rename addons/{google_base_account => google_account}/i18n/sr@latin.po (100%) rename addons/{google_base_account => google_account}/i18n/sv.po (100%) rename addons/{google_base_account => google_account}/i18n/tr.po (100%) rename addons/{google_base_account => google_account}/i18n/zh_CN.po (100%) delete mode 100644 addons/google_base_account/controllers/main.py create mode 100644 addons/google_calendar/controllers/__init__.py create mode 100644 addons/google_calendar/controllers/main.py diff --git a/addons/google_base_account/__init__.py b/addons/google_account/__init__.py similarity index 97% rename from addons/google_base_account/__init__.py rename to addons/google_account/__init__.py index ee900c8febc..640a9747f2d 100644 --- a/addons/google_base_account/__init__.py +++ b/addons/google_account/__init__.py @@ -18,7 +18,7 @@ # along with this program. If not, see . # ############################################################################## -import google_base_account +import google_account import controllers # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/google_base_account/__openerp__.py b/addons/google_account/__openerp__.py similarity index 97% rename from addons/google_base_account/__openerp__.py rename to addons/google_account/__openerp__.py index 99678d2785d..5c3834ae65e 100644 --- a/addons/google_base_account/__openerp__.py +++ b/addons/google_account/__openerp__.py @@ -32,7 +32,7 @@ The module adds google user in res user. 'website': 'http://www.openerp.com', 'depends': ['base_setup'], 'data': [ - 'google_base_account_data.xml', + 'google_account_data.xml', ], 'demo': [], 'installable': True, diff --git a/addons/google_base_account/controllers/__init__.py b/addons/google_account/controllers/__init__.py similarity index 100% rename from addons/google_base_account/controllers/__init__.py rename to addons/google_account/controllers/__init__.py diff --git a/addons/google_account/controllers/main.py b/addons/google_account/controllers/main.py new file mode 100644 index 00000000000..7576351e470 --- /dev/null +++ b/addons/google_account/controllers/main.py @@ -0,0 +1,34 @@ +import simplejson +import urllib +import openerp +import openerp.addons.web.http as http +from openerp.addons.web.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 + +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 = simplejson.loads(kw['state']) + dbname = state.get('d') + service = state.get('s') + url_return = state.get('from') + + registry = openerp.modules.registry.RegistryManager.get(dbname) + with registry.cursor() as cr: + if kw.get('code'): + registry.get('google.%s' % service).set_all_tokens(cr,request.session.uid,kw['code']) + return werkzeug.utils.redirect(url_return) + + #TODO - Display error at customer if url contains ?Error= + elif kw.get('error'): + return werkzeug.utils.redirect("%s%s%s" % (url_return ,"?Error=" , kw.get('error'))) + else: + return werkzeug.utils.redirect("%s%s%s" % (url_return ,"?Error=Unknown_error")) + + diff --git a/addons/google_base_account/google_base_account.py b/addons/google_account/google_account.py similarity index 98% rename from addons/google_base_account/google_base_account.py rename to addons/google_account/google_account.py index ab4364ad52d..35a3da54971 100644 --- a/addons/google_base_account/google_base_account.py +++ b/addons/google_account/google_account.py @@ -81,8 +81,8 @@ class google_service(osv.osv_memory): 'client_id': client_id, 'state' : simplejson.dumps(state_obj), 'scope': scope or 'https://www.googleapis.com/auth/%s' % (service,), - 'redirect_uri': base_url + '/googleauth/oauth2callback', - 'approval_prompt':'force', + 'redirect_uri': base_url + '/google_account/authentication', + #'approval_prompt':'force', 'access_type':'offline' } @@ -100,7 +100,7 @@ class google_service(osv.osv_memory): 'client_id': client_id, 'client_secret': client_secret, 'grant_type' : 'authorization_code', - 'redirect_uri': base_url + '/googleauth/oauth2callback' + #'redirect_uri': base_url + '/google_account/authentication' } headers = {"content-type": "application/x-www-form-urlencoded"} diff --git a/addons/google_base_account/google_base_account_data.xml b/addons/google_account/google_account.xml similarity index 100% rename from addons/google_base_account/google_base_account_data.xml rename to addons/google_account/google_account.xml diff --git a/addons/google_account/google_account_data.xml b/addons/google_account/google_account_data.xml new file mode 100644 index 00000000000..c6748df7dc9 --- /dev/null +++ b/addons/google_account/google_account_data.xml @@ -0,0 +1,9 @@ + + + + + google_redirect_uri + urn:ietf:wg:oauth:2.0:oob + + + \ No newline at end of file diff --git a/addons/google_base_account/i18n/ar.po b/addons/google_account/i18n/ar.po similarity index 100% rename from addons/google_base_account/i18n/ar.po rename to addons/google_account/i18n/ar.po diff --git a/addons/google_base_account/i18n/cs.po b/addons/google_account/i18n/cs.po similarity index 100% rename from addons/google_base_account/i18n/cs.po rename to addons/google_account/i18n/cs.po diff --git a/addons/google_base_account/i18n/de.po b/addons/google_account/i18n/de.po similarity index 100% rename from addons/google_base_account/i18n/de.po rename to addons/google_account/i18n/de.po diff --git a/addons/google_base_account/i18n/es.po b/addons/google_account/i18n/es.po similarity index 100% rename from addons/google_base_account/i18n/es.po rename to addons/google_account/i18n/es.po diff --git a/addons/google_base_account/i18n/es_CR.po b/addons/google_account/i18n/es_CR.po similarity index 100% rename from addons/google_base_account/i18n/es_CR.po rename to addons/google_account/i18n/es_CR.po diff --git a/addons/google_base_account/i18n/fi.po b/addons/google_account/i18n/fi.po similarity index 100% rename from addons/google_base_account/i18n/fi.po rename to addons/google_account/i18n/fi.po diff --git a/addons/google_base_account/i18n/fr.po b/addons/google_account/i18n/fr.po similarity index 100% rename from addons/google_base_account/i18n/fr.po rename to addons/google_account/i18n/fr.po diff --git a/addons/google_base_account/i18n/google_base_account.pot b/addons/google_account/i18n/google_base_account.pot similarity index 100% rename from addons/google_base_account/i18n/google_base_account.pot rename to addons/google_account/i18n/google_base_account.pot diff --git a/addons/google_base_account/i18n/hr.po b/addons/google_account/i18n/hr.po similarity index 100% rename from addons/google_base_account/i18n/hr.po rename to addons/google_account/i18n/hr.po diff --git a/addons/google_base_account/i18n/hu.po b/addons/google_account/i18n/hu.po similarity index 100% rename from addons/google_base_account/i18n/hu.po rename to addons/google_account/i18n/hu.po diff --git a/addons/google_base_account/i18n/it.po b/addons/google_account/i18n/it.po similarity index 100% rename from addons/google_base_account/i18n/it.po rename to addons/google_account/i18n/it.po diff --git a/addons/google_base_account/i18n/ja.po b/addons/google_account/i18n/ja.po similarity index 100% rename from addons/google_base_account/i18n/ja.po rename to addons/google_account/i18n/ja.po diff --git a/addons/google_base_account/i18n/mk.po b/addons/google_account/i18n/mk.po similarity index 100% rename from addons/google_base_account/i18n/mk.po rename to addons/google_account/i18n/mk.po diff --git a/addons/google_base_account/i18n/mn.po b/addons/google_account/i18n/mn.po similarity index 100% rename from addons/google_base_account/i18n/mn.po rename to addons/google_account/i18n/mn.po diff --git a/addons/google_base_account/i18n/nb.po b/addons/google_account/i18n/nb.po similarity index 100% rename from addons/google_base_account/i18n/nb.po rename to addons/google_account/i18n/nb.po diff --git a/addons/google_base_account/i18n/nl.po b/addons/google_account/i18n/nl.po similarity index 100% rename from addons/google_base_account/i18n/nl.po rename to addons/google_account/i18n/nl.po diff --git a/addons/google_base_account/i18n/pl.po b/addons/google_account/i18n/pl.po similarity index 100% rename from addons/google_base_account/i18n/pl.po rename to addons/google_account/i18n/pl.po diff --git a/addons/google_base_account/i18n/pt.po b/addons/google_account/i18n/pt.po similarity index 100% rename from addons/google_base_account/i18n/pt.po rename to addons/google_account/i18n/pt.po diff --git a/addons/google_base_account/i18n/pt_BR.po b/addons/google_account/i18n/pt_BR.po similarity index 100% rename from addons/google_base_account/i18n/pt_BR.po rename to addons/google_account/i18n/pt_BR.po diff --git a/addons/google_base_account/i18n/ro.po b/addons/google_account/i18n/ro.po similarity index 100% rename from addons/google_base_account/i18n/ro.po rename to addons/google_account/i18n/ro.po diff --git a/addons/google_base_account/i18n/ru.po b/addons/google_account/i18n/ru.po similarity index 100% rename from addons/google_base_account/i18n/ru.po rename to addons/google_account/i18n/ru.po diff --git a/addons/google_base_account/i18n/sl.po b/addons/google_account/i18n/sl.po similarity index 100% rename from addons/google_base_account/i18n/sl.po rename to addons/google_account/i18n/sl.po diff --git a/addons/google_base_account/i18n/sr@latin.po b/addons/google_account/i18n/sr@latin.po similarity index 100% rename from addons/google_base_account/i18n/sr@latin.po rename to addons/google_account/i18n/sr@latin.po diff --git a/addons/google_base_account/i18n/sv.po b/addons/google_account/i18n/sv.po similarity index 100% rename from addons/google_base_account/i18n/sv.po rename to addons/google_account/i18n/sv.po diff --git a/addons/google_base_account/i18n/tr.po b/addons/google_account/i18n/tr.po similarity index 100% rename from addons/google_base_account/i18n/tr.po rename to addons/google_account/i18n/tr.po diff --git a/addons/google_base_account/i18n/zh_CN.po b/addons/google_account/i18n/zh_CN.po similarity index 100% rename from addons/google_base_account/i18n/zh_CN.po rename to addons/google_account/i18n/zh_CN.po diff --git a/addons/google_base_account/controllers/main.py b/addons/google_base_account/controllers/main.py deleted file mode 100644 index 30e72a86b82..00000000000 --- a/addons/google_base_account/controllers/main.py +++ /dev/null @@ -1,144 +0,0 @@ -import simplejson -import urllib -import openerp -import openerp.addons.web.http as http -from openerp.addons.web.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 - -class google_auth(http.Controller): - - @http.route('/googleauth/oauth2callback', type='http', auth="none") - def oauth2callback(self, **kw): - """ This route/function is called by Google when user Accept/Refuse the consent of Google """ - - state = simplejson.loads(kw['state']) - dbname = state.get('d') - service = state.get('s') - url_return = state.get('from') - - registry = openerp.modules.registry.RegistryManager.get(dbname) - with registry.cursor() as cr: - if kw.get('code'): - registry.get('google.%s' % service).set_all_tokens(cr,request.session.uid,kw['code']) - return werkzeug.utils.redirect(url_return) - - #TODO - Display error at customer if url contains ?Error= - elif kw.get('error'): - return werkzeug.utils.redirect("%s%s%s" % (url_return ,"?Error=" , kw.get('error'))) - else: - return werkzeug.utils.redirect("%s%s%s" % (url_return ,"?Error=Unknown_error")) - - - @http.route('/web_calendar_sync/sync_calendar/sync_data', type='json', auth='user') - def sync_data(self, arch, fields, model,**kw): - """ - This route/function is called when we want to synchronize openERP calendar with Google Calendar - - Function return a dictionary with the status : NeedConfigFromAdmin, NeedAuth, NeedRefresh, NoNewEventFromGoogle, SUCCESS if not crm meeting - The dictionary may contains an url, to allow OpenERP Client to redirect user on this URL for authorization for example - - """ - - if model == 'crm.meeting': - gs_obj = request.registry.get('google.service') - gc_obj = request.registry.get('google.calendar') - - # Checking that admin have already configured Google API for google synchronization ! - client_id = gs_obj.get_client_id(request.cr, request.uid,'calendar',context=kw.get('LocalContext')) - - if not client_id or client_id == '': - return { - "status" : "NeedConfigFromAdmin", - "url" : '' - } - - # Checking that user have already accepted OpenERP to access his calendar ! - if gc_obj.need_authorize(request.cr, request.uid,context=kw.get('LocalContext')): - url = gc_obj.authorize_google_uri(request.cr, request.uid, from_url=kw.get('fromurl'),context=kw.get('LocalContext')) - return { - "status" : "NeedAuth", - "url" : url - } - - # If App authorized, and user access accepted, We launch the synchronization - return gc_obj.synchronize_events(request.cr, request.uid, [], kw.get('LocalContext')) - - return { "status" : "SUCCESS" } - - - - - - - - - - - - - - - - - - - - - - - - - @http.route('/gmail/delete_all', type='http', auth='user') - def delete_all(self, **kw): - gs_obj = request.registry.get('google.service') - gc_obj = request.registry.get('google.calendar') - - #We check that admin has already configure api for google synchronization ! - client_id = gs_obj.get_client_id(request.cr, request.uid,'calendar',context=kw.get('LocalContext')) - - if not client_id or client_id == '': - return { - "status" : "NeedConfigFromAdmin", - "url" : '' - } - - #We check that user has already accepted openerp to access his calendar ! - if gc_obj.need_authorize(request.cr, request.uid,context=kw.get('LocalContext')): - url = gc_obj.authorize_google_uri(request.cr, request.uid, from_url=kw.get('fromurl'),context=kw.get('LocalContext')) - return { - "status" : "NeedAuth", - "url" : url - } - - #We launch the synchronization - gc_obj.delete_all(request.cr, request.uid, kw.get('LocalContext')) - - - - @http.route('/googleauth/AuthorizeMe', type='http', auth="none") - def authorize_app(self,**val): - if val.get('done'): - return; - registry = openerp.modules.registry.RegistryManager.get(request.session.get('db')) - gs_pool = registry.get('google.service') - with registry.cursor() as cr: - url = gs_pool._get_authorize_uri(cr,request.session.uid,service='calendar',from_url='') - return werkzeug.utils.redirect(url) ##REDIRECT WHERE THE USER WAS BEFORE (with state) - - - @http.route('/googleauth/GiveMeAToken', type='http', auth="none") - def authorize_me(self,**val): - registry = openerp.modules.registry.RegistryManager.get(request.session.get('db')) - gs_pool = registry.get('google.service') - with registry.cursor() as cr: - token = gs_pool._get_google_token_json(cr, request.session.uid, 'api_code') - - print '#####################################' - print '## YOUR TOKEN : ',token, " ##" - print '#####################################' - #return werkzeug.utils.redirect(url) - return - diff --git a/addons/google_calendar/__init__.py b/addons/google_calendar/__init__.py index 9311a17b228..addb295d7c1 100644 --- a/addons/google_calendar/__init__.py +++ b/addons/google_calendar/__init__.py @@ -1,2 +1,3 @@ import res_config import google_calendar +import controllers diff --git a/addons/google_calendar/__openerp__.py b/addons/google_calendar/__openerp__.py index fd885b406db..c85870f9dfd 100644 --- a/addons/google_calendar/__openerp__.py +++ b/addons/google_calendar/__openerp__.py @@ -30,7 +30,7 @@ The module adds the possibility to synchronize Google Calendar with OpenERP """, 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', - 'depends': ['google_base_account','base_calendar'], + 'depends': ['google_account','base_calendar'], 'css': ['static/src/css/*.css'], 'js': ['static/src/js/*.js'], 'qweb': ['static/src/xml/*.xml'], diff --git a/addons/google_calendar/controllers/__init__.py b/addons/google_calendar/controllers/__init__.py new file mode 100644 index 00000000000..8ee9bae18d9 --- /dev/null +++ b/addons/google_calendar/controllers/__init__.py @@ -0,0 +1 @@ +import main diff --git a/addons/google_calendar/controllers/main.py b/addons/google_calendar/controllers/main.py new file mode 100644 index 00000000000..a30ff0122fe --- /dev/null +++ b/addons/google_calendar/controllers/main.py @@ -0,0 +1,48 @@ +import simplejson +import urllib +import openerp +import openerp.addons.web.http as http +from openerp.addons.web.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 + +class google_calendar_controller(http.Controller): + + @http.route('/google_calendar/sync_data', type='json', auth='user') + def sync_data(self, arch, fields, model,**kw): + """ + This route/function is called when we want to synchronize openERP calendar with Google Calendar + + Function return a dictionary with the status : NeedConfigFromAdmin, NeedAuth, NeedRefresh, NoNewEventFromGoogle, SUCCESS if not crm meeting + The dictionary may contains an url, to allow OpenERP Client to redirect user on this URL for authorization for example + + """ + + if model == 'crm.meeting': + gs_obj = request.registry.get('google.service') + gc_obj = request.registry.get('google.calendar') + + # Checking that admin have already configured Google API for google synchronization ! + client_id = gs_obj.get_client_id(request.cr, request.uid,'calendar',context=kw.get('LocalContext')) + + if not client_id or client_id == '': + return { + "status" : "NeedConfigFromAdmin", + "url" : '' + } + + # Checking that user have already accepted OpenERP to access his calendar ! + if gc_obj.need_authorize(request.cr, request.uid,context=kw.get('LocalContext')): + url = gc_obj.authorize_google_uri(request.cr, request.uid, from_url=kw.get('fromurl'),context=kw.get('LocalContext')) + return { + "status" : "NeedAuth", + "url" : url + } + + # If App authorized, and user access accepted, We launch the synchronization + return gc_obj.synchronize_events(request.cr, request.uid, [], kw.get('LocalContext')) + + return { "status" : "SUCCESS" } + diff --git a/addons/google_calendar/google_calendar.py b/addons/google_calendar/google_calendar.py index 059207a562f..a0fc8f46732 100644 --- a/addons/google_calendar/google_calendar.py +++ b/addons/google_calendar/google_calendar.py @@ -678,7 +678,7 @@ class google_calendar(osv.osv): vals = {} vals['google_%s_rtoken' % self.STR_SERVICE] = all_token.get('refresh_token') - vals['google_%s_token_validity' % self.STR_SERVICE] = datetime.now() + timedelta(seconds=all_token.get('expires_in')) #NEED A CALCUL + vals['google_%s_token_validity' % self.STR_SERVICE] = datetime.now() + timedelta(seconds=all_token.get('expires_in')) vals['google_%s_token' % self.STR_SERVICE] = all_token.get('access_token') self.pool.get('res.users').write(cr,SUPERUSER_ID,uid,vals,context=context) diff --git a/addons/google_calendar/res_config.py b/addons/google_calendar/res_config.py index c86ae7824c4..a4ff58b6761 100644 --- a/addons/google_calendar/res_config.py +++ b/addons/google_calendar/res_config.py @@ -45,7 +45,7 @@ class calendar_config_settings(osv.osv_memory): cal_client_id = params.get_param(cr, uid, 'google_calendar_client_id',default='',context=context) cal_client_secret = params.get_param(cr, uid, 'google_calendar_client_secret',default='',context=context) - server_uri= "%s/googleauth/oauth2callback" % params.get_param(cr, uid, 'web.base.url',default="http://yourcompany.my.openerp.com",context=context) + server_uri= "%s/google_account/authentication" % params.get_param(cr, uid, 'web.base.url',default="http://yourcompany.my.openerp.com",context=context) return dict(cal_client_id=cal_client_id,cal_client_secret=cal_client_secret,server_uri=server_uri) diff --git a/addons/google_calendar/res_config_view.xml b/addons/google_calendar/res_config_view.xml index 41377c3ee57..7dbdf99103b 100644 --- a/addons/google_calendar/res_config_view.xml +++ b/addons/google_calendar/res_config_view.xml @@ -38,7 +38,7 @@
  • Now, you can click on "OAuth 2.0 Client ID" and see your Client ID and your Client Secret.
    You should now configure the allowed pages on which you will be redirected. To do it, you need to complete the field "Redirect RI" - and set as value (your own domain followed by "/googleauth/oauth2callback") : + and set as value (your own domain followed by "/google_account/authentication") :
    ==>

  • diff --git a/addons/google_calendar/static/src/img/setup_09.png b/addons/google_calendar/static/src/img/setup_09.png index f94c1e8c0f90c7c80d7bc4d7e615e9b2d433b773..e8cb4d8084ddb5e537c994da094b497c2d63f4a0 100644 GIT binary patch literal 17030 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 D*|CbA diff --git a/addons/google_calendar/static/src/js/calendar_sync.js b/addons/google_calendar/static/src/js/calendar_sync.js index 59f6ddef19c..dd5ae718e46 100644 --- a/addons/google_calendar/static/src/js/calendar_sync.js +++ b/addons/google_calendar/static/src/js/calendar_sync.js @@ -18,7 +18,7 @@ openerp.google_calendar = function(instance) { //$('div.oe_cal_sync_button').hide(); $('div.oe_cal_sync_button').prop('disabled',true); - self.rpc('/web_calendar_sync/sync_calendar/sync_data', { + self.rpc('/google_calendar/sync_data', { arch: res.arch, fields: res.fields, model:res.model, diff --git a/addons/google_drive/__openerp__.py b/addons/google_drive/__openerp__.py index 9e6c73d2649..8f135c5f9d1 100644 --- a/addons/google_drive/__openerp__.py +++ b/addons/google_drive/__openerp__.py @@ -39,7 +39,7 @@ 'demo': [ 'google_drive_demo.xml' ], - 'depends': ['base_setup', 'google_base_account'], + 'depends': ['base_setup', 'google_account'], 'description': """ Integrate google document to OpenERP record. ============================================