Skip to content
Snippets Groups Projects
Commit 1302bcea 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#99999

Signed-off-by: default avatarKevin Baptiste <kba@odoo.com>
parent 79694a88
Branches
Tags
No related merge requests found
......@@ -26,21 +26,8 @@ class GoogleDrive(models.Model):
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')
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)
formula = self._get_data_formula(model, domain, groupbys, view_id)
url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
dbname = self._cr.dbname
user = self.env['res.users'].browse(self.env.user.id).read(['login', 'password'])[0]
......@@ -74,6 +61,24 @@ class GoogleDrive(models.Model):
self.env['ir.attachment'].browse(attachment_id).write({'description': description})
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
def set_spreadsheet(self, model, domain, groupbys, view_id):
try:
......@@ -81,6 +86,14 @@ class GoogleDrive(models.Model):
except ValueError:
raise
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
res = self.copy_doc(False, config.google_drive_resource_id, title, model)
......
......@@ -5,6 +5,9 @@ odoo.define('board.AddToGoogleSpreadsheetMenu', function (require) {
const DropdownMenuItem = require('web.DropdownMenuItem');
const FavoriteMenu = require('web.FavoriteMenu');
const Dialog = require('web.OwlDialog');
const { useState } = owl.hooks;
/**
* 'Add to Google spreadsheet' menu
*
......@@ -14,6 +17,15 @@ odoo.define('board.AddToGoogleSpreadsheetMenu', function (require) {
* @extends DropdownMenuItem
*/
class AddToGoogleSpreadsheetMenu extends DropdownMenuItem {
constructor() {
super(...arguments);
this.state = useState({
showDialog: false,
url: false,
formula: false,
});
}
//---------------------------------------------------------------------
// Handlers
......@@ -34,6 +46,13 @@ odoo.define('board.AddToGoogleSpreadsheetMenu', function (require) {
method: 'set_spreadsheet',
args: [modelName, domain, groupBys, listViewId],
});
if (result.deprecated) {
this.state.url = result.url;
this.state.formula = result.formula;
this.state.showDialog = true;
this.state.open = false;
return;
}
if (result.url) {
// According to MDN doc, one should not use _blank as title.
// todo: find a good name for the new window
......@@ -54,6 +73,7 @@ odoo.define('board.AddToGoogleSpreadsheetMenu', function (require) {
}
}
AddToGoogleSpreadsheetMenu.components = { Dialog };
AddToGoogleSpreadsheetMenu.props = {};
AddToGoogleSpreadsheetMenu.template = 'AddToGoogleSpreadsheetMenu';
......
......@@ -3,5 +3,21 @@
<li class="o_menu_item o_add_to_spreadsheet" role="menuitem">
<a class="dropdown-item" href="#" t-on-click.prevent="_onAddToSpreadsheet">Add to Google Spreadsheet</a>
</li>
<Dialog
title="'Google Spreadsheet'"
t-if="state.showDialog"
t-on-dialog-closed="state.showDialog = false">
<div>
<p>To insert this data inside of a Google Sheet:</p>
<ul>
<li>Duplicate the <a t-att-href="state.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="state.formula"/></code>
</li>
</ul>
</div>
</Dialog>
</t>
</template>
......@@ -6,14 +6,7 @@
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form" />
<field name="arch" type="xml">
<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>
<xpath expr="//div[@id='msg_module_google_spreadsheet']" position="replace"/>
</field>
</record>
</odoo>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment