mirror of
https://github.com/OCA/reporting-engine.git
synced 2025-02-16 16:30:38 +02:00
[IMP] sql_export: black, isort, prettier
This commit is contained in:
committed by
David Beal
parent
27c69271ac
commit
e7f482ab37
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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 < %(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 < %(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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user