diff --git a/bi_sql_editor/models/__init__.py b/bi_sql_editor/models/__init__.py index e27e52a8..ef99aabc 100644 --- a/bi_sql_editor/models/__init__.py +++ b/bi_sql_editor/models/__init__.py @@ -2,3 +2,4 @@ from . import bi_sql_view from . import bi_sql_view_field +from . import ir_model diff --git a/bi_sql_editor/models/bi_sql_view.py b/bi_sql_editor/models/bi_sql_view.py index 3adec90e..6c5627f7 100644 --- a/bi_sql_editor/models/bi_sql_view.py +++ b/bi_sql_editor/models/bi_sql_view.py @@ -9,7 +9,7 @@ from psycopg2 import ProgrammingError from odoo import SUPERUSER_ID, _, api, fields, models from odoo.exceptions import UserError -from odoo.tools import pycompat, sql +from odoo.tools import pycompat, sql, table_columns from odoo.tools.safe_eval import safe_eval from odoo.addons.base.models.ir_model import IrModel @@ -726,6 +726,40 @@ class BiSQLView(models.Model): self._log_execute(req) sql_view.size = self.env.cr.fetchone()[0] + def check_manual_fields(self, model): + # check the fields we need are defined on self, to stop it going + # early on install / startup - particularly problematic during upgrade + if "group_operator" in table_columns( + self.env.cr, "bi_sql_view_field" + ) and model._name.startswith(self._model_prefix): + # 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. + self.env.cr.execute( + """ +SELECT + f.name, + f.ttype, + f.group_operator +FROM + bi_sql_view v + LEFT JOIN bi_sql_view_field f ON f.bi_sql_view_id = v.id +WHERE + v.model_name = %s +; + """, + (model._name,), + ) + sql_fields = self.env.cr.fetchall() + + for sql_field in sql_fields: + if ( + sql_field[0] in model._fields + and sql_field[1] in ("integer", "float") + and sql_field[2] + ): + model._fields[sql_field[0]].group_operator = sql_field[2] + def button_preview_sql_expression(self): self.button_validate_sql_expression() res = self._execute_sql_request() diff --git a/bi_sql_editor/models/bi_sql_view_field.py b/bi_sql_editor/models/bi_sql_view_field.py index 95cecb85..1689f7a3 100644 --- a/bi_sql_editor/models/bi_sql_view_field.py +++ b/bi_sql_editor/models/bi_sql_view_field.py @@ -49,6 +49,13 @@ class BiSQLViewField(models.Model): "timestamp without time zone": "datetime", } + _GROUP_OPERATOR_SELECTION = [ + ("sum", "Sum"), + ("avg", "Average"), + ("min", "Minimum"), + ("max", "Maximum"), + ] + name = fields.Char(string="Name", required=True, readonly=True) sql_type = fields.Char( @@ -114,6 +121,13 @@ class BiSQLViewField(models.Model): help="For 'Many2one' Odoo field.\n" " Comodel of the field.", ) + group_operator = fields.Selection( + string="Group Operator", + selection=_GROUP_OPERATOR_SELECTION, + help="By default, Odoo will sum the values when grouping. If you wish " + "to alter the behaviour, choose an alternate Group Operator", + ) + # Constrains Section @api.constrains("is_index") def _check_index_materialized(self): diff --git a/bi_sql_editor/models/ir_model.py b/bi_sql_editor/models/ir_model.py new file mode 100644 index 00000000..e3d7ed1f --- /dev/null +++ b/bi_sql_editor/models/ir_model.py @@ -0,0 +1,9 @@ +from odoo import models + + +class IrModelFields(models.Model): + _inherit = "ir.model.fields" + + def _add_manual_fields(self, model): + super()._add_manual_fields(model) + self.env["bi.sql.view"].check_manual_fields(model) diff --git a/bi_sql_editor/readme/CONTRIBUTORS.rst b/bi_sql_editor/readme/CONTRIBUTORS.rst index 6837a2b2..1b4d1c03 100644 --- a/bi_sql_editor/readme/CONTRIBUTORS.rst +++ b/bi_sql_editor/readme/CONTRIBUTORS.rst @@ -1,4 +1,6 @@ * Sylvain LE GAL (https://twitter.com/legalsylvain) +* Richard deMeester, WilldooIT (http://www.willdooit.com/) +* David James, WilldooIT (http://www.willdooit.com/) * This module is highly inspired by the work of * Onestein: (http://www.onestein.nl/) diff --git a/bi_sql_editor/views/view_bi_sql_view.xml b/bi_sql_editor/views/view_bi_sql_view.xml index bbbd1a0b..f2b127ee 100644 --- a/bi_sql_editor/views/view_bi_sql_view.xml +++ b/bi_sql_editor/views/view_bi_sql_view.xml @@ -149,6 +149,11 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +