From aa28839fb1818db22ce58606cc2a831ee39546ef Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Thu, 27 Jun 2013 19:11:37 +0200 Subject: [PATCH 01/15] [ADD]google_spreadsheet bzr revid: dle@openerp.com-20130627171137-5r1gyciz92c8abbr --- addons/google_spreadsheet/__init__.py | 1 + addons/google_spreadsheet/__openerp__.py | 43 +++++++++++++++ .../google_spreadsheet/google_spreadsheet.py | 34 ++++++++++++ .../google_spreadsheet_data.xml | 11 ++++ .../static/src/js/search.js | 54 +++++++++++++++++++ .../static/src/xml/addtospreadsheet.xml | 5 ++ 6 files changed, 148 insertions(+) create mode 100644 addons/google_spreadsheet/__init__.py create mode 100644 addons/google_spreadsheet/__openerp__.py create mode 100644 addons/google_spreadsheet/google_spreadsheet.py create mode 100644 addons/google_spreadsheet/google_spreadsheet_data.xml create mode 100644 addons/google_spreadsheet/static/src/js/search.js create mode 100644 addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml diff --git a/addons/google_spreadsheet/__init__.py b/addons/google_spreadsheet/__init__.py new file mode 100644 index 00000000000..f57aaed7749 --- /dev/null +++ b/addons/google_spreadsheet/__init__.py @@ -0,0 +1 @@ +import google_spreadsheet \ No newline at end of file diff --git a/addons/google_spreadsheet/__openerp__.py b/addons/google_spreadsheet/__openerp__.py new file mode 100644 index 00000000000..10a9a28de76 --- /dev/null +++ b/addons/google_spreadsheet/__openerp__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +{ + 'name': 'Google Spreadsheet', + 'version': '1.0', + 'category': 'Tools', + 'description': """ +The module adds the possibility to display data from OpenERP in Google Spreadsheets in real time. +======================================== +""", + 'author': 'OpenERP SA', + 'website': 'http://www.openerp.com', + 'depends': ['board', 'google_drive'], + 'js': [ + 'static/src/js/search.js', + ], + 'qweb': ['static/src/xml/*.xml'], + 'data': ['google_spreadsheet_data.xml'], + 'demo': [], + 'installable': True, + 'auto_install': False, +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/google_spreadsheet/google_spreadsheet.py b/addons/google_spreadsheet/google_spreadsheet.py new file mode 100644 index 00000000000..08a8fa8d2cd --- /dev/null +++ b/addons/google_spreadsheet/google_spreadsheet.py @@ -0,0 +1,34 @@ +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2012 OpenERP SA (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import osv + + +class config(osv.osv): + _inherit = 'google.drive.config' + + def set_spreadsheet(self, cr, uid, model, domain, groupbys, view_id, context=None): + try: + config_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'google_spreadsheet', 'google_spreadsheet_template')[1] + except ValueError: + raise + config = self.browse(cr, uid, config_id, context=context) + res = self.copy_doc(cr, uid, 1, config.google_drive_resource_id, 'Spreadsheet %s' % model, model, context=context) + return res diff --git a/addons/google_spreadsheet/google_spreadsheet_data.xml b/addons/google_spreadsheet/google_spreadsheet_data.xml new file mode 100644 index 00000000000..04c2122fabb --- /dev/null +++ b/addons/google_spreadsheet/google_spreadsheet_data.xml @@ -0,0 +1,11 @@ + + + + + Base Spreadsheet Template + + https://docs.google.com/spreadsheet/ccc?key=0ApGVjjwUC-ygdDZ0TG5EQnRlLVFQNlFGdFN5b1ZrY1E + Reporting %(name)s + + + \ No newline at end of file diff --git a/addons/google_spreadsheet/static/src/js/search.js b/addons/google_spreadsheet/static/src/js/search.js new file mode 100644 index 00000000000..beac52c4d6f --- /dev/null +++ b/addons/google_spreadsheet/static/src/js/search.js @@ -0,0 +1,54 @@ +openerp.google_spreadsheet = function(instance) { + var _t = instance.web._t; + instance.web.FormView.include({ + on_processed_onchange: function(result, processed) { + var self = this; + + var fields = self.fields; + _(result.selection).each(function (selection, fieldname) { + var field = fields[fieldname]; + if (!field) { return; } + field.field.selection = selection; + field.values = selection; + field.renderElement(); + }); + return this._super(result, processed); + }, + }); + instance.board.AddToGoogleSpreadsheet = instance.web.search.Input.extend({ + template: 'SearchView.addtogooglespreadsheet', + _in_drawer: true, + start: function () { + var self = this; + this.$el.on('click', 'h4', function(){ + var view = self.view; + var data = view.build_search_data(); + var model = view.model; + var list_view = self.view.getParent().views['list']; + var view_id = list_view ? list_view.view_id : false; + var context = new instance.web.CompoundContext(view.dataset.get_context() || []); + var domain = new instance.web.CompoundDomain(view.dataset.get_domain() || []); + _.each(data.contexts, context.add, context); + _.each(data.domains, domain.add, domain); + domain = JSON.stringify(domain.eval()); + 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) { + if (url){ + window.open(url, '_blank'); + } + }); + }); + }, + }); + instance.web.SearchView.include({ + add_common_inputs: function() { + this._super(); + var vm = this.getParent().getParent(); + if (vm.inner_action && vm.inner_action.views) { + (new instance.board.AddToGoogleSpreadsheet(this)); + } + } + }); +}; \ No newline at end of file diff --git a/addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml b/addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml new file mode 100644 index 00000000000..faf984141a6 --- /dev/null +++ b/addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml @@ -0,0 +1,5 @@ + \ No newline at end of file From 5a1b08bfbd9cc10e1a066dc39b1eeeaa47c3edec Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Mon, 22 Jul 2013 16:30:34 +0200 Subject: [PATCH 02/15] [FIX]google_spreadsheet: write formula once spreadsheet opened bzr revid: dle@openerp.com-20130722143034-4tf8mr71ocf049ma --- .../google_base_account.py | 6 +- addons/google_drive/google_drive.py | 76 ++++++++++--------- addons/google_drive/google_drive_data.xml | 4 +- .../google_spreadsheet/google_spreadsheet.py | 62 ++++++++++++++- .../static/src/js/search.js | 4 +- 5 files changed, 111 insertions(+), 41 deletions(-) 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]); } }); }); From 8fe619095bb4f4b5ddd1a379e1194bcb95a8bb5c Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Mon, 22 Jul 2013 18:45:08 +0200 Subject: [PATCH 03/15] [ADD]google_spreadsheet: view (ir.attachement) in reporting, formula used in description of attachement bzr revid: dle@openerp.com-20130722164508-1849vgrr6j0j6yhk --- addons/google_drive/google_drive.py | 10 +++---- addons/google_spreadsheet/__openerp__.py | 2 +- .../google_spreadsheet/google_spreadsheet.py | 28 ++++++++++++++----- .../static/src/js/search.js | 8 ++---- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/addons/google_drive/google_drive.py b/addons/google_drive/google_drive.py index e7622595afd..fa697372901 100644 --- a/addons/google_drive/google_drive.py +++ b/addons/google_drive/google_drive.py @@ -54,7 +54,7 @@ class config(osv.osv): attachment = attach_pool.browse(cr, uid, attach_ids[0], context) url = attachment.url else: - url = self.copy_doc(cr, uid, res_id, template_id, name_gdocs, model.model, context) + url = self.copy_doc(cr, uid, res_id, template_id, name_gdocs, model.model, context).get('url') return url def get_access_token(self, cr, uid, scope=None, context=None): @@ -105,12 +105,12 @@ class config(osv.osv): req = urllib2.Request(request_url, data_json, headers) content = urllib2.urlopen(req).read() content = json.loads(content) - res = False - if 'alternateLink' in content.keys(): + res = {} + if content.get('alternateLink'): 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'] + res['id'] = attach_pool.create(cr, uid, attach_vals) + res['url'] = content['alternateLink'] return res def get_google_drive_config(self, cr, uid, res_model, res_id, context=None): diff --git a/addons/google_spreadsheet/__openerp__.py b/addons/google_spreadsheet/__openerp__.py index 10a9a28de76..1ae2d48d349 100644 --- a/addons/google_spreadsheet/__openerp__.py +++ b/addons/google_spreadsheet/__openerp__.py @@ -35,7 +35,7 @@ The module adds the possibility to display data from OpenERP in Google Spreadshe 'static/src/js/search.js', ], 'qweb': ['static/src/xml/*.xml'], - 'data': ['google_spreadsheet_data.xml'], + 'data': ['google_spreadsheet_view.xml', 'google_spreadsheet_data.xml'], 'demo': [], 'installable': True, 'auto_install': False, diff --git a/addons/google_spreadsheet/google_spreadsheet.py b/addons/google_spreadsheet/google_spreadsheet.py index 4f0471eae19..17de4a37e1b 100644 --- a/addons/google_spreadsheet/google_spreadsheet.py +++ b/addons/google_spreadsheet/google_spreadsheet.py @@ -20,6 +20,7 @@ import simplejson from lxml import etree +import re import requests from openerp.osv import osv @@ -35,7 +36,7 @@ class base_config_settings(osv.osv): class config(osv.osv): _inherit = 'google.drive.config' - def write_config_formula(self, cr, uid, spreadsheet_key, model, domain, groupbys, view_id, context=None): + def write_config_formula(self, cr, uid, attachment_id, 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') @@ -50,15 +51,15 @@ class config(osv.osv): domain = domain.replace("'", r"\'").replace('"', "'") if groupbys: fields = "%s %s" % (groupbys, fields) - formula = '=oe_read_group("%s";"%s";"%s";"%s")' % (model, fields, groupbys, domain) + formula = '=oe_read_group("%s";"%s";"%s";"%s")' % (model, fields, groupbys, domain) else: - formula = '=oe_browse("%s";"%s";"%s")' % (model, fields, domain) + 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) + config_formula = '=oe_settings("%s";"%s";"%s";"%s")' % (url, dbname, username, password) request = ''' @@ -79,16 +80,29 @@ class config(osv.osv): href="https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R60C15"/> -''' % (spreadsheet_key, spreadsheet_key, spreadsheet_key, formula, spreadsheet_key, spreadsheet_key, config_formula) +''' % (spreadsheet_key, spreadsheet_key, spreadsheet_key, formula.replace('"', '"'), spreadsheet_key, spreadsheet_key, config_formula.replace('"', '"')) 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': '*'}) + + description = ''' + formula: %s + ''' % formula + if attachment_id: + self.pool['ir.attachment'].write(cr, uid, attachment_id, {'description': description}, context=context) return True - def set_spreadsheet(self, cr, uid, model, context=None): + def set_spreadsheet(self, cr, uid, model, domain, groupbys, view_id, context=None): try: config_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'google_spreadsheet', 'google_spreadsheet_template')[1] except ValueError: raise config = self.browse(cr, uid, config_id, context=context) - res = self.copy_doc(cr, uid, 1, config.google_drive_resource_id, 'Spreadsheet %s' % model, model, context=context) + title = 'Spreadsheet %s' % model + res = self.copy_doc(cr, uid, 1, config.google_drive_resource_id, title, model, context=context) + + mo = re.search("(key=|/d/)([A-Za-z0-9-_]+)", res['url']) + if mo: + key = mo.group(2) + + self.write_config_formula(cr, uid, res.get('id'), key, model, domain, groupbys, view_id, context=context) return res diff --git a/addons/google_spreadsheet/static/src/js/search.js b/addons/google_spreadsheet/static/src/js/search.js index 0812c12638e..c46ec615792 100644 --- a/addons/google_spreadsheet/static/src/js/search.js +++ b/addons/google_spreadsheet/static/src/js/search.js @@ -34,11 +34,9 @@ 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]).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]); + ds.call('set_spreadsheet', [model, domain, groupbys, view_id]).done(function (res) { + if (res['url']){ + window.open(res['url'], '_blank'); } }); }); From 7415da971da1205c9ae1b9c9c4fce8f0915f9a4a Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Mon, 22 Jul 2013 18:52:38 +0200 Subject: [PATCH 04/15] [FIX]google_spreadsheet: add missing file bzr revid: dle@openerp.com-20130722165238-rreum7iphpaqx995 --- .../google_spreadsheet_view.xml | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 addons/google_spreadsheet/google_spreadsheet_view.xml diff --git a/addons/google_spreadsheet/google_spreadsheet_view.xml b/addons/google_spreadsheet/google_spreadsheet_view.xml new file mode 100644 index 00000000000..f247880e03a --- /dev/null +++ b/addons/google_spreadsheet/google_spreadsheet_view.xml @@ -0,0 +1,65 @@ + + + + + + + + ir.attachment.google.spreadsheet.tree + ir.attachment + + + + + + + + + + ir.attachment.google.spreadsheet.form + ir.attachment + +
+ + + + + + + + + + +
+
+
+ + + Google Spreadsheets + ir.attachment + form + tree,form + {} + [('url', 'like', '/spreadsheet/')] + Google Spreadsheets + + + + + tree + + + + + + + form + + + + + +
+
\ No newline at end of file From 9ae6b18ded02771591c83e74807c1e4447a8d14f Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Tue, 23 Jul 2013 15:04:53 +0200 Subject: [PATCH 05/15] [FIX]google_spreadsheet: add active field on google drive template and handle when auth_crypt is installed bzr revid: dle@openerp.com-20130723130453-0vns37b89v622kh0 --- addons/google_drive/google_drive.py | 2 ++ addons/google_drive/res_config_user_view.xml | 1 + addons/google_spreadsheet/google_spreadsheet.py | 6 +++++- addons/google_spreadsheet/google_spreadsheet_data.xml | 1 + addons/google_spreadsheet/google_spreadsheet_view.xml | 2 +- 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/addons/google_drive/google_drive.py b/addons/google_drive/google_drive.py index fa697372901..717c20007d4 100644 --- a/addons/google_drive/google_drive.py +++ b/addons/google_drive/google_drive.py @@ -171,6 +171,7 @@ class config(osv.osv): 'google_drive_resource_id': fields.function(_resource_get, type="char", string='Resource Id'), 'google_drive_client_id': fields.function(_client_id_get, type="char", string='Google Client '), 'name_template': fields.char('Google Drive Name Pattern', size=64, help='Choose how the new google drive will be named, on google side. Eg. gdoc_%(field_name)s', required=True), + 'active': fields.boolean('Active'), } def onchange_model_id(self, cr, uid, ids, model_id, context=None): @@ -184,6 +185,7 @@ class config(osv.osv): _defaults = { 'name_template': 'Document %(name)s', + 'active': True, } def _check_model_id(self, cr, uid, ids, context=None): diff --git a/addons/google_drive/res_config_user_view.xml b/addons/google_drive/res_config_user_view.xml index 728ef03c5dd..8e4cc5c60a5 100644 --- a/addons/google_drive/res_config_user_view.xml +++ b/addons/google_drive/res_config_user_view.xml @@ -23,6 +23,7 @@ +