[IMP] sql_export: black, isort, prettier

This commit is contained in:
Florian da Costa
2021-03-22 16:15:37 +01:00
committed by David Beal
parent 27c69271ac
commit e7f482ab37
9 changed files with 306 additions and 205 deletions

View File

@@ -3,24 +3,24 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
'name': 'SQL Export',
'version': '12.0.1.1.1',
'author': 'Akretion,Odoo Community Association (OCA)',
'website': 'http://www.akretion.com',
'license': 'AGPL-3',
'category': 'Generic Modules/Others',
'summary': 'Export data in csv file with SQL requests',
'depends': [
'sql_request_abstract',
"name": "SQL Export",
"version": "12.0.1.1.1",
"author": "Akretion,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/server-tools",
"license": "AGPL-3",
"category": "Generic Modules/Others",
"summary": "Export data in csv file with SQL requests",
"depends": [
"sql_request_abstract",
],
'data': [
'views/sql_export_view.xml',
'wizard/wizard_file_view.xml',
'security/sql_export_security.xml',
'security/ir.model.access.csv',
"data": [
"views/sql_export_view.xml",
"wizard/wizard_file_view.xml",
"security/sql_export_security.xml",
"security/ir.model.access.csv",
],
'demo': [
'demo/sql_export.xml',
"demo": [
"demo/sql_export.xml",
],
'installable': True,
}
"installable": True,
}

View File

@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Copyright (C) 2017 - Today: GRAP (http://www.grap.coop)
@author Sylvain LE GAL (https://twitter.com/legalsylvain)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-->
<odoo>
<record id="date_field_variable_sql" model="ir.model.fields">
<field name="name">x_date</field>
<field name="field_description">Date</field>
<field name="ttype">date</field>
<field name="model_id" ref="sql_export.model_sql_file_wizard"/>
<field name="model_id" ref="sql_export.model_sql_file_wizard" />
<field name="model">sql.file.wizard</field>
<field name="state">manual</field>
</record>
@@ -20,7 +19,7 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
<field name="name">x_id</field>
<field name="field_description">x_ID</field>
<field name="ttype">integer</field>
<field name="model_id" ref="sql_export.model_sql_file_wizard"/>
<field name="model_id" ref="sql_export.model_sql_file_wizard" />
<field name="model">sql.file.wizard</field>
<field name="state">manual</field>
</record>
@@ -29,7 +28,7 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
<field name="name">x_partner_categ_ids</field>
<field name="field_description">Partner Categories</field>
<field name="ttype">many2many</field>
<field name="model_id" ref="sql_export.model_sql_file_wizard"/>
<field name="model_id" ref="sql_export.model_sql_file_wizard" />
<field name="model">sql.file.wizard</field>
<field name="state">manual</field>
<field name="relation">res.partner.category</field>
@@ -40,14 +39,27 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
<field name="query">SELECT name, street FROM res_partner;</field>
</record>
<function model="sql.export" name="button_validate_sql_expression" eval="([ref('sql_export.sql_export_partner')])"/>
<function
model="sql.export"
name="button_validate_sql_expression"
eval="([ref('sql_export.sql_export_partner')])"
/>
<record id="sql_export_partner_with_variables" model="sql.export">
<field name="name">Export Partners With Variables (Demo Data)</field>
<field name="query">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 &lt; %(x_date)s AND id = %(x_id)s AND rel.category_id in %(x_partner_categ_ids)s</field>
<field eval="[(6, 0, [ref('date_field_variable_sql'), ref('integer_field_variable_sql'), ref('m2m_field_variable_sql')])]" name="field_ids"/>
<field
name="query"
>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 &lt; %(x_date)s AND id = %(x_id)s AND rel.category_id in %(x_partner_categ_ids)s</field>
<field
eval="[(6, 0, [ref('date_field_variable_sql'), ref('integer_field_variable_sql'), ref('m2m_field_variable_sql')])]"
name="field_ids"
/>
</record>
<function model="sql.export" name="button_validate_sql_expression" eval="([ref('sql_export.sql_export_partner_with_variables')])"/>
<function
model="sql.export"
name="button_validate_sql_expression"
eval="([ref('sql_export.sql_export_partner_with_variables')])"
/>
</odoo>

View File

@@ -1,70 +1,77 @@
# Copyright (C) 2015 Akretion (<http://www.akretion.com>)
# @author: Florian da Costa
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import models, fields
from odoo import fields, models
class SqlExport(models.Model):
_name = "sql.export"
_inherit = ['sql.request.mixin']
_inherit = ["sql.request.mixin"]
_description = "SQL export"
_sql_request_groups_relation = 'groups_sqlquery_rel'
_sql_request_groups_relation = "groups_sqlquery_rel"
_sql_request_users_relation = 'users_sqlquery_rel'
_sql_request_users_relation = "users_sqlquery_rel"
_check_execution_enabled = False
copy_options = fields.Char(
string='Copy Options', required=False,
default="CSV HEADER DELIMITER ';'")
string="Copy Options", required=False, default="CSV HEADER DELIMITER ';'"
)
file_format = fields.Selection(
[('csv', 'CSV')],
default='csv',
required=True)
file_format = fields.Selection([("csv", "CSV")], default="csv", required=True)
field_ids = fields.Many2many(
'ir.model.fields',
'fields_sqlquery_rel',
'sql_id',
'field_id',
'Parameters',
domain=[('model', '=', 'sql.file.wizard')])
"ir.model.fields",
"fields_sqlquery_rel",
"sql_id",
"field_id",
"Parameters",
domain=[("model", "=", "sql.file.wizard")],
)
encoding = fields.Selection(
[('utf-8', 'utf-8'), ('utf-16', 'utf-16'),
('windows-1252', 'windows-1252'), ('latin1', 'latin1'),
('latin2', 'latin2'), ('big5', 'big5'), ('gb18030', 'gb18030'),
('shift_jis', 'shift_jis'), ('windows-1251', 'windows-1251'),
('koir8_r', 'koir8_r')], string='Encoding', required=True,
default='utf-8')
[
("utf-8", "utf-8"),
("utf-16", "utf-16"),
("windows-1252", "windows-1252"),
("latin1", "latin1"),
("latin2", "latin2"),
("big5", "big5"),
("gb18030", "gb18030"),
("shift_jis", "shift_jis"),
("windows-1251", "windows-1251"),
("koir8_r", "koir8_r"),
],
string="Encoding",
required=True,
default="utf-8",
)
def export_sql_query(self):
self.ensure_one()
wiz = self.env['sql.file.wizard'].create({
'sql_export_id': self.id})
wiz = self.env["sql.file.wizard"].create({"sql_export_id": self.id})
return {
'view_mode': 'form',
'res_model': 'sql.file.wizard',
'res_id': wiz.id,
'type': 'ir.actions.act_window',
'target': 'new',
'context': self.env.context,
'nodestroy': True,
"view_mode": "form",
"res_model": "sql.file.wizard",
"res_id": wiz.id,
"type": "ir.actions.act_window",
"target": "new",
"context": self.env.context,
"nodestroy": True,
}
def _get_file_extension(self):
self.ensure_one()
if self.file_format == 'csv':
return 'csv'
if self.file_format == "csv":
return "csv"
def csv_get_data_from_query(self, variable_dict):
self.ensure_one()
# Execute Request
res = self._execute_sql_request(
params=variable_dict, mode='stdout',
copy_options=self.copy_options)
params=variable_dict, mode="stdout", copy_options=self.copy_options
)
if self.encoding:
res = res.decode(self.encoding)
return res

View File

@@ -6,5 +6,5 @@ Dashboards > Sql Export
- `%(company_id)s` allows to set in the query the company id of the user
- `%(user_id)s` allows to set in the query the user id
- for any created field with `Sql Export Variables` menu, you can use it with `%(x_field_example)s` syntax
- for any created field with `Sql Export Variables` menu, you can use it with `%(x_field_example)s` syntax
(Limitation for relational fields)

View File

@@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record model="ir.rule" id="sql_export_restric_access_user_or_group">
<field name="name" >SQL Export users and groups rules</field>
<field name="model_id" ref="model_sql_export"/>
<field eval="1" name="perm_read"/>
<field eval="0" name="perm_create"/>
<field eval="0" name="perm_write"/>
<field eval="0" name="perm_unlink"/>
<field name="domain_force">['|', ('user_ids','=',user.id), ('group_ids','in', [x.id for x in user.groups_id])]</field>
<field name="name">SQL Export users and groups rules</field>
<field name="model_id" ref="model_sql_export" />
<field eval="1" name="perm_read" />
<field eval="0" name="perm_create" />
<field eval="0" name="perm_write" />
<field eval="0" name="perm_unlink" />
<field
name="domain_force"
>['|', ('user_ids','=',user.id), ('group_ids','in', [x.id for x in user.groups_id])]</field>
</record>
</odoo>

View File

@@ -3,28 +3,30 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import base64
from odoo.tests.common import TransactionCase, post_install
from odoo.exceptions import UserError
from odoo import fields
from odoo.exceptions import UserError
from odoo.tests.common import TransactionCase, post_install
@post_install(True)
class TestExportSqlQuery(TransactionCase):
def setUp(self):
super(TestExportSqlQuery, self).setUp()
self.sql_export_obj = self.env['sql.export']
self.wizard_obj = self.env['sql.file.wizard']
self.sql_report_demo = self.env.ref('sql_export.sql_export_partner')
self.sql_export_obj = self.env["sql.export"]
self.wizard_obj = self.env["sql.file.wizard"]
self.sql_report_demo = self.env.ref("sql_export.sql_export_partner")
def test_sql_query(self):
wizard = self.wizard_obj.create({
'sql_export_id': self.sql_report_demo.id,
})
wizard = self.wizard_obj.create(
{
"sql_export_id": self.sql_report_demo.id,
}
)
wizard.export_sql()
export = base64.b64decode(wizard.binary_file).decode('utf-8')
self.assertEqual(export.split(';')[0], 'name')
self.assertTrue(len(export.split(';')) > 6)
export = base64.b64decode(wizard.binary_file).decode("utf-8")
self.assertEqual(export.split(";")[0], "name")
self.assertTrue(len(export.split(";")) > 6)
def test_prohibited_queries(self):
prohibited_queries = [
@@ -39,9 +41,9 @@ class TestExportSqlQuery(TransactionCase):
]
for query in prohibited_queries:
with self.assertRaises(UserError):
sql_export = self.sql_export_obj.create({
'name': 'test_prohibited',
'query': query})
sql_export = self.sql_export_obj.create(
{"name": "test_prohibited", "query": query}
)
sql_export.button_validate_sql_expression()
def test_authorized_queries(self):
@@ -50,23 +52,25 @@ class TestExportSqlQuery(TransactionCase):
]
for query in authorized_queries:
sql_export = self.sql_export_obj.create({
'name': 'test_authorized',
'query': query})
sql_export = self.sql_export_obj.create(
{"name": "test_authorized", "query": query}
)
sql_export.button_validate_sql_expression()
self.assertEqual(
sql_export.state, 'sql_valid',
"%s is a valid request" % (query))
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])]
})
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)

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="sql_export_view_form" model="ir.ui.view">
<field name="name">Sql_export_form_view</field>
@@ -6,37 +6,71 @@
<field name="arch" type="xml">
<form string="SQL export">
<header>
<button name="button_validate_sql_expression" type="object" states="draft"
string="Validate SQL Expression" class="oe_highlight"/>
<button name="button_set_draft" type="object" states="sql_valid"
string="Set to Draft" groups="sql_request_abstract.group_sql_request_manager"/>
<button name="export_sql_query" string="Execute Query" states="sql_valid" type="object" class="oe_highlight"
icon="fa-arrow-right text-success"/>
<field name="state" widget="statusbar"/>
<button
name="button_validate_sql_expression"
type="object"
states="draft"
string="Validate SQL Expression"
class="oe_highlight"
/>
<button
name="button_set_draft"
type="object"
states="sql_valid"
string="Set to Draft"
groups="sql_request_abstract.group_sql_request_manager"
/>
<button
name="export_sql_query"
string="Execute Query"
states="sql_valid"
type="object"
class="oe_highlight"
icon="fa-arrow-right text-success"
/>
<field name="state" widget="statusbar" />
</header>
<sheet>
<group>
<h1>
<field name="name" nolabel="1" placeholder="Request Name"/>
<field name="name" nolabel="1" placeholder="Request Name" />
</h1>
</group>
<group name="option" groups="sql_request_abstract.group_sql_request_user">
<field name="file_format"/>
<field name="copy_options" attrs="{'invisible': [('file_format', '!=', 'csv')], 'required': [('file_format', '=', 'csv')]}"/>
<field name="encoding"/>
<group
name="option"
groups="sql_request_abstract.group_sql_request_user"
>
<field name="file_format" />
<field
name="copy_options"
attrs="{'invisible': [('file_format', '!=', 'csv')], 'required': [('file_format', '=', 'csv')]}"
/>
<field name="encoding" />
</group>
<group name="request" string="SQL Request" groups="sql_request_abstract.group_sql_request_user">
<field name="query" nolabel="1" placeholder="select * from res_partner"/>
<group
name="request"
string="SQL Request"
groups="sql_request_abstract.group_sql_request_user"
>
<field
name="query"
nolabel="1"
placeholder="select * from res_partner"
/>
</group>
<group name="parameters" string="Parameters" groups="sql_request_abstract.group_sql_request_user">
<field name="field_ids" nolabel="1"/>
<group
name="parameters"
string="Parameters"
groups="sql_request_abstract.group_sql_request_user"
>
<field name="field_ids" nolabel="1" />
</group>
<group groups="sql_request_abstract.group_sql_request_manager">
<group string="Allowed Users" name="users_allowed">
<field name="user_ids" nolabel="1"/>
<field name="user_ids" nolabel="1" />
</group>
<group string="Allowed Groups" name="groups_allowed">
<field name="group_ids" nolabel="1"/>
<field name="group_ids" nolabel="1" />
</group>
</group>
@@ -50,10 +84,15 @@
<field name="model">sql.export</field>
<field name="arch" type="xml">
<tree string="SQL Export" colors="blue:state == 'draft'">
<field name="name"/>
<field name="state"/>
<button name="export_sql_query" string="Execute Query" states="sql_valid" type="object"
icon="fa-arrow-right text-success"/>
<field name="name" />
<field name="state" />
<button
name="export_sql_query"
string="Execute Query"
states="sql_valid"
type="object"
icon="fa-arrow-right text-success"
/>
</tree>
</field>
</record>
@@ -61,31 +100,43 @@
<record id="sql_export_tree_action" model="ir.actions.act_window">
<field name="name">SQL Export</field>
<field name="res_model">sql.export</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="sql_export_menu" name="Sql Export"
parent="base.menu_reporting_dashboard" sequence="80"/>
<menuitem
id="sql_export_menu"
name="Sql Export"
parent="base.menu_reporting_dashboard"
sequence="80"
/>
<menuitem id="sql_export_menu_view" name="Sql Export" parent="sql_export_menu" action="sql_export_tree_action" sequence="1"/>
<menuitem
id="sql_export_menu_view"
name="Sql Export"
parent="sql_export_menu"
action="sql_export_tree_action"
sequence="1"
/>
<record id="sql_parameter_view_form" model="ir.ui.view">
<field name="name">Sql_parameter_form_view</field>
<field name="model">ir.model.fields</field>
<field name="priority">150</field>
<field name="priority">150</field>
<field name="arch" type="xml">
<form string="SQL export">
<group>
<field name="name"/>
<field name="field_description"/>
<field name="ttype"/>
<field name="relation" attrs="{'invisible': [('ttype', 'not in', ('many2one', 'many2many', 'one2many'))], 'required': [('ttype', 'in', ('many2one', 'many2many', 'one2many'))]}"/>
<field name="model_id" readonly="1"/>
<field name="model" invisible="1"/>
<field name="required"/>
</group>
<group>
<field name="name" />
<field name="field_description" />
<field name="ttype" />
<field
name="relation"
attrs="{'invisible': [('ttype', 'not in', ('many2one', 'many2many', 'one2many'))], 'required': [('ttype', 'in', ('many2one', 'many2many', 'one2many'))]}"
/>
<field name="model_id" readonly="1" />
<field name="model" invisible="1" />
<field name="required" />
</group>
</form>
</field>
</record>
@@ -93,13 +144,13 @@
<record id="sql_parameter_view_tree" model="ir.ui.view">
<field name="name">Sql_parameter_tree_view</field>
<field name="model">ir.model.fields</field>
<field name="priority">150</field>
<field name="priority">150</field>
<field name="arch" type="xml">
<tree string="SQL Parameter">
<field name="name"/>
<field name="field_description"/>
<field name="ttype"/>
<field name="required"/>
<field name="name" />
<field name="field_description" />
<field name="ttype" />
<field name="required" />
</tree>
</field>
</record>
@@ -107,26 +158,35 @@
<record id="sql_parameter_action" model="ir.actions.act_window">
<field name="name">SQL Parameter</field>
<field name="res_model">ir.model.fields</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context" eval="{'default_model_id': ref('sql_export.model_sql_file_wizard'), 'default_size': 64, 'search_default_state': 'manual', 'default_model': 'sql.file.wizard'}"/>
<field
name="context"
eval="{'default_model_id': ref('sql_export.model_sql_file_wizard'), 'default_size': 64, 'search_default_state': 'manual', 'default_model': 'sql.file.wizard'}"
/>
<field name="domain">[('model','=','sql.file.wizard')]</field>
</record>
<record id="sql_parameter_action_view_tree" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="sequence" eval="1" />
<field name="view_mode">tree</field>
<field name="view_id" ref="sql_parameter_view_tree"/>
<field name="act_window_id" ref="sql_parameter_action"/>
<field name="view_id" ref="sql_parameter_view_tree" />
<field name="act_window_id" ref="sql_parameter_action" />
</record>
<record id="sql_parameter_action_view_form" model="ir.actions.act_window.view">
<field name="sequence" eval="2"/>
<field name="sequence" eval="2" />
<field name="view_mode">form</field>
<field name="view_id" ref="sql_parameter_view_form"/>
<field name="act_window_id" ref="sql_parameter_action"/>
<field name="view_id" ref="sql_parameter_view_form" />
<field name="act_window_id" ref="sql_parameter_action" />
</record>
<menuitem id="sql_parameter_menu_view" name="Sql Export Variables" parent="sql_export_menu" action="sql_parameter_action" sequence="5" groups="sql_request_abstract.group_sql_request_manager"/>
<menuitem
id="sql_parameter_menu_view"
name="Sql Export Variables"
parent="sql_export_menu"
action="sql_parameter_action"
sequence="5"
groups="sql_request_abstract.group_sql_request_manager"
/>
</odoo>

View File

@@ -3,9 +3,10 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from datetime import datetime
from lxml import etree
from odoo import models, fields, api, osv
from odoo import api, fields, models, osv
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
@@ -13,43 +14,41 @@ class SqlFileWizard(models.TransientModel):
_name = "sql.file.wizard"
_description = "Allow the user to save the file with sql request's data"
binary_file = fields.Binary('File', readonly=True)
file_name = fields.Char('File Name', readonly=True)
sql_export_id = fields.Many2one(comodel_name='sql.export', required=True)
binary_file = fields.Binary("File", readonly=True)
file_name = fields.Char("File Name", readonly=True)
sql_export_id = fields.Many2one(comodel_name="sql.export", required=True)
@api.model
def fields_view_get(self, view_id=None, view_type='form',
toolbar=False, submenu=False):
def fields_view_get(
self, view_id=None, view_type="form", toolbar=False, submenu=False
):
"""
Display dynamically parameter fields depending on the sql_export.
"""
res = super(SqlFileWizard, self).fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar,
submenu=submenu)
export_obj = self.env['sql.export']
if view_type == 'form':
sql_export = export_obj.browse(self.env.context.get('active_id'))
view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu
)
export_obj = self.env["sql.export"]
if view_type == "form":
sql_export = export_obj.browse(self.env.context.get("active_id"))
if sql_export.field_ids:
eview = etree.fromstring(res['arch'])
group = etree.Element(
'group', name="variables_group", colspan="4")
eview = etree.fromstring(res["arch"])
group = etree.Element("group", name="variables_group", colspan="4")
toupdate_fields = []
for field in sql_export.field_ids:
toupdate_fields.append(field.name)
attrib = {'name': field.name}
attrib = {"name": field.name}
if field.required:
attrib['required'] = 'True'
view_field = etree.SubElement(
group, 'field', attrib=attrib)
osv.orm.setup_modifiers(
view_field, self.fields_get(field.name))
attrib["required"] = "True"
view_field = etree.SubElement(group, "field", attrib=attrib)
osv.orm.setup_modifiers(view_field, self.fields_get(field.name))
res['fields'].update(self.fields_get(toupdate_fields))
res["fields"].update(self.fields_get(toupdate_fields))
placeholder = eview.xpath(
"//separator[@string='variables_placeholder']")[0]
placeholder.getparent().replace(
placeholder, group)
res['arch'] = etree.tostring(eview, pretty_print=True)
"//separator[@string='variables_placeholder']"
)[0]
placeholder.getparent().replace(placeholder, group)
res["arch"] = etree.tostring(eview, pretty_print=True)
return res
def export_sql(self):
@@ -62,37 +61,39 @@ class SqlFileWizard(models.TransientModel):
date = now_tz.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
if sql_export.field_ids:
for field in sql_export.field_ids:
if field.ttype == 'many2one':
if field.ttype == "many2one":
variable_dict[field.name] = self[field.name].id
elif field.ttype == 'many2many':
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:
company_id = self.env.context.get(
'force_company', self.env.user.company_id.id)
variable_dict['company_id'] = company_id
"force_company", self.env.user.company_id.id
)
variable_dict["company_id"] = company_id
if "%(user_id)s" in sql_export.query:
user_id = self.env.context.get(
'force_user', self._uid)
variable_dict['user_id'] = user_id
user_id = self.env.context.get("force_user", self._uid)
variable_dict["user_id"] = user_id
# Call different method depending on file_type since the logic will be
# different
method_name = '%s_get_data_from_query' % sql_export.file_format
method_name = "%s_get_data_from_query" % sql_export.file_format
data = getattr(sql_export, method_name)(variable_dict)
extension = sql_export._get_file_extension()
self.write({
'binary_file': data,
'file_name': '%(name)s_%(date)s.%(extension)s' % {
'name': sql_export.name, 'date': date, 'extension': extension}
})
self.write(
{
"binary_file": data,
"file_name": "%(name)s_%(date)s.%(extension)s"
% {"name": sql_export.name, "date": date, "extension": extension},
}
)
return {
'view_mode': 'form',
'res_model': 'sql.file.wizard',
'res_id': self.id,
'type': 'ir.actions.act_window',
'target': 'new',
'context': self.env.context,
'nodestroy': True,
"view_mode": "form",
"res_model": "sql.file.wizard",
"res_id": self.id,
"type": "ir.actions.act_window",
"target": "new",
"context": self.env.context,
"nodestroy": True,
}

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
@@ -7,17 +7,32 @@
<field name="model">sql.file.wizard</field>
<field name="arch" type="xml">
<form string="Csv File">
<separator string="variables_placeholder" colspan="4" invisible="1"/>
<separator string="Export file" colspan="4"
attrs="{'invisible': [('binary_file', '=', False)]}"/>
<field name="binary_file" filename="file_name"/>
<field name="file_name" invisible="1"/>
<separator
string="variables_placeholder"
colspan="4"
invisible="1"
/>
<separator
string="Export file"
colspan="4"
attrs="{'invisible': [('binary_file', '=', False)]}"
/>
<field name="binary_file" filename="file_name" />
<field name="file_name" invisible="1" />
<footer>
<button name="export_sql" string="Export" type="object"
icon="fa-download"/>
<button
name="export_sql"
string="Export"
type="object"
icon="fa-download"
/>
or
<button special="cancel" string="Cancel" type="object"
icon="fa-times" />
<button
special="cancel"
string="Cancel"
type="object"
icon="fa-times"
/>
</footer>
</form>
</field>