From b8efac6bba8fa34a80725ed753af2b8b642b74aa Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Thu, 20 Jun 2019 20:33:58 +0200 Subject: [PATCH] Fix uses of params in sql query --- sql_export/demo/sql_export.xml | 36 +++++++++++++++++++ sql_export/tests/test_sql_query.py | 16 ++++++++- sql_export/views/sql_export_view.xml | 34 ++++++++++++++++-- sql_export/wizard/wizard_file.py | 7 +++- .../models/sql_request_mixin.py | 7 +--- 5 files changed, 89 insertions(+), 11 deletions(-) diff --git a/sql_export/demo/sql_export.xml b/sql_export/demo/sql_export.xml index fa1268bc7..4c20291b9 100644 --- a/sql_export/demo/sql_export.xml +++ b/sql_export/demo/sql_export.xml @@ -7,6 +7,34 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + x_date + Date + date + + sql.file.wizard + manual + + + + x_id + ID + integer + + sql.file.wizard + manual + + + + x_partner_categ_ids + Partner Categories + many2many + + sql.file.wizard + manual + res.partner.category + + Export Partners (Demo Data) SELECT name, street FROM res_partner; @@ -14,4 +42,12 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + Export Partners With Variables (Demo Data) + SELECT p.id FROM res_partner p LEFT JOIN res_partner_res_partner_category_rel rel ON rel.partner_id = p.id WHERE create_date < %(x_date)s AND id = %(x_id)s AND rel.category_id in %(x_partner_categ_ids)s + + + + + diff --git a/sql_export/tests/test_sql_query.py b/sql_export/tests/test_sql_query.py index 94ea9c15e..7b0c48b73 100644 --- a/sql_export/tests/test_sql_query.py +++ b/sql_export/tests/test_sql_query.py @@ -4,7 +4,8 @@ import base64 from odoo.tests.common import TransactionCase, post_install -from odoo.exceptions import Warning as UserError +from odoo.exceptions import UserError +from odoo import fields @post_install(True) @@ -56,3 +57,16 @@ class TestExportSqlQuery(TransactionCase): self.assertEqual( sql_export.state, 'sql_valid', "%s is a valid request" % (query)) + + def test_sql_query_with_params(self): + query = self.env.ref('sql_export.sql_export_partner_with_variables') + categ_id = self.env.ref('base.res_partner_category_0').id + wizard = self.wizard_obj.create({ + 'sql_export_id': query.id, + 'x_date': fields.Date.today(), + 'x_id': 1, + 'x_partner_categ_ids': [(6, 0, [categ_id])] + }) + wizard.export_sql() + export = base64.b64decode(wizard.binary_file) + self.assertTrue(export) diff --git a/sql_export/views/sql_export_view.xml b/sql_export/views/sql_export_view.xml index 53ac7f4f0..3bdc86b71 100644 --- a/sql_export/views/sql_export_view.xml +++ b/sql_export/views/sql_export_view.xml @@ -73,8 +73,18 @@ Sql_parameter_form_view ir.model.fields + 150
+ + + + + + + + +
@@ -82,22 +92,40 @@ Sql_parameter_tree_view ir.model.fields + 150 + + + - + SQL Parameter ir.model.fields form tree,form - + [('model','=','sql.file.wizard')] - + + + tree + + + + + + + form + + + + + diff --git a/sql_export/wizard/wizard_file.py b/sql_export/wizard/wizard_file.py index fad2c569c..25031b2f7 100644 --- a/sql_export/wizard/wizard_file.py +++ b/sql_export/wizard/wizard_file.py @@ -62,7 +62,12 @@ class SqlFileWizard(models.TransientModel): date = now_tz.strftime(DEFAULT_SERVER_DATETIME_FORMAT) if sql_export.field_ids: for field in sql_export.field_ids: - variable_dict[field.name] = self[field.name] + if field.ttype == 'many2one': + variable_dict[field.name] = self[field.name].id + elif field.ttype == 'many2many': + variable_dict[field.name] = tuple(self[field.name].ids) + else: + variable_dict[field.name] = self[field.name] if "%(company_id)s" in sql_export.query: variable_dict['company_id'] = self.env.user.company_id.id if "%(user_id)s" in sql_export.query: diff --git a/sql_request_abstract/models/sql_request_mixin.py b/sql_request_abstract/models/sql_request_mixin.py index cd2010355..dd454bee0 100644 --- a/sql_request_abstract/models/sql_request_mixin.py +++ b/sql_request_abstract/models/sql_request_mixin.py @@ -144,12 +144,7 @@ class SQLRequestMixin(models.AbstractModel): if mode in ('view', 'materialized_view'): rollback = False - # pylint: disable=sql-injection - if params: - query = self.query % params - else: - query = self.query - query = query + query = self.env.cr.mogrify(self.query, params).decode('utf-8') if mode in ('fetchone', 'fetchall'): pass