Skip to content
Snippets Groups Projects
Commit b8391031 authored by Kevin Baptiste's avatar Kevin Baptiste
Browse files

[FIX] google_spreadsheet: show instructions to manually create Google Sheet


On October 3rd 2022 the Google OOB authentication flow will stop working.

From that date on, this module will stop working since it uses the
access_token obtained in the `google_drive` module to create the requested
spreadsheet inside the user's own Google Drive account.

Instead we will display instructions to the users to allow them to
manually create the requested document.

task-2977578

closes odoo/odoo#99988

Signed-off-by: default avatarKevin Baptiste <kba@odoo.com>
parent d27e3607
No related branches found
No related tags found
No related merge requests found
...@@ -26,21 +26,8 @@ class GoogleDrive(models.Model): ...@@ -26,21 +26,8 @@ class GoogleDrive(models.Model):
def write_config_formula(self, attachment_id, spreadsheet_key, model, domain, groupbys, view_id): def write_config_formula(self, attachment_id, spreadsheet_key, model, domain, groupbys, view_id):
access_token = self.get_access_token(scope='https://www.googleapis.com/auth/spreadsheets') access_token = self.get_access_token(scope='https://www.googleapis.com/auth/spreadsheets')
fields = self.env[model].fields_view_get(view_id=view_id, view_type='tree') formula = self._get_data_formula(model, domain, groupbys, view_id)
doc = etree.XML(fields.get('arch'))
display_fields = []
for node in doc.xpath("//field"):
if node.get('modifiers'):
modifiers = json.loads(node.get('modifiers'))
if not modifiers.get('invisible') and not modifiers.get('column_invisible'):
display_fields.append(node.get('name'))
fields = " ".join(display_fields)
domain = domain.replace("'", r"\'").replace('"', "'").replace('True', 'true').replace('False', 'false')
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.env['ir.config_parameter'].sudo().get_param('web.base.url') url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
dbname = self._cr.dbname dbname = self._cr.dbname
user = self.env['res.users'].browse(self.env.user.id).read(['login', 'password'])[0] user = self.env['res.users'].browse(self.env.user.id).read(['login', 'password'])[0]
...@@ -74,6 +61,24 @@ class GoogleDrive(models.Model): ...@@ -74,6 +61,24 @@ class GoogleDrive(models.Model):
self.env['ir.attachment'].browse(attachment_id).write({'description': description}) self.env['ir.attachment'].browse(attachment_id).write({'description': description})
return True return True
def _get_data_formula(self, model, domain, groupbys, view_id):
fields = self.env[model].fields_view_get(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 = json.loads(node.get('modifiers'))
if not modifiers.get('invisible') and not modifiers.get('column_invisible'):
display_fields.append(node.get('name'))
fields = " ".join(display_fields)
domain = domain.replace("'", r"\'").replace('"', "'").replace('True', 'true').replace('False', 'false')
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)
return formula
@api.model @api.model
def set_spreadsheet(self, model, domain, groupbys, view_id): def set_spreadsheet(self, model, domain, groupbys, view_id):
try: try:
...@@ -81,6 +86,14 @@ class GoogleDrive(models.Model): ...@@ -81,6 +86,14 @@ class GoogleDrive(models.Model):
except ValueError: except ValueError:
raise raise
config = self.browse(config_id) config = self.browse(config_id)
if self._module_deprecated():
return {
'url': config.google_drive_template_url,
'deprecated': True,
'formula': self._get_data_formula(model, domain, groupbys, view_id),
}
title = 'Spreadsheet %s' % model title = 'Spreadsheet %s' % model
res = self.copy_doc(False, config.google_drive_resource_id, title, model) res = self.copy_doc(False, config.google_drive_resource_id, title, model)
......
...@@ -11,6 +11,8 @@ var Widget = require('web.Widget'); ...@@ -11,6 +11,8 @@ var Widget = require('web.Widget');
var QWeb = core.qweb; var QWeb = core.qweb;
var Dialog = require('web.Dialog');
var AddToGoogleSpreadsheetMenu = Widget.extend({ var AddToGoogleSpreadsheetMenu = Widget.extend({
events: _.extend({}, Widget.prototype.events, { events: _.extend({}, Widget.prototype.events, {
'click .add_to_spreadsheet': '_onAddToSpreadsheetClick', 'click .add_to_spreadsheet': '_onAddToSpreadsheetClick',
...@@ -62,9 +64,19 @@ var AddToGoogleSpreadsheetMenu = Widget.extend({ ...@@ -62,9 +64,19 @@ var AddToGoogleSpreadsheetMenu = Widget.extend({
var domain = searchQuery.domain; var domain = searchQuery.domain;
var groupBys = pyUtils.eval('groupbys', searchQuery.groupBys).join(" "); var groupBys = pyUtils.eval('groupbys', searchQuery.groupBys).join(" ");
var ds = new data.DataSet(this, 'google.drive.config'); var ds = new data.DataSet(this, 'google.drive.config');
this.dialog = null;
var self = this;
ds.call('set_spreadsheet', [modelName, Domain.prototype.arrayToString(domain), groupBys, list_view_id]) ds.call('set_spreadsheet', [modelName, Domain.prototype.arrayToString(domain), groupBys, list_view_id])
.then(function (res) { .then(function (res) {
if (res.deprecated) {
self.dialog = new Dialog(this, {
title: _('Google Spreadsheet'),
$content: QWeb.render('GoogleSpreadsheet.FormulaDialog', {url: res.url, formula: res.formula}),
})
self.dialog.open();
return;
}
if (res.url){ if (res.url){
window.open(res.url, '_blank'); window.open(res.url, '_blank');
} }
......
...@@ -2,4 +2,15 @@ ...@@ -2,4 +2,15 @@
<div t-name="SearchView.addtogooglespreadsheet"> <div t-name="SearchView.addtogooglespreadsheet">
<a class="add_to_spreadsheet dropdown-item">Add to Google Spreadsheet</a> <a class="add_to_spreadsheet dropdown-item">Add to Google Spreadsheet</a>
</div> </div>
<div t-name="GoogleSpreadsheet.FormulaDialog">
<p>To insert this data inside of a Google Sheet:</p>
<ul>
<li>Duplicate the <a t-att-href="url" target="_blank">Spreadsheet Template</a></li>
<li>Setup your Odoo credentials in the sheet via the <code>Odoo &gt; Settings</code> menu</li>
<li>Paste the following formula in your spreadsheet:<br/>
<code><t t-esc="formula"/></code>
</li>
</ul>
</div>
</template> </template>
...@@ -6,14 +6,7 @@ ...@@ -6,14 +6,7 @@
<field name="model">res.config.settings</field> <field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form" /> <field name="inherit_id" ref="base_setup.res_config_settings_view_form" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//div[@id='msg_module_google_spreadsheet']" position="replace"> <xpath expr="//div[@id='msg_module_google_spreadsheet']" position="replace"/>
<div class="content-group" attrs="{'invisible': [('module_google_spreadsheet','=',False)]}">
<div class="content-group mt16">
Please use the settings of Google Drive
on the left or above.
</div>
</div>
</xpath>
</field> </field>
</record> </record>
</odoo> </odoo>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment