summaryrefslogtreecommitdiff
path: root/addons/google_spreadsheet/models
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/google_spreadsheet/models
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/google_spreadsheet/models')
-rw-r--r--addons/google_spreadsheet/models/__init__.py5
-rw-r--r--addons/google_spreadsheet/models/google_drive.py107
-rw-r--r--addons/google_spreadsheet/models/res_config_settings.py10
3 files changed, 122 insertions, 0 deletions
diff --git a/addons/google_spreadsheet/models/__init__.py b/addons/google_spreadsheet/models/__init__.py
new file mode 100644
index 00000000..c8728366
--- /dev/null
+++ b/addons/google_spreadsheet/models/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import res_config_settings
+from . import google_drive
diff --git a/addons/google_spreadsheet/models/google_drive.py b/addons/google_spreadsheet/models/google_drive.py
new file mode 100644
index 00000000..0f4f830b
--- /dev/null
+++ b/addons/google_spreadsheet/models/google_drive.py
@@ -0,0 +1,107 @@
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import json
+import logging
+
+import requests
+from lxml import etree
+import re
+import werkzeug.urls
+
+from odoo import api, models
+from odoo.tools import misc
+from odoo.addons.google_account import TIMEOUT
+
+_logger = logging.getLogger(__name__)
+
+
+class GoogleDrive(models.Model):
+ _inherit = 'google.drive.config'
+
+ def get_google_scope(self):
+ scope = super(GoogleDrive, self).get_google_scope()
+ return '%s https://spreadsheets.google.com/feeds' % scope
+
+ @api.model
+ def write_config_formula(self, attachment_id, spreadsheet_key, model, domain, groupbys, view_id):
+ access_token = self.get_access_token(scope='https://spreadsheets.google.com/feeds')
+
+ 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)
+ 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]
+ username = user['login']
+ password = user['password']
+ if not password:
+ 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/{key}/od6/private/full</id>
+ <entry>
+ <batch:id>A1</batch:id>
+ <batch:operation type="update"/>
+ <id>https://spreadsheets.google.com/feeds/cells/{key}/od6/private/full/R1C1</id>
+ <link rel="edit" type="application/atom+xml"
+ href="https://spreadsheets.google.com/feeds/cells/{key}/od6/private/full/R1C1"/>
+ <gs:cell row="1" col="1" inputValue="{formula}"/>
+ </entry>
+ <entry>
+ <batch:id>A2</batch:id>
+ <batch:operation type="update"/>
+ <id>https://spreadsheets.google.com/feeds/cells/{key}/od6/private/full/R60C15</id>
+ <link rel="edit" type="application/atom+xml"
+ href="https://spreadsheets.google.com/feeds/cells/{key}/od6/private/full/R60C15"/>
+ <gs:cell row="60" col="15" inputValue="{config}"/>
+ </entry>
+</feed>''' .format(key=spreadsheet_key, formula=misc.html_escape(formula), config=misc.html_escape(config_formula))
+
+ try:
+ req = requests.post(
+ 'https://spreadsheets.google.com/feeds/cells/%s/od6/private/full/batch?%s' % (spreadsheet_key, werkzeug.urls.url_encode({'v': 3, 'access_token': access_token})),
+ data=request,
+ headers={'content-type': 'application/atom+xml', 'If-Match': '*'},
+ timeout=TIMEOUT,
+ )
+ except IOError:
+ _logger.warning("An error occured while writing the formula on the Google Spreadsheet.")
+
+ description = '''
+ formula: %s
+ ''' % formula
+ if attachment_id:
+ self.env['ir.attachment'].browse(attachment_id).write({'description': description})
+ return True
+
+ @api.model
+ def set_spreadsheet(self, model, domain, groupbys, view_id):
+ try:
+ config_id = self.env['ir.model.data'].get_object_reference('google_spreadsheet', 'google_spreadsheet_template')[1]
+ except ValueError:
+ raise
+ config = self.browse(config_id)
+ title = 'Spreadsheet %s' % model
+ res = self.copy_doc(False, config.google_drive_resource_id, title, model)
+
+ mo = re.search("(key=|/d/)([A-Za-z0-9-_]+)", res['url'])
+ if mo:
+ key = mo.group(2)
+
+ self.write_config_formula(res.get('id'), key, model, domain, groupbys, view_id)
+ return res
diff --git a/addons/google_spreadsheet/models/res_config_settings.py b/addons/google_spreadsheet/models/res_config_settings.py
new file mode 100644
index 00000000..71c91daa
--- /dev/null
+++ b/addons/google_spreadsheet/models/res_config_settings.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models
+
+
+class ResConfigSettings(models.TransientModel):
+ _inherit = "res.config.settings"
+
+ google_drive_uri_copy = fields.Char(related='google_drive_uri', string='URI Copy', help="The URL to generate the authorization code from Google", readonly=False)