diff --git a/addons/google_base_account/google_base_account.py b/addons/google_base_account/google_base_account.py
index a6cf67bbe62..50fbf233ce6 100644
--- a/addons/google_base_account/google_base_account.py
+++ b/addons/google_base_account/google_base_account.py
@@ -28,7 +28,7 @@ import urllib2
import simplejson
-class google_service(osv.osv):
+class google_service(osv.osv_memory):
_name = 'google.service'
def generate_refresh_token(self, cr, uid, service, authorization_code, context=None):
@@ -51,10 +51,10 @@ class google_service(osv.osv):
content = simplejson.loads(content)
return content.get('refresh_token')
- def _get_google_token_uri(self, cr, uid, service, context=None):
+ def _get_google_token_uri(self, cr, uid, service, scope, context=None):
ir_config = self.pool['ir.config_parameter']
params = {
- 'scope': 'https://www.googleapis.com/auth/drive',
+ '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),
'response_type': 'code',
diff --git a/addons/google_drive/google_drive.py b/addons/google_drive/google_drive.py
index 1dc6b25f27c..e7622595afd 100644
--- a/addons/google_drive/google_drive.py
+++ b/addons/google_drive/google_drive.py
@@ -57,55 +57,60 @@ class config(osv.osv):
url = self.copy_doc(cr, uid, res_id, template_id, name_gdocs, model.model, context)
return url
- def copy_doc(self, cr, uid, res_id, template_id, name_gdocs, res_model, context=None):
+ def get_access_token(self, cr, uid, scope=None, context=None):
ir_config = self.pool['ir.config_parameter']
google_drive_refresh_token = ir_config.get_param(cr, SUPERUSER_ID, 'google_drive_refresh_token')
if not google_drive_refresh_token:
raise self.pool.get('res.config.settings').get_config_warning(cr, _("You haven't configured 'Authorization Code' generated from google, Please generate and configure it in %(menu:base_setup.menu_general_configuration)s."), context=context)
google_drive_client_id = ir_config.get_param(cr, SUPERUSER_ID, 'google_drive_client_id')
google_drive_client_secret = ir_config.get_param(cr, SUPERUSER_ID, 'google_drive_client_secret')
- google_web_base_url = ir_config.get_param(cr, SUPERUSER_ID, 'web.base.url')
-
#For Getting New Access Token With help of old Refresh Token
- headers = {"Content-type": "application/x-www-form-urlencoded", "Accept-Encoding": "gzip, deflate"}
- data = dict(client_id=google_drive_client_id,
- refresh_token=google_drive_refresh_token,
- client_secret=google_drive_client_secret,
- grant_type="refresh_token")
- data = urllib.urlencode(data)
+ data = urllib.urlencode(dict(client_id=google_drive_client_id,
+ refresh_token=google_drive_refresh_token,
+ client_secret=google_drive_client_secret,
+ grant_type="refresh_token",
+ scope=scope or 'https://www.googleapis.com/auth/drive'))
+ headers = {"Content-type": "application/x-www-form-urlencoded", "Accept-Encoding": "gzip, deflate"}
try:
req = urllib2.Request('https://accounts.google.com/o/oauth2/token', data, headers)
content = urllib2.urlopen(req).read()
- except urllib2.HTTPError:
+ except urllib2.HTTPError as e:
+ print vars(e)
+ print e.read()
raise self.pool.get('res.config.settings').get_config_warning(cr, _("Something went wrong during the token generation. Please request again an authorization code in %(menu:base_setup.menu_general_configuration)s."), context=context)
content = json.loads(content)
+ return content.get('access_token')
+ def copy_doc(self, cr, uid, res_id, template_id, name_gdocs, res_model, context=None):
+ ir_config = self.pool['ir.config_parameter']
+ google_web_base_url = ir_config.get_param(cr, SUPERUSER_ID, 'web.base.url')
+ access_token = self.get_access_token(cr, uid, context=context)
# Copy template in to drive with help of new access token
- if 'access_token' in content:
- request_url = "https://www.googleapis.com/drive/v2/files/%s?fields=parents/id&access_token=%s" % (template_id, content['access_token'])
- try:
- req = urllib2.Request(request_url, None, headers)
- parents = urllib2.urlopen(req).read()
- except urllib2.HTTPError:
- raise self.pool.get('res.config.settings').get_config_warning(cr, _("The Google Template cannot be found. Maybe it has been deleted."), context=context)
- parents_dict = json.loads(parents)
+ request_url = "https://www.googleapis.com/drive/v2/files/%s?fields=parents/id&access_token=%s" % (template_id, access_token)
+ headers = {"Content-type": "application/x-www-form-urlencoded", "Accept-Encoding": "gzip, deflate"}
+ try:
+ req = urllib2.Request(request_url, None, headers)
+ parents = urllib2.urlopen(req).read()
+ except urllib2.HTTPError:
+ raise self.pool.get('res.config.settings').get_config_warning(cr, _("The Google Template cannot be found. Maybe it has been deleted."), context=context)
+ parents_dict = json.loads(parents)
- record_url = "Click on link to open Record in OpenERP\n %s/?db=%s#id=%s&model=%s" % (google_web_base_url, cr.dbname, res_id, res_model)
- data = {"title": name_gdocs, "description": record_url, "parents": parents_dict['parents']}
- request_url = "https://www.googleapis.com/drive/v2/files/%s/copy?access_token=%s" % (template_id, content['access_token'])
- headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
- data_json = json.dumps(data)
- # resp, content = Http().request(request_url, "POST", data_json, headers)
- req = urllib2.Request(request_url, data_json, headers)
- content = urllib2.urlopen(req).read()
- content = json.loads(content)
- res = False
- if 'alternateLink' in content.keys():
- attach_pool = self.pool.get("ir.attachment")
- attach_vals = {'res_model': res_model, 'name': name_gdocs, 'res_id': res_id, 'type': 'url', 'url': content['alternateLink']}
- attach_pool.create(cr, uid, attach_vals)
- res = content['alternateLink']
+ record_url = "Click on link to open Record in OpenERP\n %s/?db=%s#id=%s&model=%s" % (google_web_base_url, cr.dbname, res_id, res_model)
+ data = {"title": name_gdocs, "description": record_url, "parents": parents_dict['parents']}
+ request_url = "https://www.googleapis.com/drive/v2/files/%s/copy?access_token=%s" % (template_id, access_token)
+ headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
+ data_json = json.dumps(data)
+ # resp, content = Http().request(request_url, "POST", data_json, headers)
+ req = urllib2.Request(request_url, data_json, headers)
+ content = urllib2.urlopen(req).read()
+ content = json.loads(content)
+ res = False
+ if 'alternateLink' in content.keys():
+ attach_pool = self.pool.get("ir.attachment")
+ attach_vals = {'res_model': res_model, 'name': name_gdocs, 'res_id': res_id, 'type': 'url', 'url': content['alternateLink']}
+ attach_pool.create(cr, uid, attach_vals)
+ res = content['alternateLink']
return res
def get_google_drive_config(self, cr, uid, res_model, res_id, context=None):
@@ -197,12 +202,15 @@ config()
class base_config_settings(osv.osv):
_inherit = "base.config.settings"
+ def _get_google_scope(self):
+ return 'https://www.googleapis.com/auth/drive'
+
_columns = {
'google_drive_authorization_code': fields.char('Authorization Code', size=124),
'google_drive_uri': fields.char('URI', readonly=True, help="The URL to generate the authorization code from Google"),
}
_defaults = {
- 'google_drive_uri': lambda s, cr, uid, c: s.pool['google.service']._get_google_token_uri(cr, uid, 'drive', context=c),
+ 'google_drive_uri': lambda s, cr, uid, c: s.pool['google.service']._get_google_token_uri(cr, uid, 'drive', scope=s._get_google_scope(), context=c),
}
def set_google_authorization_code(self, cr, uid, ids, context=None):
diff --git a/addons/google_drive/google_drive_data.xml b/addons/google_drive/google_drive_data.xml
index c9266547969..b1f9883c149 100644
--- a/addons/google_drive/google_drive_data.xml
+++ b/addons/google_drive/google_drive_data.xml
@@ -4,12 +4,12 @@
google_drive_client_id
- 39623646228-eg3ggo3mk6o40m7rguobi3rkl9frh4tb.apps.googleusercontent.com
+ 598905559630.apps.googleusercontent.com
google_drive_client_secret
- Ul-PtmnSWs3euWs20fdono0e
+ vTmou73c-njP-1qCxm7qx7QE
diff --git a/addons/google_spreadsheet/google_spreadsheet.py b/addons/google_spreadsheet/google_spreadsheet.py
index 08a8fa8d2cd..4f0471eae19 100644
--- a/addons/google_spreadsheet/google_spreadsheet.py
+++ b/addons/google_spreadsheet/google_spreadsheet.py
@@ -18,13 +18,73 @@
#
##############################################################################
+import simplejson
+from lxml import etree
+import requests
+
from openerp.osv import osv
+class base_config_settings(osv.osv):
+ _inherit = "base.config.settings"
+
+ def _get_google_scope(self):
+ return 'https://www.googleapis.com/auth/drive https://spreadsheets.google.com/feeds'
+
+
class config(osv.osv):
_inherit = 'google.drive.config'
- def set_spreadsheet(self, cr, uid, model, domain, groupbys, view_id, context=None):
+ def write_config_formula(self, cr, uid, spreadsheet_key, model, domain, groupbys, view_id, context=None):
+ access_token = self.get_access_token(cr, uid, scope='https://spreadsheets.google.com/feeds', context=context)
+
+ fields = self.pool.get(model).fields_view_get(cr, uid, view_id=view_id, view_type='tree')
+ doc = etree.XML(fields.get('arch'))
+ display_fields = []
+ for node in doc.xpath("//field"):
+ if node.get('modifiers'):
+ modifiers = simplejson.loads(node.get('modifiers'))
+ if not modifiers.get('invisible') and not modifiers.get('tree_invisible'):
+ display_fields.append(node.get('name'))
+ fields = " ".join(display_fields)
+ domain = domain.replace("'", r"\'").replace('"', "'")
+ if groupbys:
+ fields = "%s %s" % (groupbys, fields)
+ formula = '=oe_read_group("%s";"%s";"%s";"%s")' % (model, fields, groupbys, domain)
+ else:
+ formula = '=oe_browse("%s";"%s";"%s")' % (model, fields, domain)
+ url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
+ dbname = cr.dbname
+ user = self.pool['res.users'].read(cr, uid, uid, ['login', 'password'], context=context)
+ username = user['login']
+ password = user['password']
+ config_formula = '=oe_settings("%s";"%s";"%s";"%s")' % (url, dbname, username, password)
+ request = '''
+ https://spreadsheets.google.com/feeds/cells/%s/od6/private/full
+
+ A1
+
+ https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R1C1
+
+
+
+
+ A2
+
+ https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R60C15
+
+
+
+''' % (spreadsheet_key, spreadsheet_key, spreadsheet_key, formula, spreadsheet_key, spreadsheet_key, config_formula)
+
+ requests.post('https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/batch?v=3&access_token=%s' % (spreadsheet_key, access_token), data=request, headers={'content-type': 'application/atom+xml', 'If-Match': '*'})
+ return True
+
+ def set_spreadsheet(self, cr, uid, model, context=None):
try:
config_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'google_spreadsheet', 'google_spreadsheet_template')[1]
except ValueError:
diff --git a/addons/google_spreadsheet/static/src/js/search.js b/addons/google_spreadsheet/static/src/js/search.js
index beac52c4d6f..0812c12638e 100644
--- a/addons/google_spreadsheet/static/src/js/search.js
+++ b/addons/google_spreadsheet/static/src/js/search.js
@@ -34,9 +34,11 @@ openerp.google_spreadsheet = function(instance) {
var groupbys = instance.web.pyeval.eval('groupbys', data.groupbys).join(" ");
var view_id = view_id;
var ds = new instance.web.DataSet(self, 'google.drive.config');
- ds.call('set_spreadsheet', [model, domain, groupbys, view_id]).done(function (url) {
+ ds.call('set_spreadsheet', [model]).done(function (url) {
if (url){
window.open(url, '_blank');
+ var key = url.match("(key=|/d/)([A-Za-z0-9-_]+)")[2]
+ ds.call('write_config_formula', [key, model, domain, groupbys, view_id]);
}
});
});