diff options
Diffstat (limited to 'addons/google_spreadsheet')
| -rw-r--r-- | addons/google_spreadsheet/__init__.py | 1 | ||||
| -rw-r--r-- | addons/google_spreadsheet/__openerp__.py | 43 | ||||
| -rw-r--r-- | addons/google_spreadsheet/google_spreadsheet.py | 119 | ||||
| -rw-r--r-- | addons/google_spreadsheet/google_spreadsheet_data.xml | 12 | ||||
| -rw-r--r-- | addons/google_spreadsheet/google_spreadsheet_view.xml | 65 | ||||
| -rw-r--r-- | addons/google_spreadsheet/i18n/google_spreadsheet.pot | 42 | ||||
| -rw-r--r-- | addons/google_spreadsheet/static/src/js/search.js | 54 | ||||
| -rw-r--r-- | addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml | 5 |
8 files changed, 341 insertions, 0 deletions
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..1ae2d48d349 --- /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 (<http://tiny.be>). +# +# 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 <http://www.gnu.org/licenses/>. +# +############################################################################## + + +{ + '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_view.xml', '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..693300904d0 --- /dev/null +++ b/addons/google_spreadsheet/google_spreadsheet.py @@ -0,0 +1,119 @@ +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2012 OpenERP SA (<http://www.openerp.com>). +# +# 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 <http://www.gnu.org/licenses/>. +# +############################################################################## + +import simplejson +import logging +from lxml import etree +import re +import urllib +import urllib2 + +from openerp.osv import osv +from openerp import SUPERUSER_ID + +_logger = logging.getLogger(__name__) + +class config(osv.osv): + _inherit = 'google.drive.config' + + def get_google_scope(self): + scope = super(config, self).get_google_scope() + return '%s https://spreadsheets.google.com/feeds' % scope + + 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') + 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'] + if self.pool['ir.module.module'].search_count(cr, SUPERUSER_ID, ['&', ('name', '=', 'auth_crypt'), ('state', '=', 'installed')]) == 1: + config_formula = '=oe_settings("%s";"%s")' % (url, dbname) + else: + config_formula = '=oe_settings("%s";"%s";"%s";"%s")' % (url, dbname, username, password) + request = '''<feed xmlns="http://www.w3.org/2005/Atom" + xmlns:batch="http://schemas.google.com/gdata/batch" + xmlns:gs="http://schemas.google.com/spreadsheets/2006"> + <id>https://spreadsheets.google.com/feeds/cells/%s/od6/private/full</id> + <entry> + <batch:id>A1</batch:id> + <batch:operation type="update"/> + <id>https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R1C1</id> + <link rel="edit" type="application/atom+xml" + href="https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R1C1"/> + <gs:cell row="1" col="1" inputValue="%s"/> + </entry> + <entry> + <batch:id>A2</batch:id> + <batch:operation type="update"/> + <id>https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R60C15</id> + <link rel="edit" type="application/atom+xml" + href="https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/R60C15"/> + <gs:cell row="60" col="15" inputValue="%s"/> + </entry> +</feed>''' % (spreadsheet_key, spreadsheet_key, spreadsheet_key, formula.replace('"', '"'), spreadsheet_key, spreadsheet_key, config_formula.replace('"', '"')) + + try: + req = urllib2.Request( + 'https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/batch?%s' % (spreadsheet_key, urllib.urlencode({'v': 3, 'access_token': access_token})), + data=request, + headers={'content-type': 'application/atom+xml', 'If-Match': '*'}) + urllib2.urlopen(req) + except (urllib2.HTTPError, urllib2.URLError): + _logger.warning("An error occured while writting the formula on the Google Spreadsheet.") + + 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, 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) + title = 'Spreadsheet %s' % model + res = self.copy_doc(cr, uid, False, 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/google_spreadsheet_data.xml b/addons/google_spreadsheet/google_spreadsheet_data.xml new file mode 100644 index 00000000000..19802e9d140 --- /dev/null +++ b/addons/google_spreadsheet/google_spreadsheet_data.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + <record id="google_spreadsheet_template" model="google.drive.config"> + <field name="name">Base Spreadsheet Template</field> + <field name="model_id" ref="base.model_res_partner"/> + <field name="google_drive_template_url">https://docs.google.com/spreadsheet/ccc?key=0ApGVjjwUC-ygdDZ0TG5EQnRlLVFQNlFGdFN5b1ZrY1E</field> + <field name="name_template">Reporting %(name)s</field> + <field name="active" eval="0" /> + </record> + </data> +</openerp>
\ No newline at end of file diff --git a/addons/google_spreadsheet/google_spreadsheet_view.xml b/addons/google_spreadsheet/google_spreadsheet_view.xml new file mode 100644 index 00000000000..e99826dae52 --- /dev/null +++ b/addons/google_spreadsheet/google_spreadsheet_view.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <!-- add google drive config field in user form --> + + <record model="ir.ui.view" id="view_ir_attachment_google_spreadsheet_tree"> + <field name="name">ir.attachment.google.spreadsheet.tree</field> + <field name="model">ir.attachment</field> + <field name="arch" type="xml"> + <tree string="Google Spreadsheets" version="7.0"> + <field name="name" string="Name"/> + <field name="url" /> + </tree> + </field> + </record> + + <record model="ir.ui.view" id="view_ir_attachment_google_spreadsheet_form"> + <field name="name">ir.attachment.google.spreadsheet.form</field> + <field name="model">ir.attachment</field> + <field name="arch" type="xml"> + <form string="Google Spreadsheets" version="7.0"> + <sheet> + <group> + <group> + <field name="name" string="Name"/> + <field name="url" widget="url"/> + </group> + <group colspan="2"> + <label for="description" colspan="2"/> + <field name="description" nolabel="1" colspan="2"/> + </group> + </group> + </sheet> + </form> + </field> + </record> + + <record id="action_ir_attachment_google_spreadsheet_tree" model="ir.actions.act_window"> + <field name="name">Google Spreadsheets</field> + <field name="res_model">ir.attachment</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form</field> + <field name="context">{}</field> + <field name="domain">[('url', 'like', '/spreadsheet/')]</field> + <field name="help">Google Spreadsheets</field> + </record> + + <record id="action_ir_attachment_google_spreadsheet_tree_view" model="ir.actions.act_window.view"> + <field eval="1" name="sequence"/> + <field name="view_mode">tree</field> + <field name="view_id" ref="view_ir_attachment_google_spreadsheet_tree"/> + <field name="act_window_id" ref="action_ir_attachment_google_spreadsheet_tree"/> + </record> + + <record id="action_ir_attachment_google_spreadsheet_form_view" model="ir.actions.act_window.view"> + <field eval="2" name="sequence"/> + <field name="view_mode">form</field> + <field name="view_id" ref="view_ir_attachment_google_spreadsheet_form"/> + <field name="act_window_id" ref="action_ir_attachment_google_spreadsheet_tree"/> + </record> + + <menuitem id="menu_reporting_dashboard_google_spreadsheets" parent="base.menu_reporting_dashboard" action="action_ir_attachment_google_spreadsheet_tree"/> + </data> +</openerp>
\ No newline at end of file diff --git a/addons/google_spreadsheet/i18n/google_spreadsheet.pot b/addons/google_spreadsheet/i18n/google_spreadsheet.pot new file mode 100644 index 00000000000..3cf39bd8df5 --- /dev/null +++ b/addons/google_spreadsheet/i18n/google_spreadsheet.pot @@ -0,0 +1,42 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * google_spreadsheet +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 8.0alpha1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-07-25 12:39+0000\n" +"PO-Revision-Date: 2013-07-25 12:39+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: google_spreadsheet +#: model:ir.actions.act_window,help:google_spreadsheet.action_ir_attachment_google_spreadsheet_tree +#: model:ir.actions.act_window,name:google_spreadsheet.action_ir_attachment_google_spreadsheet_tree +#: view:ir.attachment:0 +#: model:ir.ui.menu,name:google_spreadsheet.menu_reporting_dashboard_google_spreadsheets +msgid "Google Spreadsheets" +msgstr "" + +#. module: google_spreadsheet +#. openerp-web +#: code:addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml:3 +#, python-format +msgid "Add to Google Spreadsheet" +msgstr "" + +#. module: google_spreadsheet +#: view:ir.attachment:0 +msgid "Name" +msgstr "" + +#. module: google_spreadsheet +#: model:ir.model,name:google_spreadsheet.model_google_drive_config +msgid "Google Drive templates config" +msgstr "" + 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..c46ec615792 --- /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 (res) { + if (res['url']){ + window.open(res['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 @@ +<template> +<div t-name="SearchView.addtogooglespreadsheet" class="oe_searchview_dashboard"> + <h4>Add to Google Spreadsheet</h4> +</div> +</template>
\ No newline at end of file |
