summaryrefslogtreecommitdiff
path: root/addons/google_spreadsheet
diff options
context:
space:
mode:
Diffstat (limited to 'addons/google_spreadsheet')
-rw-r--r--addons/google_spreadsheet/__init__.py1
-rw-r--r--addons/google_spreadsheet/__openerp__.py43
-rw-r--r--addons/google_spreadsheet/google_spreadsheet.py119
-rw-r--r--addons/google_spreadsheet/google_spreadsheet_data.xml12
-rw-r--r--addons/google_spreadsheet/google_spreadsheet_view.xml65
-rw-r--r--addons/google_spreadsheet/i18n/google_spreadsheet.pot42
-rw-r--r--addons/google_spreadsheet/static/src/js/search.js54
-rw-r--r--addons/google_spreadsheet/static/src/xml/addtospreadsheet.xml5
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('"', '&quot;'), spreadsheet_key, spreadsheet_key, config_formula.replace('"', '&quot;'))
+
+ 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