Skip to content

Commit

Permalink
[MIG] bi_sql_editor: Migration to 18.0
Browse files Browse the repository at this point in the history
  • Loading branch information
thienvh332 committed Oct 24, 2024
1 parent 067db7a commit fb97765
Show file tree
Hide file tree
Showing 9 changed files with 95 additions and 94 deletions.
28 changes: 18 additions & 10 deletions bi_sql_editor/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ BI SQL Editor
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github
:target: https://github.com/OCA/reporting-engine/tree/17.0/bi_sql_editor
:target: https://github.com/OCA/reporting-engine/tree/18.0/bi_sql_editor
:alt: OCA/reporting-engine
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/reporting-engine-17-0/reporting-engine-17-0-bi_sql_editor
:target: https://translation.odoo-community.org/projects/reporting-engine-18-0/reporting-engine-18-0-bi_sql_editor
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=17.0
:target: https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=18.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|
Expand Down Expand Up @@ -126,10 +126,10 @@ to make reporting depending on the current companies of the user.
- Finally, click on 'Create UI', to create new menu, action, graph view
and search view.

.. |image1| image:: https://raw.githubusercontent.com/OCA/reporting-engine/17.0/bi_sql_editor/static/description/01_sql_request.png
.. |image2| image:: https://raw.githubusercontent.com/OCA/reporting-engine/17.0/bi_sql_editor/static/description/02_security_access.png
.. |image3| image:: https://raw.githubusercontent.com/OCA/reporting-engine/17.0/bi_sql_editor/static/description/03_field_mapping.png
.. |image4| image:: https://raw.githubusercontent.com/OCA/reporting-engine/17.0/bi_sql_editor/static/description/04_materialized_view_setting.png
.. |image1| image:: https://raw.githubusercontent.com/OCA/reporting-engine/18.0/bi_sql_editor/static/description/01_sql_request.png
.. |image2| image:: https://raw.githubusercontent.com/OCA/reporting-engine/18.0/bi_sql_editor/static/description/02_security_access.png
.. |image3| image:: https://raw.githubusercontent.com/OCA/reporting-engine/18.0/bi_sql_editor/static/description/03_field_mapping.png
.. |image4| image:: https://raw.githubusercontent.com/OCA/reporting-engine/18.0/bi_sql_editor/static/description/04_materialized_view_setting.png

Usage
=====
Expand All @@ -145,15 +145,15 @@ To use this module, you need to:

- You can switch to 'Graph' or 'tree' views as any report.

.. |usage-image1| image:: https://raw.githubusercontent.com/OCA/reporting-engine/17.0/bi_sql_editor/static/description/05_reporting_pivot.png
.. |usage-image1| image:: https://raw.githubusercontent.com/OCA/reporting-engine/18.0/bi_sql_editor/static/description/05_reporting_pivot.png

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/reporting-engine/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/reporting-engine/issues/new?body=module:%20bi_sql_editor%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
`feedback <https://github.com/OCA/reporting-engine/issues/new?body=module:%20bi_sql_editor%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Expand All @@ -176,6 +176,8 @@ Contributors

- Guillem Casassas [email protected]

- Thien Vo [email protected]

- This module is highly inspired by the work of

- Onestein: (http://www.onestein.nl/) Module:
Expand All @@ -189,6 +191,12 @@ Contributors
grap/odoo-addons-misc/pos_sale_reporting link:
https://github.com/grap/odoo-addons-misc/tree/7.0/pos_sale_reporting

Other credits
-------------

The migration of this module from 17.0 to 18.0 was financially supported
by Camptocamp.

Maintainers
-----------

Expand All @@ -210,6 +218,6 @@ Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-legalsylvain|

This module is part of the `OCA/reporting-engine <https://github.com/OCA/reporting-engine/tree/17.0/bi_sql_editor>`_ project on GitHub.
This module is part of the `OCA/reporting-engine <https://github.com/OCA/reporting-engine/tree/18.0/bi_sql_editor>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
2 changes: 1 addition & 1 deletion bi_sql_editor/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
{
"name": "BI SQL Editor",
"summary": "BI Views builder, based on Materialized or Normal SQL Views",
"version": "17.0.1.1.0",
"version": "18.0.1.0.0",
"license": "AGPL-3",
"category": "Reporting",
"author": "GRAP,Odoo Community Association (OCA)",
Expand Down
85 changes: 32 additions & 53 deletions bi_sql_editor/models/bi_sql_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from odoo import SUPERUSER_ID, _, api, fields, models
from odoo.exceptions import UserError, ValidationError
from odoo.tools import sql, table_columns
from odoo.tools import sql
from odoo.tools.safe_eval import safe_eval

_logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -44,14 +44,12 @@ class BiSQLView(models.Model):

view_name = fields.Char(
compute="_compute_view_name",
readonly=True,
store=True,
help="Full name of the SQL view",
)

model_name = fields.Char(
compute="_compute_model_name",
readonly=True,
store=True,
help="Full Qualified Name of the transient model that will" " be created.",
)
Expand All @@ -65,16 +63,15 @@ class BiSQLView(models.Model):

size = fields.Char(
string="Database Size",
readonly=True,
help="Size of the materialized view and its indexes",
)

state = fields.Selection(selection_add=_STATE_SQL_EDITOR)

view_order = fields.Char(
required=True,
default="pivot,graph,tree",
help="Comma-separated text. Possible values:" ' "graph", "pivot" or "tree"',
default="pivot,graph,list",
help="Comma-separated text. Possible values:" ' "graph", "pivot" or "list"',
)

query = fields.Text(
Expand Down Expand Up @@ -111,9 +108,7 @@ class BiSQLView(models.Model):
inverse_name="bi_sql_view_id",
)

model_id = fields.Many2one(
string="Odoo Model", comodel_name="ir.model", readonly=True
)
model_id = fields.Many2one(string="Odoo Model", comodel_name="ir.model")
# UI related fields
# 1. Editable fields, which can be set by the user (optional) before
# creating the UI elements
Expand All @@ -133,39 +128,30 @@ def _default_parent_menu_id(self):
)

# 2. Readonly fields, non editable by the user
tree_view_id = fields.Many2one(
string="Odoo Tree View", comodel_name="ir.ui.view", readonly=True
)
tree_view_id = fields.Many2one(string="Odoo List View", comodel_name="ir.ui.view")

graph_view_id = fields.Many2one(
string="Odoo Graph View", comodel_name="ir.ui.view", readonly=True
)
graph_view_id = fields.Many2one(string="Odoo Graph View", comodel_name="ir.ui.view")

pivot_view_id = fields.Many2one(
string="Odoo Pivot View", comodel_name="ir.ui.view", readonly=True
)
pivot_view_id = fields.Many2one(string="Odoo Pivot View", comodel_name="ir.ui.view")

search_view_id = fields.Many2one(
string="Odoo Search View", comodel_name="ir.ui.view", readonly=True
string="Odoo Search View", comodel_name="ir.ui.view"
)

action_id = fields.Many2one(
string="Odoo Action", comodel_name="ir.actions.act_window", readonly=True
string="Odoo Action", comodel_name="ir.actions.act_window"
)

menu_id = fields.Many2one(
string="Odoo Menu", comodel_name="ir.ui.menu", readonly=True
)
menu_id = fields.Many2one(string="Odoo Menu", comodel_name="ir.ui.menu")

cron_id = fields.Many2one(
string="Odoo Cron",
comodel_name="ir.cron",
readonly=True,
help="Cron Task that will refresh the materialized view",
ondelete="cascade",
)

rule_id = fields.Many2one(string="Odoo Rule", comodel_name="ir.rule", readonly=True)
rule_id = fields.Many2one(string="Odoo Rule", comodel_name="ir.rule")

sequence = fields.Integer(string="sequence")

Expand All @@ -183,9 +169,9 @@ def _check_view_order(self):
for rec in self:
if rec.view_order:
for vtype in rec.view_order.split(","):
if vtype not in ("graph", "pivot", "tree"):
if vtype not in ("graph", "pivot", "list"):
raise UserError(
_("Only graph, pivot or tree views are supported")
_("Only graph, pivot or list views are supported")
)

# Compute Section
Expand Down Expand Up @@ -244,15 +230,15 @@ def write(self, vals):
rec.menu_id.sequence = rec.sequence
return res

def unlink(self):
@api.ondelete(at_uninstall=False)
def _check_unlink_constraints(self):
if any(view.state not in ("draft", "sql_valid") for view in self):
raise UserError(
_(
"You can only unlink draft views."
"You can only unlink draft views. "
"If you want to delete them, first set them to draft."
)
)
return super().unlink()

def copy(self, default=None):
self.ensure_one()
Expand Down Expand Up @@ -395,8 +381,7 @@ def _prepare_cron(self):
.search([("model", "=", self._name)], limit=1)
.id,
"state": "code",
"code": "model._refresh_materialized_view_cron(%s)" % self.ids,
"numbercall": -1,
"code": f"model._refresh_materialized_view_cron({self.ids})",
"interval_number": 1,
"interval_type": "days",
"nextcall": now + timedelta(days=1),
Expand All @@ -416,11 +401,11 @@ def _prepare_tree_view(self):
self.ensure_one()
return {
"name": self.name,
"type": "tree",
"type": "list",
"model": self.model_id.model,
"arch": """<?xml version="1.0"?>"""
"""<tree name="Analysis">{}"""
"""</tree>""".format(
"""<list name="Analysis">{}"""
"""</list>""".format(
"".join([x._prepare_tree_field() for x in self.bi_sql_view_field_ids])
),
}
Expand Down Expand Up @@ -477,7 +462,7 @@ def _prepare_action(self):
self.ensure_one()
view_mode = self.view_order
first_view = view_mode.split(",")[0]
if first_view == "tree":
if first_view == "list":
view_id = self.tree_view_id.id
elif first_view == "pivot":
view_id = self.pivot_view_id.id
Expand Down Expand Up @@ -510,13 +495,13 @@ def _prepare_menu(self):
return {
"name": self.name,
"parent_id": self.parent_menu_id.id,
"action": "ir.actions.act_window,%s" % self.action_id.id,
"action": f"ir.actions.act_window,{self.action_id.id}",
"sequence": self.sequence,
}

# Custom Section
def _log_execute(self, req):
_logger.info("Executing SQL Request %s ..." % req)
_logger.info(f"Executing SQL Request {req} ...")
self.env.cr.execute(req)

def _drop_view(self):
Expand Down Expand Up @@ -562,7 +547,7 @@ def _create_model_and_fields(self):
sql_view.rule_id = self.env["ir.rule"].create(self._prepare_rule()).id
# Drop table, created by the ORM
if sql.table_exists(self._cr, sql_view.view_name):
req = "DROP TABLE %s" % sql_view.view_name
req = f"DROP TABLE {sql_view.view_name}"
self._log_execute(req)

def _create_model_access(self):
Expand All @@ -585,18 +570,15 @@ def _drop_model_and_fields(self):

def _hook_executed_request(self):
self.ensure_one()
req = (
"""
req = f"""
SELECT attnum,
attname AS column,
format_type(atttypid, atttypmod) AS type
FROM pg_attribute
WHERE attrelid = '%s'::regclass
WHERE attrelid = '{self.view_name}'::regclass
AND NOT attisdropped
AND attnum > 0
ORDER BY attnum;"""
% self.view_name
)
self._log_execute(req)
return self.env.cr.fetchall()

Expand All @@ -606,8 +588,7 @@ def _prepare_request_check_execution(self):

def _prepare_request_for_execution(self):
self.ensure_one()
query = (
"""
query = f"""
SELECT
CAST(row_number() OVER () as integer) AS id,
CAST(Null as timestamp without time zone) as create_date,
Expand All @@ -616,10 +597,8 @@ def _prepare_request_for_execution(self):
CAST(Null as integer) as write_uid,
my_query.*
FROM
(%s) as my_query
({self.query}) as my_query
"""
% self.query
)
return f"CREATE {self.materialized_text} VIEW {self.view_name} AS ({query});"

def _check_execution(self):
Expand Down Expand Up @@ -689,9 +668,9 @@ def _refresh_materialized_view(self):

def _refresh_size(self):
for sql_view in self:
req = "SELECT pg_size_pretty(pg_total_relation_size('%s'));" % (
sql_view.view_name
)
req = f"""SELECT pg_size_pretty(pg_total_relation_size(
'{sql_view.view_name}'
));"""
self._log_execute(req)
sql_view.size = self.env.cr.fetchone()[0]

Expand All @@ -700,7 +679,7 @@ def check_manual_fields(self, model):
# early on install / startup - particularly problematic during upgrade
if model._name.startswith(
self._model_prefix
) and "group_operator" in table_columns(self.env.cr, "bi_sql_view_field"):
) and "group_operator" in sql.table_columns(self.env.cr, "bi_sql_view_field"):
# Use SQL instead of ORM, as ORM might not be fully initialised -
# we have no control over the order that fields are defined!
# We are not concerned about user security rules.
Expand Down
9 changes: 4 additions & 5 deletions bi_sql_editor/models/bi_sql_view_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,8 @@ def _check_index_materialized(self):
# Compute Section
def _compute_index_name(self):
for sql_field in self:
sql_field.index_name = "{}_{}".format(
sql_field.bi_sql_view_id.view_name,
sql_field.name,
sql_field.index_name = (
f"{sql_field.bi_sql_view_id.view_name}_{sql_field.name}"
)

# Overload Section
Expand Down Expand Up @@ -209,8 +208,8 @@ def _model_mapping(self):
field name. Sample :
{'account_id': 'account.account'; 'product_id': 'product.product'}
"""
relation_fields = self.env["ir.model.fields"].search(
[("ttype", "=", "many2one")]
relation_fields = (
self.env["ir.model.fields"].sudo().search([("ttype", "=", "many2one")])
)
res = {}
keys_to_pop = []
Expand Down
2 changes: 2 additions & 0 deletions bi_sql_editor/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

- Guillem Casassas <[email protected]>

- Thien Vo <[email protected]>

- This module is highly inspired by the work of
- Onestein: (<http://www.onestein.nl/>) Module:
OCA/server-tools/bi_view_editor. Link:
Expand Down
1 change: 1 addition & 0 deletions bi_sql_editor/readme/CREDITS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The migration of this module from 17.0 to 18.0 was financially supported by Camptocamp.
Loading

0 comments on commit fb97765

Please sign in to comment.